Skip to content

Commit

Permalink
Merge pull request #45 from LocalMingle/dev
Browse files Browse the repository at this point in the history
[완료] 마이페이지 - 자기소개 및 닉네임 수정 nameChanged 로직 추가
  • Loading branch information
erickimme authored Oct 19, 2023
2 parents 91ef7e6 + 8da5977 commit e0a4818
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 39 deletions.
23 changes: 14 additions & 9 deletions src/events/events.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import {
ParseIntPipe,
UploadedFile,
UseInterceptors,
Query,
} from '@nestjs/common';
import { EventsService } from './events.service';
import { CreateEventDto } from './dto/create-event.dto';
Expand Down Expand Up @@ -46,18 +45,19 @@ export class EventsController {
private readonly awsS3Service: AwsS3Service
) {}

// 이벤트 생성
@Post()
@UseGuards(JwtAuthGuard) // passport를 사용하여 인증 확인
@ApiBearerAuth() // Swagger 문서에 Bearer 토큰 인증 추가
@ApiOperation({ summary: '호스트로 Event 생성' })
@ApiCreatedResponse({ type: EventEntity })
create(@Req() req: RequestWithUser, @Body() createEventDto: CreateEventDto) {
console.log("here", createEventDto)
const { userId } = req.user; // request에 user 객체가 추가되었고 userId에 값 할당

return this.eventsService.create(userId, createEventDto);
}

// 이벤트 이미지 업로드
@Post('upload')
@UseGuards(JwtAuthGuard) // passport를 사용하여 인증 확인
@ApiBearerAuth() // Swagger 문서에 Bearer 토큰 인증 추가
Expand Down Expand Up @@ -90,6 +90,7 @@ export class EventsController {
};
}

// 이벤트 전체 조회
@Get()
@ApiOperation({ summary: 'Event 전체 조회' })
@ApiOkResponse({ type: EventEntity, isArray: true })
Expand All @@ -108,6 +109,7 @@ export class EventsController {
return event;
}

// 이벤트 상세 조회
@Get(':eventId')
@ApiOperation({ summary: 'Event 상세 조회' })
@ApiOkResponse({ type: EventEntity })
Expand All @@ -129,6 +131,7 @@ export class EventsController {
};
}

// 이벤트 참가 신청
@Put(':eventId/join')
@UseGuards(JwtAuthGuard) // passport를 사용하여 인증 확인
@ApiBearerAuth() // Swagger 문서에 Bearer 토큰 인증 추가
Expand All @@ -145,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 })
Expand All @@ -169,6 +173,7 @@ export class EventsController {
return this.eventsService.update(eventId, updateEventDto);
}

// 이벤트 삭제
@Delete(':eventId')
@ApiOperation({ summary: 'Host로서 Event 삭제' })
@ApiOkResponse({ description: 'isDeleted: true / soft Delete' })
Expand All @@ -179,7 +184,7 @@ export class EventsController {
return this.eventsService.remove(eventId);
}

// 북마크 추가
// 관심있는 이벤트 북마크 추가
@Post(':eventId/bookmark')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
Expand All @@ -192,7 +197,7 @@ export class EventsController {
return this.eventsService.addBookmark(eventId, userId, 'bookmarked');
}

// 북마크 제거
// 관심있는 이벤트 북마크 제거
@Delete(':eventId/bookmark')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
Expand Down
14 changes: 11 additions & 3 deletions src/events/events.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ export class EventsService {
return file.path;
}

// 이벤트 전체 조회
findAll() {
return this.prisma.event.findMany({
where: {
Expand Down Expand Up @@ -68,6 +69,7 @@ export class EventsService {
});
}

// 이벤트 상세 조회
async findOne(eventId: number) {
const event = await this.prisma.event.findUnique({
where: { eventId, isDeleted: false },
Expand Down Expand Up @@ -103,6 +105,7 @@ export class EventsService {
return event;
}

// 이벤트 조회 로그
async createViewLog(eventId: number) {
await this.prisma.viewlog.create({
data: {
Expand All @@ -112,6 +115,7 @@ export class EventsService {
});
}

// 이벤트 참가여부 확인
async isJoin(eventId: number, userId: number) {
const isJoin = await this.prisma.guestEvent.findFirst({
where: {
Expand All @@ -122,6 +126,7 @@ export class EventsService {
return isJoin;
}

// 이벤트 참가 신청
async join(eventId: number, userId: number) {
await this.prisma.guestEvent.create({
data: {
Expand All @@ -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: {
Expand All @@ -148,13 +155,15 @@ export class EventsService {
});
}

// 이벤트 수정
update(eventId: number, updateEventDto: UpdateEventDto) {
return this.prisma.event.update({
where: { eventId },
data: updateEventDto,
});
}

// 이벤트 삭제
remove(eventId: number) {
return this.prisma.event.update({
where: { eventId },
Expand All @@ -164,7 +173,7 @@ export class EventsService {
});
}

// 북마크 추가
// 관심있는 북마크 추가
async addBookmark(eventId: number, userId: number, status: string) {
return await this.prisma.eventBookmark.create({
data: {
Expand All @@ -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,
Expand Down
11 changes: 8 additions & 3 deletions src/users/dto/update-user.dto.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down Expand Up @@ -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;
}
4 changes: 2 additions & 2 deletions src/users/users.controller.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
63 changes: 41 additions & 22 deletions src/users/users.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,42 +105,61 @@ 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 },
});
if (!user) {
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. 회원 탈퇴를 한다.
Expand Down

0 comments on commit e0a4818

Please sign in to comment.