From 6902fc576e6b5ec00c6f9ca75e3b383e48f54216 Mon Sep 17 00:00:00 2001 From: Kim Daehyeon Date: Sun, 26 Nov 2023 02:12:26 +0900 Subject: [PATCH] =?UTF-8?q?Feat:=20=EC=9C=A0=EC=A0=80=EB=B3=84=20=ED=9A=8C?= =?UTF-8?q?=EC=9D=98=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C=EA=B0=84=20API=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20-=20#10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/response/response.code.ts | 10 +++ .../dtos/request/possible-time.dto.ts | 9 +++ src/meetings/meetings.controller.ts | 12 +++- src/meetings/meetings.module.ts | 6 +- src/meetings/meetings.service.ts | 63 ++++++++++++++++++- 5 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 src/meetings/dtos/request/possible-time.dto.ts diff --git a/src/common/response/response.code.ts b/src/common/response/response.code.ts index c758655..37da42e 100644 --- a/src/common/response/response.code.ts +++ b/src/common/response/response.code.ts @@ -55,6 +55,16 @@ export const RESPONSE_CODE: Record = { }, //TEAM + 24030: { + code: 24031, + message: '해당 팀에 가입되어 있지 않습니다.', + status: HttpStatus.FORBIDDEN, + }, + 24031: { + code: 24031, + message: '해당 팀의 방장이 아닙니다.', + status: HttpStatus.FORBIDDEN, + }, 24040: { code: 24040, message: '존재하지 않는 팀입니다.', diff --git a/src/meetings/dtos/request/possible-time.dto.ts b/src/meetings/dtos/request/possible-time.dto.ts new file mode 100644 index 0000000..1bf6336 --- /dev/null +++ b/src/meetings/dtos/request/possible-time.dto.ts @@ -0,0 +1,9 @@ +import { IsDateString, IsString } from 'class-validator'; + +export class PossibleTimeDto { + @IsString() + meetId!: string; + + @IsDateString() + date!: Date; +} diff --git a/src/meetings/meetings.controller.ts b/src/meetings/meetings.controller.ts index 0e8f50f..d52c2ab 100644 --- a/src/meetings/meetings.controller.ts +++ b/src/meetings/meetings.controller.ts @@ -5,17 +5,27 @@ import { AuthUser } from '../auth/auth-user.decorator'; import { ResponseBody } from '../common/response/response'; import { User } from '../users/entities/users.entity'; import { CreateDto } from './dtos/request/create.dto'; +import { PossibleTimeDto } from './dtos/request/possible-time.dto'; @Controller('meetings') //미들웨어라고 보면 됨. domain/teams/ ~~ 로 시작한다고 정해준다. export class MeetingsController { constructor(private readonly meetingService: MeetingsService) {} //meetingService는 변수명, MeetingsService는 객체 즉, teamsService라는 이름의 TeamsService 객체를 생성해준 것 @Post('/meet') - @UseGuards(JwtAuthGuard) // jwt에 있는 정보를 가지고 DB에서 조회를 한 뒤 유저를 넘겨주고, @UseGuards에서 유저 정보를 불러와 사용한다. + @UseGuards(JwtAuthGuard) // jwt에 있는 정보를 가지고 DB에서 조회를 한 뒤 유저를 넘겨주고, @AuthUser에서 유저 정보를 불러와 사용한다. async create( @AuthUser() user: User, @Body() createDto: CreateDto, // create.dto에서 정의해줌 ): Promise { return await this.meetingService.create(createDto); } + + @Post('/possible-time') + @UseGuards(JwtAuthGuard) + async possibleTime( + @AuthUser() user: User, + @Body() timeDto: PossibleTimeDto, + ): Promise { + return await this.meetingService.possibleTime(timeDto, user); + } } diff --git a/src/meetings/meetings.module.ts b/src/meetings/meetings.module.ts index 4d7787a..791e89f 100644 --- a/src/meetings/meetings.module.ts +++ b/src/meetings/meetings.module.ts @@ -3,10 +3,14 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { Meeting } from './entities/meeting.entity'; import { MeetingsController } from './meetings.controller'; import { MeetingsService } from './meetings.service'; +import { Participant } from '../relationentities/participant.entity'; +import { Possible_Time } from '../relationentities/possible_time.entity'; import { Team } from '../teams/entities/team.entity'; @Module({ - imports: [TypeOrmModule.forFeature([Meeting, Team])], + imports: [ + TypeOrmModule.forFeature([Meeting, Participant, Possible_Time, Team]), + ], controllers: [MeetingsController], providers: [MeetingsService], exports: [], diff --git a/src/meetings/meetings.service.ts b/src/meetings/meetings.service.ts index ddc9efb..668aa38 100644 --- a/src/meetings/meetings.service.ts +++ b/src/meetings/meetings.service.ts @@ -5,16 +5,24 @@ import { Meeting } from './entities/meeting.entity'; import { CreateDto } from './dtos/request/create.dto'; import { ResponseBody, SuccessResponse } from '../common/response/response'; import { RESPONSE_CODE } from '../common/response/response.code'; +import { Participant } from '../relationentities/participant.entity'; +import { Possible_Time } from '../relationentities/possible_time.entity'; import { Team } from '../teams/entities/team.entity'; import { Exception } from '../common/response/exception'; +import { PossibleTimeDto } from './dtos/request/possible-time.dto'; +import { User } from '../users/entities/users.entity'; @Injectable() export class MeetingsService { constructor( @InjectRepository(Meeting) private meetingsRepository: Repository, + @InjectRepository(Participant) + private participantsRepository: Repository, + @InjectRepository(Possible_Time) + private possible_timesRepository: Repository, @InjectRepository(Team) - private teamsRepository: Repository, //이 repository가 DB에 있던 정보를 불러온 것 + private teamsRepository: Repository, ) {} async create(createDto: CreateDto): Promise { @@ -37,4 +45,57 @@ export class MeetingsService { await this.meetingsRepository.save(meeting); return SuccessResponse(RESPONSE_CODE[2000], { id: meeting.id }); } + + async possibleTime( + timeDto: PossibleTimeDto, + user: User, + ): Promise { + const meeting: Meeting = await this.meetingsRepository.findOne({ + where: { id: timeDto.meetId }, + relations: { + team: true, + }, + }); + + if (!meeting) { + throw new Exception(RESPONSE_CODE[34040], null); + } + + const participant: Participant = await this.participantsRepository.findOne({ + where: { team: meeting.team, user: user }, + }); + + if (!participant) { + throw new Exception(RESPONSE_CODE[24030], null); + } + + const possibleTimeInDb: Possible_Time = + await this.possible_timesRepository.findOne({ + where: { meeting: meeting, user: user }, + }); + + if (possibleTimeInDb) { + const dbDate = new Date(possibleTimeInDb.possibleTime); + const inputDate = new Date(timeDto.date); + if (dbDate.getDate() == inputDate.getDate()) { + possibleTimeInDb.possibleTime = timeDto.date; + await this.possible_timesRepository.save(possibleTimeInDb); + } else { + const possible_time: Possible_Time = + this.possible_timesRepository.create(); + possible_time.user = user; + possible_time.meeting = meeting; + possible_time.possibleTime = timeDto.date; + await this.possible_timesRepository.save(possible_time); + } + } else { + const possible_time: Possible_Time = + this.possible_timesRepository.create(); + possible_time.user = user; + possible_time.meeting = meeting; + possible_time.possibleTime = timeDto.date; + await this.possible_timesRepository.save(possible_time); + } + return SuccessResponse(RESPONSE_CODE[2000], null); + } }