import { Body, Controller, Delete, Get, Param, Patch, Post, Query, UseInterceptors } from "@nestjs/common"; import { ApiOperation } from "@nestjs/swagger"; import { CompanyListPublicQueryDto, CompanyListQueryDto } from "./DTO/company-list-query.dto"; import { ApproveCompanyRequestDto, CreateCompanyDto, CreateCompanyRequestDto } from "./DTO/create-company.dto"; import { UpdateCompanyDto } from "./DTO/update-company.dto"; import { CompaniesService } from "./services/companies.service"; import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; import { BusinessDec } from "../../common/decorators/business.decorator"; import { UserDec } from "../../common/decorators/user.decorator"; import { ParamDto } from "../../common/DTO/param.dto"; import { BusinessInterceptor } from "../../core/interceptors/business.interceptor"; import { Business } from "../businesses/entities/business.entity"; import { User } from "../users/entities/user.entity"; @Controller("companies") @UseInterceptors(BusinessInterceptor) export class CompaniesController { constructor(private readonly companiesService: CompaniesService) {} @Post() @AuthGuards() @ApiOperation({ summary: "create company (admin)" }) create(@Body() createCompanyDto: CreateCompanyDto, @BusinessDec() business: Business) { return this.companiesService.create(createCompanyDto, business); } @Patch(":id") @AuthGuards() @ApiOperation({ summary: "update company (admin)" }) update(@Param() paramDto: ParamDto, @Body() updateCompanyDto: UpdateCompanyDto, @BusinessDec("id") businessId: string) { return this.companiesService.updateCompanyById(paramDto.id, updateCompanyDto, businessId); } @Delete(":id") @AuthGuards() @ApiOperation({ summary: "delete company (admin)" }) delete(@Param() paramDto: ParamDto, @BusinessDec("id") businessId: string) { return this.companiesService.deleteCompanyById(paramDto.id, businessId); } @Get("list") @AuthGuards() @ApiOperation({ summary: "get companies list (admin)" }) getCompaniesList(@Query() query: CompanyListQueryDto, @BusinessDec("id") businessId: string) { return this.companiesService.getCompaniesList(query, businessId); } @Get("list/public") @ApiOperation({ summary: "get companies list (public)" }) getCompaniesListPublic(@Query() queryDto: CompanyListPublicQueryDto, @BusinessDec("id") businessId: string) { return this.companiesService.getCompaniesListPublic(queryDto, businessId); } @Get("public/:id") @ApiOperation({ summary: "get company by id (public)" }) getCompanyByIdPublic(@Param() paramDto: ParamDto, @BusinessDec("id") businessId: string) { return this.companiesService.getCompanyByIdPublic(paramDto.id, businessId); } @Get(":id") @AuthGuards() @ApiOperation({ summary: "get company by id" }) get(@Param() paramDto: ParamDto, @BusinessDec("id") businessId: string) { return this.companiesService.getCompanyById(paramDto.id, businessId); } @Patch(":id/toggle-status") @AuthGuards() @ApiOperation({ summary: "toggle company status (admin)" }) toggleStatus(@Param() paramDto: ParamDto, @BusinessDec("id") businessId: string) { return this.companiesService.toggleStatus(paramDto.id, businessId); } @Post("/company-requests") @AuthGuards() @ApiOperation({ summary: "submit company registration request (user)" }) createCompanyRequest(@Body() createDto: CreateCompanyRequestDto, @UserDec() user: User, @BusinessDec() business: Business) { return this.companiesService.createCompanyRequest(createDto, user, business); } @Get("/company-requests/user") @ApiOperation({ summary: "get all company registration requests (user)" }) getCompanyRequestsUser(@UserDec("id") userId: string, @BusinessDec("id") businessId: string) { return this.companiesService.getCompanyRequestsUser(userId, businessId); } @Get("/company-requests") @AuthGuards() @ApiOperation({ summary: "get all company registration requests (admin)" }) getCompanyRequests(@BusinessDec("id") businessId: string) { return this.companiesService.getCompanyRequests(businessId); } @Patch("/company-requests/:id/approve") @AuthGuards() @ApiOperation({ summary: "approve/reject company registration request (admin)" }) approveCompanyRequest(@Param() paramDto: ParamDto, @Body() approveDto: ApproveCompanyRequestDto, @BusinessDec("id") businessId: string) { return this.companiesService.approveCompanyRequest(paramDto.id, approveDto, businessId); } }