import { ControllerRoute } from '@app/common/constants/controller-route'; import { EnableDisableStatusEnum } from '@app/common/constants/days.enum'; import { RoleType } from '@app/common/constants/role.type.enum'; import { BaseResponseDto } from '@app/common/dto/base.response.dto'; import { Body, Controller, Delete, Get, HttpStatus, Param, Patch, Put, Req, UseGuards, } from '@nestjs/common'; import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger'; import { CheckProfilePictureGuard } from 'src/guards/profile.picture.guard'; import { SuperAdminRoleGuard } from 'src/guards/super.admin.role.guard'; import { JwtAuthGuard } from '../../../libs/common/src/guards/jwt.auth.guard'; import { UpdateNameDto, UpdateProfilePictureDataDto, UpdateRegionDataDto, UpdateTimezoneDataDto, } from '../dtos'; import { UserService } from '../services/user.service'; @ApiTags('User Module') @Controller({ version: EnableDisableStatusEnum.ENABLED, path: ControllerRoute.USER.ROUTE, }) export class UserController { constructor(private readonly userService: UserService) {} @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Get(':userUuid') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.GET_USER_DETAILS_SUMMARY, description: ControllerRoute.USER.ACTIONS.GET_USER_DETAILS_DESCRIPTION, }) async getUserDetailsByUserUuid(@Param('userUuid') userUuid: string) { return await this.userService.getUserDetailsByUserUuid(userUuid); } @ApiBearerAuth() @UseGuards(JwtAuthGuard, CheckProfilePictureGuard) @Put('/profile-picture/:userUuid') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.UPDATE_PROFILE_PICTURE_SUMMARY, description: ControllerRoute.USER.ACTIONS.UPDATE_PROFILE_PICTURE_DESCRIPTION, }) async updateProfilePictureByUserUuid( @Param('userUuid') userUuid: string, @Body() updateProfilePictureDataDto: UpdateProfilePictureDataDto, ) { const userData = await this.userService.updateProfilePictureByUserUuid( userUuid, updateProfilePictureDataDto, ); return { statusCode: HttpStatus.CREATED, success: true, message: 'Profile picture updated successfully', data: userData, }; } @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Put('/region/:userUuid') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.UPDATE_REGION_SUMMARY, description: ControllerRoute.USER.ACTIONS.UPDATE_REGION_DESCRIPTION, }) async updateRegionByUserUuid( @Param('userUuid') userUuid: string, @Body() updateRegionDataDto: UpdateRegionDataDto, ) { const userData = await this.userService.updateRegionByUserUuid( userUuid, updateRegionDataDto, ); return { statusCode: HttpStatus.CREATED, success: true, message: 'Region updated successfully', data: userData, }; } @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Put('/timezone/:userUuid') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.UPDATE_TIMEZONE_SUMMARY, description: ControllerRoute.USER.ACTIONS.UPDATE_TIMEZONE_DESCRIPTION, }) async updateTimezoneByUserUuid( @Param('userUuid') userUuid: string, @Body() updateTimezoneDataDto: UpdateTimezoneDataDto, ) { const userData = await this.userService.updateTimezoneByUserUuid( userUuid, updateTimezoneDataDto, ); return { statusCode: HttpStatus.CREATED, success: true, message: 'Timezone updated successfully', data: userData, }; } @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Put('/name/:userUuid') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.UPDATE_NAME_SUMMARY, description: ControllerRoute.USER.ACTIONS.UPDATE_NAME_DESCRIPTION, }) async updateNameByUserUuid( @Param('userUuid') userUuid: string, @Body() updateNameDto: UpdateNameDto, ) { const userData = await this.userService.updateNameByUserUuid( userUuid, updateNameDto, ); return { statusCode: HttpStatus.CREATED, success: true, message: 'Name updated successfully', data: userData, }; } @ApiBearerAuth() @UseGuards(SuperAdminRoleGuard) @Delete('/:userUuid') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.DELETE_USER_SUMMARY, description: ControllerRoute.USER.ACTIONS.DELETE_USER_DESCRIPTION, }) async userDelete(@Param('userUuid') userUuid: string) { await this.userService.deleteUser(userUuid); return { statusCode: HttpStatus.OK, data: { userUuid, }, message: 'User deleted successfully', }; } @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Delete('') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.DELETE_USER_PROFILE_SUMMARY, description: ControllerRoute.USER.ACTIONS.DELETE_USER_PROFILE_DESCRIPTION, }) async deleteUserProfile(@Req() req: Request) { const userUuid = req['user']?.userUuid; const userRole = req['user']?.role; if (!userUuid || (userRole && userRole == RoleType.SUPER_ADMIN)) { throw { statusCode: HttpStatus.UNAUTHORIZED, message: 'Unauthorized', }; } await this.userService.deleteUserProfile(userUuid); return { statusCode: HttpStatus.OK, data: { userId: userUuid, }, message: 'User deleted successfully', }; } @ApiBearerAuth() @UseGuards(JwtAuthGuard) @Patch('agreements/web/:userUuid') @ApiOperation({ summary: ControllerRoute.USER.ACTIONS.UPDATE_USER_WEB_AGREEMENT_SUMMARY, description: ControllerRoute.USER.ACTIONS.UPDATE_USER_WEB_AGREEMENT_DESCRIPTION, }) async acceptWebAgreement( @Param('userUuid') userUuid: string, ): Promise { return this.userService.acceptWebAgreement(userUuid); } }