diff --git a/src/junior/controllers/junior.controller.ts b/src/junior/controllers/junior.controller.ts index 07fb95b..ebd9ff0 100644 --- a/src/junior/controllers/junior.controller.ts +++ b/src/junior/controllers/junior.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Get, Param, Post, Query, UseGuards } from '@nestjs/common'; +import { Body, Controller, Get, Param, Patch, Post, Query, UseGuards } from '@nestjs/common'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { Roles } from '~/auth/enums'; import { IJwtPayload } from '~/auth/interfaces'; @@ -8,7 +8,7 @@ import { ApiDataPageResponse, ApiDataResponse, ApiLangRequestHeader } from '~/co import { PageOptionsRequestDto } from '~/core/dtos'; import { CustomParseUUIDPipe } from '~/core/pipes'; import { ResponseFactory } from '~/core/utils'; -import { CreateJuniorRequestDto, SetThemeRequestDto } from '../dtos/request'; +import { CreateJuniorRequestDto, SetThemeRequestDto, UpdateJuniorRequestDto } from '../dtos/request'; import { JuniorResponseDto, QrCodeValidationResponseDto, ThemeResponseDto } from '../dtos/response'; import { JuniorService } from '../services'; @@ -59,6 +59,20 @@ export class JuniorController { return ResponseFactory.data(new JuniorResponseDto(junior)); } + @Patch(':juniorId') + @UseGuards(RolesGuard) + @AllowedRoles(Roles.GUARDIAN) + @ApiDataResponse(JuniorResponseDto) + async updateJunior( + @AuthenticatedUser() user: IJwtPayload, + @Param('juniorId', CustomParseUUIDPipe) juniorId: string, + @Body() body: UpdateJuniorRequestDto, + ) { + const junior = await this.juniorService.updateJunior(juniorId, body, user.sub); + + return ResponseFactory.data(new JuniorResponseDto(junior)); + } + @Post('set-theme') @UseGuards(RolesGuard) @AllowedRoles(Roles.JUNIOR) diff --git a/src/junior/dtos/request/index.ts b/src/junior/dtos/request/index.ts index da79731..08e7612 100644 --- a/src/junior/dtos/request/index.ts +++ b/src/junior/dtos/request/index.ts @@ -1,2 +1,3 @@ export * from './create-junior.request.dto'; export * from './set-theme.request.dto'; +export * from './update-junior.request.dto'; diff --git a/src/junior/dtos/request/update-junior.request.dto.ts b/src/junior/dtos/request/update-junior.request.dto.ts new file mode 100644 index 0000000..c9054b3 --- /dev/null +++ b/src/junior/dtos/request/update-junior.request.dto.ts @@ -0,0 +1,6 @@ +import { OmitType, PartialType } from '@nestjs/mapped-types'; +import { CreateJuniorRequestDto } from './create-junior.request.dto'; + +export class UpdateJuniorRequestDto extends PartialType( + OmitType(CreateJuniorRequestDto, ['cardColor', 'cardPin'] as const), +) {} diff --git a/src/junior/services/junior.service.ts b/src/junior/services/junior.service.ts index 50586c0..24432fd 100644 --- a/src/junior/services/junior.service.ts +++ b/src/junior/services/junior.service.ts @@ -9,7 +9,7 @@ import { DocumentService, OciService } from '~/document/services'; import { UserType } from '~/user/enums'; import { UserService } from '~/user/services'; import { UserTokenService } from '~/user/services/user-token.service'; -import { CreateJuniorRequestDto, SetThemeRequestDto } from '../dtos/request'; +import { CreateJuniorRequestDto, SetThemeRequestDto, UpdateJuniorRequestDto } from '../dtos/request'; import { Junior } from '../entities'; import { JuniorRepository } from '../repositories'; import { QrcodeService } from './qrcode.service'; @@ -85,6 +85,42 @@ export class JuniorService { return junior; } + async updateJunior(juniorId: string, body: UpdateJuniorRequestDto, guardianId: string) { + this.logger.log(`Updating junior ${juniorId}`); + const junior = await this.findJuniorById(juniorId, false, guardianId); + if (body.profilePictureId) { + junior.customer.user.profilePictureId = body.profilePictureId; + } + if (body.firstName) { + junior.customer.user.firstName = body.firstName; + junior.customer.firstName = body.firstName; + } + if (body.lastName) { + junior.customer.user.lastName = body.lastName; + junior.customer.lastName = body.lastName; + } + if (body.email) { + const existingUser = await this.userService.findUser({ email: body.email }); + if (existingUser && existingUser.id !== junior.customer.user.id) { + this.logger.error(`User with email ${body.email} already exists`); + throw new BadRequestException('USER.ALREADY_EXISTS'); + } + junior.customer.user.email = body.email; + } + + if (body.dateOfBirth) { + junior.customer.dateOfBirth = body.dateOfBirth; + } + if (body.relationship) { + junior.relationship = body.relationship; + } + console.log('++++++'); + + await Promise.all([junior.save(), junior.customer.user.save(), junior.customer.save()]); + this.logger.log(`Junior ${juniorId} updated successfully`); + return junior; + } + @Transactional() async setTheme(body: SetThemeRequestDto, juniorId: string) { this.logger.log(`Setting theme for junior ${juniorId}`);