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 { CreateLegalUserDto } from "./DTO/create-legal-user.dto"; import { CreateRealUserDto } from "./DTO/create-real-user.dto"; import { CreateRoleDto } from "./DTO/create-role.dto"; import { CreateCustomerDto } from "./DTO/create-user.dto"; import { SearchAdminQueryDto } from "./DTO/search-admins-query.dto"; import { SearchCustomersDto } from "./DTO/search-customers.dto"; import { SearchRolesQueryDto } from "./DTO/search-roles.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 { 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") @AuthGuards() export class UsersController { constructor(private usersService: UsersService) {} // @ApiOperation({ summary: "Get user profile" }) @Get("me") getMe(@UserDec("id") userId: string) { return this.usersService.getMe(userId); } // @ApiOperation({ summary: "Get user financial info" }) @Get("me/financial-info") getFinancialInfo(@UserDec("id") userId: string) { return this.usersService.getMyFinancialInfo(userId); } @ApiOperation({ summary: "Update user profile" }) @Patch("update-profile") updateProfile(@Body() updateProfileDto: UpdateProfileDto, @UserDec("id") userId: string) { return this.usersService.updateProfile(userId, updateProfileDto); } @ApiOperation({ summary: "change user email" }) @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" }) @Patch("change-phone") changePhone(@Body() changeDto: RequestOtpDto, @UserDec("id") userId: string) { return this.usersService.changePhone(userId, changeDto); } @ApiOperation({ summary: "Verify phone" }) @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" }) @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" }) @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" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("user-group") UserGroups() { return this.usersService.getUserGroups(); } @ApiOperation({ summary: "get all users ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get() Users() { return this.usersService.findAllUsers(); } @ApiOperation({ summary: "get all customers ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("customers") customers(@Query() queryDto: SearchCustomersDto) { return this.usersService.findAllCustomers(queryDto); } @ApiOperation({ summary: "get all customers ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("customers/:id") customer(@Param() paramDto: ParamDto) { return this.usersService.findOneCustomer(paramDto.id); } @ApiOperation({ summary: "get all admins ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("admins") getAdmins(@Query() queryDto: SearchAdminQueryDto) { return this.usersService.getAdmins(queryDto); } @ApiOperation({ summary: "create admin ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Post("admins") createAdmin(@Body() createDto: CreateAdminDto) { return this.usersService.createAdmin(createDto); } @ApiOperation({ summary: "get all permissions ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("permissions") getPermissions() { return this.usersService.getPermissions(); } @ApiOperation({ summary: "get all roles ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Get("roles") getRoles(@Query() queryDto: SearchRolesQueryDto) { return this.usersService.getRoles(queryDto); } @ApiOperation({ summary: "create role ==> admin route" }) @PermissionsDec(PermissionEnum.ADMINS, PermissionEnum.CUSTOMERS) @Post("roles") createRole(@Body() createDto: CreateRoleDto) { return this.usersService.createRole(createDto); } @ApiOperation({ summary: "Create real user data" }) @HttpCode(HttpStatus.CREATED) @Post("real-user") createRealUser(@Body() createDto: CreateRealUserDto, @UserDec("id") userId: string) { return this.usersService.createRealUserData(createDto, userId); } @ApiOperation({ summary: "Create legal user data" }) @HttpCode(HttpStatus.CREATED) @Post("legal-user") createLegalUser(@Body() createDto: CreateLegalUserDto, @UserDec("id") userId: string) { return this.usersService.createLegalUserData(createDto, userId); } @ApiOperation({ summary: "Create customer" }) @HttpCode(HttpStatus.CREATED) @Post("customer") createCustomer(@Body() createDto: CreateCustomerDto) { return this.usersService.createCustomer(createDto); } }