From 54bc5f9460271580dc38d2aedde95180652b32fa Mon Sep 17 00:00:00 2001 From: Chun Hyunwoo <1000chw@gmail.com> Date: Sun, 14 Jan 2024 20:07:31 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20User=20withdrawal=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/withdrawal-user-response.dto.ts | 6 ++++++ src/user/user.controller.ts | 13 +++++++++++++ src/user/user.converter.ts | 7 +++++++ src/user/user.service.ts | 8 ++++++++ 4 files changed, 34 insertions(+) create mode 100644 src/user/dto/response/withdrawal-user-response.dto.ts diff --git a/src/user/dto/response/withdrawal-user-response.dto.ts b/src/user/dto/response/withdrawal-user-response.dto.ts new file mode 100644 index 0000000..9758618 --- /dev/null +++ b/src/user/dto/response/withdrawal-user-response.dto.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class WithdrawalUserResponse { + @ApiProperty({ description: '회원 탈퇴 여부', example: true }) + isUserWithdraw: boolean; +} diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index 8c56937..4e836f9 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -105,4 +105,17 @@ export class UserController { GlobalResponseCode.OK, ); } + + @Post('withdrawal') + @UseGuards(JwtAuthGuard) + @ApiOperation({ + summary: '회원 탈퇴', + description: '현재 회원을 탈퇴시킵니다.', + }) + @ApiOkResponse({ type: FindingPasswordResponse, description: '임시 비밀번호 전송 완료' }) + @ApiBearerAuth() + async withdrawalUser(@ExtractPayload() userId: number) { + const userStatus = await this.userService.withdrawalUser(userId); + return BaseResponse.of(UserConverter.toWithdrawalUserResponse(userStatus)); + } } diff --git a/src/user/user.converter.ts b/src/user/user.converter.ts index d9e6885..c30d601 100644 --- a/src/user/user.converter.ts +++ b/src/user/user.converter.ts @@ -10,6 +10,7 @@ import { Password } from './entity/password'; import { UserReport } from './entity/user-report.entity'; import { User } from './entity/user.entity'; import { UserReportReason } from './enum/user-report-reason'; +import { WithdrawalUserResponse } from './dto/response/withdrawal-user-response.dto'; @Injectable() export class UserConverter implements OnModuleInit { @@ -57,4 +58,10 @@ export class UserConverter implements OnModuleInit { public static toFindingPasswordResponse(isPasswordSended: boolean): FindingPasswordResponse { return Builder(FindingPasswordResponse).isPasswordSended(isPasswordSended).build(); } + + public static toWithdrawalUserResponse(userStatus: User) { + return Builder(WithdrawalUserResponse) + .isUserWithdraw(userStatus.disabledAt ? true : false) + .build(); + } } diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 931a8d3..e706587 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -87,4 +87,12 @@ export class UserService { async sendEmail(request: FindingPasswordRequest, password: string): Promise { await this.mailService.sendMail(request.email, '[BookJam] 임시 비밀번호 안내', password); } + + async withdrawalUser(userId: number): Promise { + const user: User = await this.userRepository.findOneBy({ userId }); + user.disabledAt = new Date(); + await this.userRepository.update(userId, user); + + return user; + } }