Skip to content

Commit

Permalink
Merge pull request #14 from mju-likelion/feature/room-result-date
Browse files Browse the repository at this point in the history
방 특정 날짜 정보 조회 API 만들기
  • Loading branch information
ndaemy authored Aug 23, 2023
2 parents 76aeee1 + 2557e59 commit 591a766
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 11 deletions.
6 changes: 0 additions & 6 deletions src/api/rooms/dto/get-room-reservation-param.dto.ts

This file was deleted.

14 changes: 14 additions & 0 deletions src/api/rooms/dto/room-param.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Matches } from 'class-validator';

export class FindOneRoomParamDto {
@Matches(/^[A-Z\d]{6}$/)
code: string;
}

export class GetRoomResultByDateParamDto {
@Matches(/^[A-Z\d]{6}$/)
code: string;

@Matches(/^\d{4}-\d{2}-\d{2}$/)
date: string;
}
16 changes: 12 additions & 4 deletions src/api/rooms/rooms.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ import { Controller, Get, Post, Body, Param } from '@nestjs/common';

import { RoomsService } from './rooms.service';
import { CreateRoomDto } from './dto/create-room.dto';
import { GetRoomReservationParamDto } from './dto/get-room-reservation-param.dto';
import {
FindOneRoomParamDto,
GetRoomResultByDateParamDto,
} from './dto/room-param.dto';

@Controller('rooms')
export class RoomsController {
Expand All @@ -14,12 +17,17 @@ export class RoomsController {
}

@Get(':code')
findOne(@Param() { code }: GetRoomReservationParamDto) {
findOne(@Param() { code }: FindOneRoomParamDto) {
return this.roomsService.findOne(code);
}

@Get(':code/result')
getRoomResult(@Param('code') code: string) {
return this.roomsService.getRoomResult(code);
getResult(@Param() { code }: FindOneRoomParamDto) {
return this.roomsService.getResult(code);
}

@Get(':code/result/:date')
getResultByDate(@Param() { code, date }: GetRoomResultByDateParamDto) {
return this.roomsService.getResultByDate(code, date);
}
}
75 changes: 74 additions & 1 deletion src/api/rooms/rooms.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,21 @@ export class RoomsService {
return new Date(stringDate);
}

/**
* @example filterUsersInDate(users, '2023-08-23')
*/
private filterUsersInDate(
users: { username: string; enableTimes: string[] }[],
date: string
) {
return users.filter(user => {
const enableTimes = user.enableTimes;
const enableDates = enableTimes.map(time => time.split(' ')[0]);

return enableDates.includes(date);
});
}

/**
* 이 부분 상세 조건들은 아래 슬랙을 참고하시면 좋습니다
* @see {@link https://www.notion.so/likelion-11th/6-6-8fdfd4c7268e4f70bd232dcee5078aab?pvs=4#ca12b4cd60904410bbb83549e748f1cd | Notion}
Expand Down Expand Up @@ -49,7 +64,7 @@ export class RoomsService {
return room;
}

async getRoomResult(code: string) {
async getResult(code: string) {
const room = await this.prismaService.room.findUnique({
where: { code },
include: {
Expand Down Expand Up @@ -98,6 +113,64 @@ export class RoomsService {
};
}

async getResultByDate(code: string, date: string) {
const room = await this.prismaService.room.findUnique({
where: { code },
include: {
users: {
select: {
username: true,
enableTimes: true,
},
},
},
});

const { users } = room;
const filteredUsersInDate = this.filterUsersInDate(users, date);
const { dateOnly, startTime, endTime } = room;

// 날짜만 선택하는 방이면
if (room.dateOnly) {
return {
code,
selectedDate: date,
dateOnly,
votingUsers: filteredUsersInDate.map(user => user.username),
};
}

// 모두가 선택한 시간들을 골라보기
const selectedTimes = filteredUsersInDate
.map(user => user.enableTimes)
.flat()
.map(time => time.split(' ')[1])
.sort()
.reduce((acc, cur) => {
if (acc[cur]) {
acc[cur] += 1;
} else {
acc[cur] = 1;
}
return acc;
}, {});
// 그 중 모두가 선택한 시간만 선택
const everyoneSelectedTimes = Object.keys(selectedTimes).filter(
time => selectedTimes[time] === filteredUsersInDate.length
);

// 시간도 선택하는 방이면
return {
code,
selectedDate: date,
dateOnly,
startTime,
endTime,
votingUsers: filteredUsersInDate.map(user => user.username),
everyoneSelectedTimes,
};
}

validateDates(createRoomDto: CreateRoomDto) {
const errors = [];

Expand Down

0 comments on commit 591a766

Please sign in to comment.