Skip to content

Commit

Permalink
merge: #220users API #218 리뷰 반영
Browse files Browse the repository at this point in the history
[refactor] users API #218 리뷰 반영
  • Loading branch information
kmi0817 authored Dec 3, 2023
2 parents e21e130 + 49d2c60 commit 56e6a66
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 62 deletions.
21 changes: 1 addition & 20 deletions BE/src/users/dto/update-user.dto.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,13 @@
import {
IsBoolean,
IsOptional,
IsString,
MaxLength,
MinLength,
} from 'class-validator';
import { IsOptional, IsString, MaxLength, MinLength } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';
import { Transform, TransformFnParams } from 'class-transformer';

export class UpdateUserDto {
@IsOptional()
@IsString()
@MinLength(1)
@MaxLength(14)
@ApiProperty({ example: '레몬', description: '변경할 사용자 이름' })
name: string;

@IsBoolean()
@Transform(({ value }: TransformFnParams) => value === 'true', {
toClassOnly: true,
})
@ApiProperty({
example: 'true',
description: '프로필 사진 기본 이미지 설정 여부',
})
isAvatarDeleted: boolean;
//deleteAvatar:boolean;

@IsOptional()
@ApiProperty({
required: false,
Expand Down
11 changes: 7 additions & 4 deletions BE/src/users/users.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ export class UsersController {
@ApiOperation({
summary: 'id에 해당하는 User 정보 반환',
description:
'id에 해당하는 User 정보를 반환합니다. avatar는 프로필 사진의 URL에 해당하는 값입니다.',
'id에 해당하는 User 정보를 반환합니다. avatar는 프로필 사진의 URL에 해당하는 값입니다.' +
'avatar 값이 null인 경우는 기본 프로필사진을 의미합니다.',
})
@ApiOkResponse({
description: 'OK',
Expand All @@ -50,7 +51,8 @@ export class UsersController {
@ApiOperation({
summary: 'id에 해당하는 User 정보 수정',
description:
'id에 해당하는 User 정보를 수정합니다. avatar는 새로운 프로필 사진의 URL에 해당하는 값입니다.',
'id에 해당하는 User 정보를 수정합니다. avatar는 새로운 프로필 사진의 URL에 해당하는 값입니다.' +
'avatar 값이 null인 경우는 기본 프로필사진을 의미합니다.',
})
@ApiOkResponse({
description: 'OK',
Expand All @@ -63,8 +65,9 @@ export class UsersController {
@ApiBody({
description:
'json과 함께 새로운 프로필 사진을 전송해주세요. ' +
'프로필사진 변경사항이 없을 경우 파일을 전송하지 않으시면 됩니다. ' +
'닉네임 변경사항이 없을 경우 name 필드를 생략해주시면 됩니다.',
'프로필사진을 기본 사진으로 변경할 경우 파일을 전송하지 않으시면 됩니다. ' +
'프로필 사진 변경이 없을 경우 기존 사진을 다시 보내주시면 됩니다. ' +
'닉네임 변경사항이 없을 경우 기존 name을 전송해주시면 됩니다.',
})
update(
@Req() request,
Expand Down
48 changes: 10 additions & 38 deletions BE/src/users/users.service.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
import {
BadRequestException,
Injectable,
InternalServerErrorException,
} from '@nestjs/common';
import { BadRequestException, Injectable } from '@nestjs/common';
import { UserInfoDto } from './dto/user-info.dto';
import { StorageService } from 'src/storage/storage.service';
import { UserRepository } from './users.repository';
Expand Down Expand Up @@ -45,8 +41,6 @@ export class UsersService {
const deleteResult = await this.userRepository.delete(id);
if (deleteResult.affected == 0) {
throw new BadRequestException('존재하지 않는 사용자 입니다.');
} else if (deleteResult.affected > 1) {
throw new InternalServerErrorException();
}
return true;
}
Expand All @@ -73,51 +67,29 @@ export class UsersService {
updateUserDto: UpdateUserDto,
newAvatarFile: Express.Multer.File
): Promise<UserInfoDto> {
const nameChange = 'name' in updateUserDto;
const deleteAvatar = updateUserDto.isAvatarDeleted;

if (!nameChange && !newAvatarFile && !deleteAvatar) {
throw new BadRequestException('변경 사항이 없습니다.');
}

if (deleteAvatar && newAvatarFile) {
throw new BadRequestException('요구사항이 충돌합니다.');
}

const name = updateUserDto.name;
const originalUserInfo = await this.userRepository.findById(id);

//이름 변경이 있는 경우
if (nameChange) {
if (originalUserInfo.name === updateUserDto.name) {
throw new BadRequestException('기존 닉네임과 동일합니다.');
}
const name = updateUserDto.name;
await this.userRepository.update(id, { name });
let updatedUserInfo = {};
if (originalUserInfo.name !== name) {
updatedUserInfo = { ...updatedUserInfo, name };
}

//프로필을 기본이미지로 변경하고 싶어 하는 경우
if (deleteAvatar) {
//이미지 삭제, avatar는 null
if (originalUserInfo.avatar !== null) {
await this.storageService.delete(originalUserInfo.avatar);
}
const avatar = null;
await this.userRepository.update(id, { avatar });
if (originalUserInfo.avatar !== null) {
await this.storageService.delete(originalUserInfo.avatar);
updatedUserInfo = { ...updatedUserInfo, avatar: null };
}

//새 프로필을 등록하고 싶어 하는 경우
if (newAvatarFile) {
if (originalUserInfo.avatar !== null) {
await this.storageService.delete(originalUserInfo.avatar);
}
const uploadResult = await this.storageService.upload(
`${id}/`,
newAvatarFile
);
const avatar = uploadResult.path;
await this.userRepository.update(id, { avatar });
updatedUserInfo = { ...updatedUserInfo, avatar };
}

await this.userRepository.update(id, updatedUserInfo);
return this.getUserInfoById(id);
}

Expand Down

0 comments on commit 56e6a66

Please sign in to comment.