From 849c1af75fa187ac58bbec377ba200a3640019b9 Mon Sep 17 00:00:00 2001 From: crazyoptimist Date: Mon, 3 Jun 2024 03:52:35 -0500 Subject: [PATCH] feat: update user with roles --- src/modules/user/role.entity.ts | 2 ++ src/modules/user/user.dto.ts | 12 +++++++++++- src/modules/user/user.service.ts | 33 ++++++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/modules/user/role.entity.ts b/src/modules/user/role.entity.ts index 29d9de9..0944c3f 100644 --- a/src/modules/user/role.entity.ts +++ b/src/modules/user/role.entity.ts @@ -1,10 +1,12 @@ import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; +import { Exclude } from 'class-transformer'; @Entity({ name: 'roles', }) export class Role { @PrimaryGeneratedColumn() + @Exclude() id: number; @Column({ length: 50 }) diff --git a/src/modules/user/user.dto.ts b/src/modules/user/user.dto.ts index a549948..96648c6 100644 --- a/src/modules/user/user.dto.ts +++ b/src/modules/user/user.dto.ts @@ -1,5 +1,6 @@ import { ApiPropertyOptional } from '@nestjs/swagger'; -import { Allow } from 'class-validator'; +import { Allow, IsEnum, ValidateIf } from 'class-validator'; +import { RoleEnum } from './role.entity'; export class UpdateUserDto { @ApiPropertyOptional() @@ -9,4 +10,13 @@ export class UpdateUserDto { @ApiPropertyOptional() @Allow() lastName: string; + + @ApiPropertyOptional({ + enum: RoleEnum, + isArray: true, + default: [RoleEnum.User], + }) + @ValidateIf((obj: UpdateUserDto) => obj.roles && obj.roles.length != 0) + @IsEnum(RoleEnum, { each: true }) + roles: RoleEnum[]; } diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index d0df3ad..e00c13b 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -4,7 +4,7 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository, SelectQueryBuilder } from 'typeorm'; +import { In, Repository, SelectQueryBuilder } from 'typeorm'; import { User } from './user.entity'; import { SignupDto } from '@modules/auth/dto/signup.dto'; import { UpdateUserDto } from './user.dto'; @@ -13,12 +13,15 @@ import { PaginationParam, SortParam, } from '@app/utils/query-param.util'; +import { Role } from './role.entity'; @Injectable() export class UserService { constructor( @InjectRepository(User) private readonly userRepository: Repository, + @InjectRepository(Role) + private readonly roleRepository: Repository, ) {} async create(signupDto: SignupDto) { @@ -107,7 +110,33 @@ export class UserService { } async update(id: number, dto: UpdateUserDto) { - return await this.userRepository.update(id, dto); + const isUserExists = await this.userRepository.exists({ where: { id } }); + if (!isUserExists) { + throw new NotFoundException(); + } + + let { roles: roleNames, ...partialEntity } = dto; + + let roles: Role[] = []; + if (dto.roles && dto.roles.length > 0) { + roles = await this.roleRepository.findBy({ + name: In(roleNames), + }); + } + + const updateDto = + roles.length > 0 + ? { + ...partialEntity, + roles, + id, + } + : { + ...partialEntity, + id, + }; + + return await this.userRepository.save(updateDto); } async delete(id: number) {