diff --git a/src/events/events.controller.ts b/src/events/events.controller.ts index 3d21102..d763eac 100644 --- a/src/events/events.controller.ts +++ b/src/events/events.controller.ts @@ -13,7 +13,6 @@ import { ParseIntPipe, UploadedFile, UseInterceptors, - Query, } from '@nestjs/common'; import { EventsService } from './events.service'; import { CreateEventDto } from './dto/create-event.dto'; @@ -46,6 +45,7 @@ export class EventsController { private readonly awsS3Service: AwsS3Service ) {} + // 이벤트 생성 @Post() @UseGuards(JwtAuthGuard) // passport를 사용하여 인증 확인 @ApiBearerAuth() // Swagger 문서에 Bearer 토큰 인증 추가 @@ -57,6 +57,7 @@ export class EventsController { return this.eventsService.create(userId, createEventDto); } + // 이벤트 이미지 업로드 @Post('upload') @UseGuards(JwtAuthGuard) // passport를 사용하여 인증 확인 @ApiBearerAuth() // Swagger 문서에 Bearer 토큰 인증 추가 @@ -89,6 +90,7 @@ export class EventsController { }; } + // 이벤트 전체 조회 @Get() @ApiOperation({ summary: 'Event 전체 조회' }) @ApiOkResponse({ type: EventEntity, isArray: true }) @@ -107,6 +109,7 @@ export class EventsController { return event; } + // 이벤트 상세 조회 @Get(':eventId') @ApiOperation({ summary: 'Event 상세 조회' }) @ApiOkResponse({ type: EventEntity }) @@ -128,6 +131,7 @@ export class EventsController { }; } + // 이벤트 참가 신청 @Put(':eventId/join') @UseGuards(JwtAuthGuard) // passport를 사용하여 인증 확인 @ApiBearerAuth() // Swagger 문서에 Bearer 토큰 인증 추가 @@ -144,17 +148,18 @@ export class EventsController { const isJoin = await this.eventsService.isJoin(eventId, userId); if (!isJoin) { - this.eventsService.join(eventId, userId); - this.eventsService.createRsvpLog(eventId, userId, 'applied'); // 로그 생성 - return `${eventId}번 모임 참석 신청`; + this.eventsService.join(+eventId, userId); + this.eventsService.createRsvpLog(eventId, userId, 'applied'); // 참가 신청 로그 생성 + return `${eventId}번 모임 참석 신청!`; } if (isJoin) { this.eventsService.cancelJoin(isJoin.guestEventId); - this.eventsService.createRsvpLog(eventId, userId, 'canceled'); // 로그 생성 - return `${eventId}번 모임 참석 취소 `; + this.eventsService.createRsvpLog(eventId, userId, 'canceled'); // 참가 취소 로그 생성 + return `${eventId}번 모임 신청 취소!`; } } + // 이벤트 수정 @Patch(':eventId') @ApiOperation({ summary: 'Host로서 Event 수정' }) @ApiOkResponse({ type: EventEntity }) @@ -168,6 +173,7 @@ export class EventsController { return this.eventsService.update(eventId, updateEventDto); } + // 이벤트 삭제 @Delete(':eventId') @ApiOperation({ summary: 'Host로서 Event 삭제' }) @ApiOkResponse({ description: 'isDeleted: true / soft Delete' }) @@ -178,7 +184,7 @@ export class EventsController { return this.eventsService.remove(eventId); } - // 북마크 추가 + // 관심있는 이벤트 북마크 추가 @Post(':eventId/bookmark') @UseGuards(JwtAuthGuard) @ApiBearerAuth() @@ -191,7 +197,7 @@ export class EventsController { return this.eventsService.addBookmark(eventId, userId, 'bookmarked'); } - // 북마크 제거 + // 관심있는 이벤트 북마크 제거 @Delete(':eventId/bookmark') @UseGuards(JwtAuthGuard) @ApiBearerAuth() diff --git a/src/events/events.service.ts b/src/events/events.service.ts index 14056ab..7e6c04e 100644 --- a/src/events/events.service.ts +++ b/src/events/events.service.ts @@ -40,6 +40,7 @@ export class EventsService { return file.path; } + // 이벤트 전체 조회 findAll() { return this.prisma.event.findMany({ where: { @@ -68,6 +69,7 @@ export class EventsService { }); } + // 이벤트 상세 조회 async findOne(eventId: number) { const event = await this.prisma.event.findUnique({ where: { eventId, isDeleted: false }, @@ -103,6 +105,7 @@ export class EventsService { return event; } + // 이벤트 조회 로그 async createViewLog(eventId: number) { await this.prisma.viewlog.create({ data: { @@ -112,6 +115,7 @@ export class EventsService { }); } + // 이벤트 참가여부 확인 async isJoin(eventId: number, userId: number) { const isJoin = await this.prisma.guestEvent.findFirst({ where: { @@ -122,6 +126,7 @@ export class EventsService { return isJoin; } + // 이벤트 참가 신청 async join(eventId: number, userId: number) { await this.prisma.guestEvent.create({ data: { @@ -131,12 +136,14 @@ export class EventsService { }); } + // 이벤트 참가 취소 async cancelJoin(guestEventId: number) { await this.prisma.guestEvent.delete({ where: { guestEventId }, }); } + // 이벤트 신청/취소 로그 async createRsvpLog(eventId: number, userId: number, status: string) { await this.prisma.rsvpLog.create({ data: { @@ -148,6 +155,7 @@ export class EventsService { }); } + // 이벤트 수정 update(eventId: number, updateEventDto: UpdateEventDto) { return this.prisma.event.update({ where: { eventId }, @@ -155,6 +163,7 @@ export class EventsService { }); } + // 이벤트 삭제 remove(eventId: number) { return this.prisma.event.update({ where: { eventId }, @@ -164,7 +173,7 @@ export class EventsService { }); } - // 북마크 추가 + // 관심있는 북마크 추가 async addBookmark(eventId: number, userId: number, status: string) { return await this.prisma.eventBookmark.create({ data: { @@ -176,9 +185,8 @@ export class EventsService { }); } - // 북마크 제거 + // 관심있는 이벤트 북마크 제거 async removeBookmark(eventId: number, userId: number, status: string) { - // 먼저 eventBookmarkId를 찾습니다. const eventBookmark = await this.prisma.eventBookmark.findFirst({ where: { EventId: eventId, diff --git a/src/users/dto/update-user.dto.ts b/src/users/dto/update-user.dto.ts index 86f4333..225be6f 100644 --- a/src/users/dto/update-user.dto.ts +++ b/src/users/dto/update-user.dto.ts @@ -1,6 +1,5 @@ // src/users/dto/update-user.dto.ts -import { ApiProperty, PartialType } from '@nestjs/swagger'; -import { CreateUserDto } from './create-user.dto'; +import { ApiProperty } from '@nestjs/swagger'; import { IsNotEmpty, IsString, Matches, MaxLength, MinLength } from 'class-validator'; export class UpdateUserDto { @@ -38,8 +37,14 @@ export class UpdateUserDto { @IsString() @IsNotEmpty() @ApiProperty({ - description: 'password', + description: 'password confirm', example: 'abc123456789!', }) confirmPassword: string; + + @ApiProperty({ + description: 'nickname changed', + example: false, + }) + nameChanged: boolean; } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index c199b15..e0c2fbf 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -1,11 +1,11 @@ /* eslint-disable prettier/prettier */ // src/users/users.controller.ts -import { Controller, Req, Get, Post, Body, Patch, Param, Delete, NotFoundException, UseGuards, Res } from '@nestjs/common'; +import { Controller, Req, Get, Post, Body, Patch, Param, Delete, NotFoundException, UseGuards } from '@nestjs/common'; import { UsersService } from './users.service'; import { CreateUserDto } from './dto/create-user.dto'; import { UpdateUserDto } from './dto/update-user.dto'; import { DeleteUserDto } from './dto/delete-user.dto'; -import { ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiResponse, ApiTags, ApiBody, ApiConsumes } from '@nestjs/swagger'; +import { ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiResponse, ApiTags, ApiBody, ApiConsumes, ApiProperty } from '@nestjs/swagger'; import { UserEntity } from './entities/user.entity'; import { JwtAuthGuard } from 'src/auth/guards/jwt-auth.guard'; import { User } from '@prisma/client'; diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 085daf0..c59fd6b 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -105,9 +105,8 @@ export class UsersService { // 5. user 정보 수정한다. async update(id: number, updateUserDto: UpdateUserDto) { - // console.log('updateUserDto in users.service:', updateUserDto); - const { nickname, intro, confirmPassword } = updateUserDto; - + const { nickname, intro, confirmPassword, nameChanged } = updateUserDto; + const user = await this.prisma.user.findUnique({ where: { userId: id }, }); @@ -115,32 +114,52 @@ export class UsersService { throw new BadRequestException('유저 정보가 존재하지 않습니다.'); } - // 중복된 닉네임 확인 - const existingNickname = await this.prisma.userDetail.findUnique({ - where: { nickname }, + + if (!nameChanged) { + // nameChanged == false 면 닉네임에는 변화가 없다는 것임으로 닉네임을 제외한 나머지 정보만 업데이트 + // 패스워드, 패스워드 확인 일치 여부 확인 + const isPasswordMatching = await bcrypt.compare(confirmPassword, user.password); + if (!isPasswordMatching) { + throw new BadRequestException('패스워드가 일치하지 않습니다.'); + } + + // userdetail page 자기소개 업데이트 + const updatedUser = await this.prisma.userDetail.update({ + where: { userDetailId: user.userId}, + data: { + intro: intro, + }, }); - if (existingNickname) { - throw new ConflictException('이미 존재하는 닉네임입니다.'); - } - - // 패스워드, 패스워드 확인 일치 여부 확인 - const isPasswordMatching = await bcrypt.compare(confirmPassword, user.password); - if (!isPasswordMatching) { - throw new BadRequestException('패스워드가 일치하지 않습니다.'); + return updatedUser; + } - - - // userdetail page 업데이트 - const updatedUser = await this.prisma.userDetail.update({ - where: { userDetailId: user.userId}, + else { + // nameChanged = true 면 닉네임을 바꿨다는 거니까 닉네임을 포함해서 업데이트 + // 중복된 닉네임 확인 + const existingNickname = await this.prisma.userDetail.findUnique({ + where: { nickname }, + }); + + if (existingNickname) { + throw new ConflictException('이미 존재하는 닉네임입니다.'); + } + + // 패스워드, 패스워드 확인 일치 여부 확인 + const isPasswordMatching = await bcrypt.compare(confirmPassword, user.password); + if (!isPasswordMatching) { + throw new BadRequestException('패스워드가 일치하지 않습니다.'); + } + + // userdetail page 닉네임, 자기소개, 업데이트 + const updatedUser = await this.prisma.userDetail.update({ + where: { userDetailId: user.userId}, data: { intro: intro, nickname: nickname }, - }); - + }); return updatedUser; - + } } // 6. 회원 탈퇴를 한다.