import { Body, Controller, Get, HttpCode, HttpStatus, Param, Patch, Post, Query, Res } from "@nestjs/common"; import { ApiOperation, ApiTags } from "@nestjs/swagger"; import { FastifyReply } from "fastify"; import { ChangeEmailDto } from "./DTO/change-email.dto"; import { CheckValidityDTO } from "./DTO/check-validity.dto"; import { CreateAdminDto } from "./DTO/create-admin.dto"; import { CreateCustomerDto } from "./DTO/create-customer.dto"; import { CreateLegalUserDto } from "./DTO/create-legal-user.dto"; import { CreateRealUserDto } from "./DTO/create-real-user.dto"; import { CreateRoleDto } from "./DTO/create-role.dto"; import { SearchAdminQueryDto } from "./DTO/search-admins-query.dto"; import { SearchCustomersDto } from "./DTO/search-customers.dto"; import { SearchRolesQueryDto } from "./DTO/search-roles.dto"; import { UpdateCustomerDto } from "./DTO/update-customer.dto"; import { UpdateProfileDto } from "./DTO/update-profile.dto"; import { CreateUserGroupDto } from "./DTO/user-group.dto"; import { EmailVerifyQueryDto } from "./DTO/verify-email-query.dto"; import { PermissionEnum } from "./enums/permission.enum"; import { AdminsService } from "./providers/admins.service"; import { CustomersService } from "./providers/customers.service"; import { UsersService } from "./providers/users.service"; import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; import { PermissionsDec } from "../../common/decorators/permission.decorator"; import { UserDec } from "../../common/decorators/user.decorator"; import { ParamDto } from "../../common/DTO/param.dto"; import { RequestOtpDto } from "../auth/DTO/request-otp.dto"; import { VerifyOtpDto } from "../auth/DTO/verify-otp.dto"; @Controller("users") @ApiTags("users") export class UsersController { constructor( private readonly usersService: UsersService, private readonly adminsService: AdminsService, private readonly customersService: CustomersService, ) {} //----------------------- user ----------------------- @ApiOperation({ summary: "Get user profile" }) @AuthGuards() @Get("me") getMe(@UserDec("id") userId: string) { return this.usersService.getMe(userId); } @ApiOperation({ summary: "Get legal user data" }) @AuthGuards() @Get("legal") getLegalUserData(@UserDec("id") userId: string) { return this.usersService.getLegalUserData(userId); } @ApiOperation({ summary: "Get real user data" }) @AuthGuards() @Get("real") getRealUserData(@UserDec("id") userId: string) { return this.usersService.getRealUserData(userId); } @ApiOperation({ summary: "Create real user data ==> user route" }) @AuthGuards() @Post("real") createRealUser(@Body() createDto: CreateRealUserDto, @UserDec("id") userId: string) { return this.customersService.createRealUserData(createDto, userId); } @ApiOperation({ summary: "Create legal user data ==> user route" }) @AuthGuards() @Post("legal") createLegalUser(@Body() createDto: CreateLegalUserDto, @UserDec("id") userId: string) { return this.customersService.createLegalUserData(createDto, userId); } //----------------------- profile ----------------------- @ApiOperation({ summary: "Update user profile" }) @AuthGuards() @Patch("update-profile") updateProfile(@Body() updateProfileDto: UpdateProfileDto, @UserDec("id") userId: string) { return this.usersService.updateProfile(userId, updateProfileDto); } @ApiOperation({ summary: "change user email" }) @AuthGuards() @Patch("change-email") changeEmail(@Body() changeEmailDto: ChangeEmailDto, @UserDec("id") userId: string) { return this.usersService.changeEmail(userId, changeEmailDto); } @ApiOperation({ summary: "Verify email" }) @Get("verify-email") verifyEmail(@Query() queryDto: EmailVerifyQueryDto, @Res({ passthrough: true }) rep: FastifyReply) { return this.usersService.verifyEmail(queryDto, rep); } @ApiOperation({ summary: "change user phone" }) @AuthGuards() @Patch("change-phone") changePhone(@Body() changeDto: RequestOtpDto, @UserDec("id") userId: string) { return this.usersService.changePhone(userId, changeDto); } @ApiOperation({ summary: "Verify phone" }) @AuthGuards() @HttpCode(HttpStatus.OK) @Patch("verify-phone") verifyPhone(@Body() verifyOtpDto: VerifyOtpDto, @UserDec("id") userId: string) { return this.usersService.verifyPhone(verifyOtpDto, userId); } // @ApiOperation({ summary: "Check validity of user field" }) @AuthGuards() @HttpCode(HttpStatus.OK) @Post("check-validity") checkValidity(@Body() checkValidityDto: CheckValidityDTO, @UserDec("id") userId: string) { return this.usersService.checkValidity(checkValidityDto, userId); } @ApiOperation({ summary: "Create user group ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Post("user-group") createUserGroup(@Body() createDto: CreateUserGroupDto) { return this.usersService.createUserGroup(createDto); } @ApiOperation({ summary: "get all user group ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("user-group") UserGroups() { return this.usersService.getUserGroups(); } @ApiOperation({ summary: "get all users ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get() getUsers() { return this.usersService.findAllUsers(); } //----------------------- customer ----------------------- @ApiOperation({ summary: "Create customer" }) @AuthGuards() @HttpCode(HttpStatus.CREATED) @Post("customers") createCustomer(@Body() createDto: CreateCustomerDto) { return this.customersService.createCustomer(createDto); } @ApiOperation({ summary: "Update customer" }) @AuthGuards() @Patch("customers/:id") updateCustomer(@Param() paramDto: ParamDto, @Body() updateDto: UpdateCustomerDto) { return this.customersService.updateCustomer(paramDto.id, updateDto); } @ApiOperation({ summary: "get customers ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("customers") getCustomers(@Query() queryDto: SearchCustomersDto) { return this.customersService.getCustomers(queryDto); } @ApiOperation({ summary: "get customers by id ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("customers/:id") getCustomerById(@Param() paramDto: ParamDto) { return this.customersService.getCustomerById(paramDto.id); } //----------------------- admin ----------------------- @ApiOperation({ summary: "get all admins ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("admins") getAdmins(@Query() queryDto: SearchAdminQueryDto) { return this.adminsService.getAdmins(queryDto); } @ApiOperation({ summary: "create admin ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Post("admins") createAdmin(@Body() createDto: CreateAdminDto) { return this.adminsService.createAdmin(createDto); } @ApiOperation({ summary: "get admin permissions" }) @AuthGuards() @Get("admin-permissions") getAdminPermissions(@UserDec("id") userId: string) { return this.adminsService.getAdminPermissions(userId); } @ApiOperation({ summary: "get all permissions ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("permissions") getPermissions() { return this.adminsService.getPermissions(); } @ApiOperation({ summary: "get all roles ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("roles") getRoles(@Query() queryDto: SearchRolesQueryDto) { return this.adminsService.getRoles(queryDto); } @ApiOperation({ summary: "create role ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Post("roles") createRole(@Body() createDto: CreateRoleDto) { return this.adminsService.createRole(createDto); } }