From f10d4ecf0e92246ac4aa618fd4d1b2b385441aa8 Mon Sep 17 00:00:00 2001 From: Devheun Date: Tue, 16 Jul 2024 12:00:22 +0900 Subject: [PATCH 1/5] =?UTF-8?q?mod::=20=EC=8B=9C=EA=B0=84=ED=91=9C=20ID?= =?UTF-8?q?=EB=A1=9C=20=EC=8B=9C=EA=B0=84=ED=91=9C=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EC=8B=9C=20return=20=EA=B0=92=20=EB=B3=80=EA=B2=BD=20-=20?= =?UTF-8?q?=EA=B0=95=EC=9D=98=EB=B3=84=EB=A1=9C=20syllabus=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20-?= =?UTF-8?q?=20response=20dto=EC=97=90=20class-validator=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/get-courseinfo-timetable.dto.ts | 26 +++---------------- src/timetable/timetable.service.ts | 2 ++ 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/src/timetable/dto/get-courseinfo-timetable.dto.ts b/src/timetable/dto/get-courseinfo-timetable.dto.ts index c535620d..113fe723 100644 --- a/src/timetable/dto/get-courseinfo-timetable.dto.ts +++ b/src/timetable/dto/get-courseinfo-timetable.dto.ts @@ -1,11 +1,4 @@ import { ApiProperty } from '@nestjs/swagger'; -import { - IsEnum, - IsNotEmpty, - IsNumber, - IsOptional, - IsString, -} from 'class-validator'; const DayType = { Mon: 'Mon', @@ -21,42 +14,29 @@ export type DayType = (typeof DayType)[keyof typeof DayType]; export class GetCourseInfoByTimetableIdResponseDto { @ApiProperty({ description: '강의 ID' }) - @IsNumber() - @IsNotEmpty() courseId: number; @ApiProperty({ description: '교수님 성함' }) - @IsString() - @IsNotEmpty() professorName: string; @ApiProperty({ description: '강의명' }) - @IsString() - @IsNotEmpty() courseName: string; @ApiProperty({ description: '학수 번호' }) - @IsString() - @IsNotEmpty() courseCode: string; + @ApiProperty({ description: '강의 계획서' }) + syllabus: string; + @ApiProperty({ description: '시작 시간' }) - @IsString() - @IsOptional() startTime: string; @ApiProperty({ description: '종료 시간' }) - @IsString() - @IsOptional() endTime: string; @ApiProperty({ description: '강의실' }) - @IsString() - @IsOptional() classroom: string; @ApiProperty({ description: '요일' }) - @IsEnum(DayType) - @IsOptional() day: DayType; } diff --git a/src/timetable/timetable.service.ts b/src/timetable/timetable.service.ts index 6d456f97..2191ec96 100644 --- a/src/timetable/timetable.service.ts +++ b/src/timetable/timetable.service.ts @@ -290,6 +290,7 @@ export class TimetableService { professorName, courseName, courseCode, + syllabus, } = courseEntry.course; courseEntry.course.courseDetails.forEach((detailEntry) => { @@ -301,6 +302,7 @@ export class TimetableService { professorName, courseName, courseCode, + syllabus, day: day as DayType, startTime, endTime, From fe0ca0a9d7b0dbda42948013a189bab708cde15d Mon Sep 17 00:00:00 2001 From: Devheun Date: Tue, 16 Jul 2024 14:20:46 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor::=20=EC=BB=A4=EC=8A=A4=ED=85=80=20?= =?UTF-8?q?=EB=A0=88=ED=8F=AC=EC=A7=80=ED=86=A0=EB=A6=AC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/schedule/schedule.module.ts | 4 +--- src/schedule/schedule.repository.ts | 10 ---------- src/schedule/schedule.service.ts | 7 ++++--- src/timetable/timetable-course.repository.ts | 10 ---------- src/timetable/timetable.module.ts | 7 +++---- src/timetable/timetable.repository.ts | 10 ---------- src/timetable/timetable.service.ts | 12 +++++++----- 7 files changed, 15 insertions(+), 45 deletions(-) delete mode 100644 src/schedule/schedule.repository.ts delete mode 100644 src/timetable/timetable-course.repository.ts delete mode 100644 src/timetable/timetable.repository.ts diff --git a/src/schedule/schedule.module.ts b/src/schedule/schedule.module.ts index ef6fe57b..361b8095 100644 --- a/src/schedule/schedule.module.ts +++ b/src/schedule/schedule.module.ts @@ -4,9 +4,7 @@ import { ScheduleService } from './schedule.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ScheduleEntity } from 'src/entities/schedule.entity'; import { AuthModule } from 'src/auth/auth.module'; -import { ScheduleRepository } from './schedule.repository'; import { TimetableModule } from 'src/timetable/timetable.module'; -import { TimetableCourseRepository } from 'src/timetable/timetable-course.repository'; @Module({ imports: [ @@ -15,7 +13,7 @@ import { TimetableCourseRepository } from 'src/timetable/timetable-course.reposi forwardRef(() => TimetableModule), ], controllers: [ScheduleController], - providers: [ScheduleService, ScheduleRepository, TimetableCourseRepository], + providers: [ScheduleService], exports: [ScheduleService], }) export class ScheduleModule {} diff --git a/src/schedule/schedule.repository.ts b/src/schedule/schedule.repository.ts deleted file mode 100644 index 6074f998..00000000 --- a/src/schedule/schedule.repository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { ScheduleEntity } from 'src/entities/schedule.entity'; -import { DataSource, Repository } from 'typeorm'; - -@Injectable() -export class ScheduleRepository extends Repository { - constructor(dataSource: DataSource) { - super(ScheduleEntity, dataSource.createEntityManager()); - } -} diff --git a/src/schedule/schedule.service.ts b/src/schedule/schedule.service.ts index e855c7b9..c7b045d9 100644 --- a/src/schedule/schedule.service.ts +++ b/src/schedule/schedule.service.ts @@ -8,17 +8,18 @@ import { import { ScheduleEntity } from 'src/entities/schedule.entity'; import { CreateScheduleRequestDto } from './dto/create-schedule-request.dto'; import { AuthorizedUserDto } from 'src/auth/dto/authorized-user-dto'; -import { ScheduleRepository } from './schedule.repository'; import { TimetableService } from 'src/timetable/timetable.service'; import { DeleteScheduleResponseDto } from './dto/delete-schedule-response.dto'; import { UpdateScheduleRequestDto } from './dto/update-schedule-request.dto'; import { UpdateScheduleResponseDto } from './dto/update-schedule-response.dto'; -import { DataSource } from 'typeorm'; +import { DataSource, Repository } from 'typeorm'; +import { InjectRepository } from '@nestjs/typeorm'; @Injectable() export class ScheduleService { constructor( - private readonly scheduleRepository: ScheduleRepository, + @InjectRepository(ScheduleEntity) + private readonly scheduleRepository: Repository, @Inject(forwardRef(() => TimetableService)) private readonly timetableService: TimetableService, private readonly dataSource: DataSource, diff --git a/src/timetable/timetable-course.repository.ts b/src/timetable/timetable-course.repository.ts deleted file mode 100644 index eaa61c6a..00000000 --- a/src/timetable/timetable-course.repository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { TimetableCourseEntity } from 'src/entities/timetable-course.entity'; -import { DataSource, Repository } from 'typeorm'; - -@Injectable() -export class TimetableCourseRepository extends Repository { - constructor(dataSource: DataSource) { - super(TimetableCourseEntity, dataSource.createEntityManager()); - } -} diff --git a/src/timetable/timetable.module.ts b/src/timetable/timetable.module.ts index 5e26d34a..7bed0cc9 100644 --- a/src/timetable/timetable.module.ts +++ b/src/timetable/timetable.module.ts @@ -3,21 +3,20 @@ import { TimetableController } from './timetable.controller'; import { TimetableService } from './timetable.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { TimetableEntity } from 'src/entities/timetable.entity'; -import { TimetableRepository } from './timetable.repository'; -import { TimetableCourseRepository } from './timetable-course.repository'; import { AuthModule } from 'src/auth/auth.module'; import { ScheduleModule } from 'src/schedule/schedule.module'; import { CourseModule } from 'src/course/course.module'; +import { TimetableCourseEntity } from 'src/entities/timetable-course.entity'; @Module({ imports: [ - TypeOrmModule.forFeature([TimetableEntity]), + TypeOrmModule.forFeature([TimetableEntity, TimetableCourseEntity]), AuthModule, CourseModule, forwardRef(() => ScheduleModule), ], controllers: [TimetableController], - providers: [TimetableService, TimetableRepository, TimetableCourseRepository], + providers: [TimetableService], exports: [TimetableService], }) export class TimetableModule {} diff --git a/src/timetable/timetable.repository.ts b/src/timetable/timetable.repository.ts deleted file mode 100644 index f3c3daaa..00000000 --- a/src/timetable/timetable.repository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { TimetableEntity } from 'src/entities/timetable.entity'; -import { DataSource, Repository } from 'typeorm'; - -@Injectable() -export class TimetableRepository extends Repository { - constructor(dataSource: DataSource) { - super(TimetableEntity, dataSource.createEntityManager()); - } -} diff --git a/src/timetable/timetable.service.ts b/src/timetable/timetable.service.ts index 2191ec96..11850e04 100644 --- a/src/timetable/timetable.service.ts +++ b/src/timetable/timetable.service.ts @@ -6,12 +6,10 @@ import { NotFoundException, forwardRef, } from '@nestjs/common'; -import { TimetableRepository } from './timetable.repository'; -import { TimetableCourseRepository } from './timetable-course.repository'; import { TimetableDto } from './dto/timetable.dto'; import { TimetableEntity } from 'src/entities/timetable.entity'; import { AuthorizedUserDto } from 'src/auth/dto/authorized-user-dto'; -import { DataSource } from 'typeorm'; +import { DataSource, Repository } from 'typeorm'; import { CreateTimetableDto } from './dto/create-timetable.dto'; import { GetTimetableByUserIdResponseDto } from './dto/userId-timetable.dto'; import { DayType } from './dto/get-courseinfo-timetable.dto'; @@ -22,12 +20,16 @@ import { CreateTimetableCourseResponseDto } from './dto/create-timetable-course- import { CommonTimetableResponseDto } from './dto/common-timetable-response.dto'; import { GetTimetableByTimetableIdDto } from './dto/get-timetable-timetable.dto'; import { ColorType } from './dto/update-timetable-color.dto'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TimetableCourseEntity } from 'src/entities/timetable-course.entity'; @Injectable() export class TimetableService { constructor( - private readonly timetableRepository: TimetableRepository, - private readonly timetableCourseRepository: TimetableCourseRepository, + @InjectRepository(TimetableEntity) + private readonly timetableRepository: Repository, + @InjectRepository(TimetableCourseEntity) + private readonly timetableCourseRepository: Repository, private readonly courseService: CourseService, private readonly dataSource: DataSource, @Inject(forwardRef(() => ScheduleService)) From 422f8be86f91dfb0a487e1364929462e6da1ee52 Mon Sep 17 00:00:00 2001 From: Devheun Date: Tue, 16 Jul 2024 15:09:53 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix::=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20API=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20-=20=EA=B8=B0=EC=A1=B4=EC=97=90=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A4=84=EC=9D=B8=EB=8D=B0=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=EC=8B=9C=EA=B0=84-=EB=81=9D=EB=82=98=EB=8A=94?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=84=20=ED=8F=AC=ED=95=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EB=A7=8C=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=B2=98=EB=A6=AC=ED=95=B4?= =?UTF-8?q?=EC=A4=AC=EC=9C=BC=EB=82=98=20-=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A4=84=EC=9D=B8=EB=8D=B0=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=EC=8B=9C=EA=B0=84-=EB=81=9D=EB=82=98=EB=8A=94?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=84=20=EB=91=98=20=EB=8B=A4=20=EC=9E=91?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD=ED=95=98=EA=B1=B0=EB=82=98=20-?= =?UTF-8?q?=20=EC=8B=9C=EC=9E=91=EC=8B=9C=EA=B0=84-=EB=81=9D=EB=82=98?= =?UTF-8?q?=EB=8A=94=EC=8B=9C=EA=B0=84=EC=9D=84=20=EB=91=98=20=EB=8B=A4=20?= =?UTF-8?q?=ED=81=AC=EA=B2=8C=20=EB=B3=80=EA=B2=BD=ED=95=98=EA=B1=B0?= =?UTF-8?q?=EB=82=98=20-=20=EC=8B=9C=EC=9E=91=EC=8B=9C=EA=B0=84=EC=9D=80?= =?UTF-8?q?=20=EA=B8=B0=EC=A1=B4=EB=B3=B4=EB=8B=A4=20=EC=9E=91=EA=B2=8C,?= =?UTF-8?q?=20=EB=81=9D=EB=82=98=EB=8A=94=EC=8B=9C=EA=B0=84=EC=9D=80=20?= =?UTF-8?q?=EA=B8=B0=EC=A1=B4=EB=B3=B4=EB=8B=A4=20=ED=81=AC=EA=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=98=EB=8A=94=20=EA=B2=BD=EC=9A=B0?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=B4=EC=84=9C=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EA=B0=80=20=EC=95=88=EB=90=98=EC=96=B4?= =?UTF-8?q?=EC=9E=88=EC=97=88=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/schedule/schedule.service.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/schedule/schedule.service.ts b/src/schedule/schedule.service.ts index c7b045d9..87b87a8b 100644 --- a/src/schedule/schedule.service.ts +++ b/src/schedule/schedule.service.ts @@ -185,17 +185,9 @@ export class ScheduleService { ); for (const existingInfo of existingScheduleInfo) { - // 변경하고자 하는 일정이 기존의 일정 시간대 내에서 변경하는 경우 (ex : 토요일 10:30~12:00 -> 토요일 11:00 ~ 12:00) - if ( - scheduleId === Number(existingInfo.id) && - String(schedule.day) === existingInfo.day && - this.timeToNumber(schedule.startTime) >= - this.timeToNumber(existingInfo.startTime) && - this.timeToNumber(schedule.endTime) <= - this.timeToNumber(existingInfo.endTime) - ) { - return false; - } + // 예외 발생 케이스 처리 + if (scheduleId === Number(existingInfo.id)) continue; + if ( existingInfo.day === schedule.day && this.isConflictingTime( From 3d0808b437d2a6b2f069db1f0fa0a0dae66e25c1 Mon Sep 17 00:00:00 2001 From: Devheun Date: Wed, 17 Jul 2024 01:16:30 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix::=20=EC=8B=9C=EC=9E=91=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EC=9D=B4=20=EB=81=9D=EB=82=98=EB=8A=94=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=EB=B3=B4=EB=8B=A4=20=EB=8A=A6=EC=9D=84=20=EB=95=8C=20?= =?UTF-8?q?=EC=9D=BC=EC=A0=95=20=EC=83=9D=EC=84=B1,=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/schedule/schedule.service.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/schedule/schedule.service.ts b/src/schedule/schedule.service.ts index 87b87a8b..1a7f57eb 100644 --- a/src/schedule/schedule.service.ts +++ b/src/schedule/schedule.service.ts @@ -1,4 +1,5 @@ import { + BadRequestException, ConflictException, Inject, Injectable, @@ -50,6 +51,14 @@ export class ScheduleService { throw new NotFoundException('Timetable not found'); } + if ( + createScheduleRequestDto.startTime >= createScheduleRequestDto.endTime + ) { + throw new BadRequestException( + 'Start time must be earlier than end time', + ); + } + // 시간표에 존재하는 강의, 스케쥴과 추가하려는 스케쥴이 시간이 겹치는 지 확인 const isConflict = await this.checkTimeConflict(createScheduleRequestDto); @@ -102,6 +111,13 @@ export class ScheduleService { updateScheduleRequestDto.startTime && updateScheduleRequestDto.endTime ) { + if ( + updateScheduleRequestDto.startTime >= updateScheduleRequestDto.endTime + ) { + throw new BadRequestException( + 'Start time must be earlier than end time', + ); + } // 시간표에 존재하는 강의, 스케쥴과 수정하려는 스케쥴이 시간이 겹치는 지 확인 const isConflict = await this.checkTimeConflict( updateScheduleRequestDto, From 3525752387cf706fdb68f2461c791c92ca6a7509 Mon Sep 17 00:00:00 2001 From: Devheun Date: Wed, 17 Jul 2024 01:27:41 +0900 Subject: [PATCH 5/5] =?UTF-8?q?refactor::=20timetable=20service=20layer?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20try?= =?UTF-8?q?-catch=20=EA=B5=AC=EB=AC=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/timetable/timetable.service.ts | 329 +++++++++++++---------------- 1 file changed, 147 insertions(+), 182 deletions(-) diff --git a/src/timetable/timetable.service.ts b/src/timetable/timetable.service.ts index 11850e04..570b1bcb 100644 --- a/src/timetable/timetable.service.ts +++ b/src/timetable/timetable.service.ts @@ -42,51 +42,46 @@ export class TimetableService { courseId: number, user: AuthorizedUserDto, ): Promise { - try { - const timetable = await this.timetableRepository.findOne({ - where: { id: timetableId, userId: user.id }, - }); - if (!timetable) { - throw new NotFoundException('Timetable not found'); - } + const timetable = await this.timetableRepository.findOne({ + where: { id: timetableId, userId: user.id }, + }); + if (!timetable) { + throw new NotFoundException('Timetable not found'); + } - const course = - await this.courseService.getCourseWithCourseDetails(courseId); + const course = + await this.courseService.getCourseWithCourseDetails(courseId); - if (!course) { - throw new NotFoundException('Course not found'); - } + if (!course) { + throw new NotFoundException('Course not found'); + } - // TimetableCourse 테이블에 이미 동일한 레코드가 존재하는지 확인 - const existingTimetableCourse = - await this.timetableCourseRepository.findOne({ - where: { timetableId, courseId }, - }); - if (existingTimetableCourse) { - throw new ConflictException('Already exists in Timetable'); - } + // TimetableCourse 테이블에 이미 동일한 레코드가 존재하는지 확인 + const existingTimetableCourse = + await this.timetableCourseRepository.findOne({ + where: { timetableId, courseId }, + }); + if (existingTimetableCourse) { + throw new ConflictException('Already exists in Timetable'); + } - // 시간표에 존재하는 강의, 스케쥴과 추가하려는 강의가 시간이 겹치는 지 확인 - const isConflict = await this.checkTimeConflict(timetableId, courseId); + // 시간표에 존재하는 강의, 스케쥴과 추가하려는 강의가 시간이 겹치는 지 확인 + const isConflict = await this.checkTimeConflict(timetableId, courseId); - if (isConflict) { - throw new ConflictException( - 'Course conflicts with existing courses and schedules', - ); - } + if (isConflict) { + throw new ConflictException( + 'Course conflicts with existing courses and schedules', + ); + } - const timetableCourse = this.timetableCourseRepository.create({ - timetableId, - courseId, - timetable, - course, - }); + const timetableCourse = this.timetableCourseRepository.create({ + timetableId, + courseId, + timetable, + course, + }); - return await this.timetableCourseRepository.save(timetableCourse); - } catch (error) { - console.error('Failed to create TimetableCourse:', error); - throw error; - } + return await this.timetableCourseRepository.save(timetableCourse); } async checkTimeConflict( @@ -263,94 +258,84 @@ export class TimetableService { timetableId: number, userId: number, ): Promise { - try { - const timetable = await this.timetableRepository.findOne({ - where: { id: timetableId, userId }, - relations: [ - 'timetableCourses', - 'timetableCourses.course', - 'timetableCourses.course.courseDetails', - ], - }); - if (!timetable) { - throw new NotFoundException('Timetable not found'); - } + const timetable = await this.timetableRepository.findOne({ + where: { id: timetableId, userId }, + relations: [ + 'timetableCourses', + 'timetableCourses.course', + 'timetableCourses.course.courseDetails', + ], + }); + if (!timetable) { + throw new NotFoundException('Timetable not found'); + } - const schedules = - await this.scheduleService.getScheduleByTimetableId(timetableId); - - // 코스 정보와 스케줄 정보를 같은 깊이의 객체로 분리하여 반환 - const getTimetableByTimetableIdResponse: GetTimetableByTimetableIdDto = { - courses: [], - schedules: [], - color: timetable.color, - timetableName: timetable.timetableName, - }; - timetable.timetableCourses.forEach((courseEntry) => { - const { - id: courseId, + const schedules = + await this.scheduleService.getScheduleByTimetableId(timetableId); + + // 코스 정보와 스케줄 정보를 같은 깊이의 객체로 분리하여 반환 + const getTimetableByTimetableIdResponse: GetTimetableByTimetableIdDto = { + courses: [], + schedules: [], + color: timetable.color, + timetableName: timetable.timetableName, + }; + timetable.timetableCourses.forEach((courseEntry) => { + const { + id: courseId, + professorName, + courseName, + courseCode, + syllabus, + } = courseEntry.course; + + courseEntry.course.courseDetails.forEach((detailEntry) => { + const { day, startTime, endTime, classroom } = detailEntry; + + // 강의 정보 객체 + getTimetableByTimetableIdResponse.courses.push({ + courseId, professorName, courseName, courseCode, syllabus, - } = courseEntry.course; - - courseEntry.course.courseDetails.forEach((detailEntry) => { - const { day, startTime, endTime, classroom } = detailEntry; - - // 강의 정보 객체 - getTimetableByTimetableIdResponse.courses.push({ - courseId, - professorName, - courseName, - courseCode, - syllabus, - day: day as DayType, - startTime, - endTime, - classroom, - }); + day: day as DayType, + startTime, + endTime, + classroom, }); }); + }); - // 스케줄 정보 객체 - schedules.forEach((schedule) => { - getTimetableByTimetableIdResponse.schedules.push({ - scheduleId: schedule.id, - scheduleTitle: schedule.title, - scheduleDay: schedule.day as DayType, - scheduleStartTime: schedule.startTime, - scheduleEndTime: schedule.endTime, - location: schedule.location, - }); + // 스케줄 정보 객체 + schedules.forEach((schedule) => { + getTimetableByTimetableIdResponse.schedules.push({ + scheduleId: schedule.id, + scheduleTitle: schedule.title, + scheduleDay: schedule.day as DayType, + scheduleStartTime: schedule.startTime, + scheduleEndTime: schedule.endTime, + location: schedule.location, }); + }); - return getTimetableByTimetableIdResponse; - } catch (error) { - console.error('Failed to get Timetable: ', error); - throw error; - } + return getTimetableByTimetableIdResponse; } async getTimetableByUserId( userId: number, ): Promise { - try { - const userTimetable = await this.timetableRepository.find({ - where: { userId }, - }); - if (!userTimetable) throw new NotFoundException('Timetable not found'); - return userTimetable.map((table) => ({ - timetableId: table.id, - semester: table.semester, - year: table.year, - mainTimetable: table.mainTimetable, - timetableName: table.timetableName, - })); - } catch (error) { - console.error('Failed to get Timetable: ', error); - throw error; - } + const userTimetable = await this.timetableRepository.find({ + where: { userId }, + }); + if (!userTimetable) throw new NotFoundException('Timetable not found'); + return userTimetable.map((table) => ({ + timetableId: table.id, + semester: table.semester, + year: table.year, + mainTimetable: table.mainTimetable, + timetableName: table.timetableName, + })); } // 친구 시간표 조회 @@ -384,33 +369,28 @@ export class TimetableService { courseId: number, user: AuthorizedUserDto, ): Promise { - try { - // 해당 유저가 만든 시간표인지 확인 - const timetable = await this.timetableRepository.findOne({ - where: { id: timetableId, userId: user.id }, - }); + // 해당 유저가 만든 시간표인지 확인 + const timetable = await this.timetableRepository.findOne({ + where: { id: timetableId, userId: user.id }, + }); - if (!timetable) { - throw new NotFoundException('Timetable not found'); - } + if (!timetable) { + throw new NotFoundException('Timetable not found'); + } - const timetableCourse = await this.timetableCourseRepository.findOne({ - where: { timetableId, courseId }, - }); - if (!timetableCourse) { - throw new NotFoundException('There is no course in this timetable!'); - } + const timetableCourse = await this.timetableCourseRepository.findOne({ + where: { timetableId, courseId }, + }); + if (!timetableCourse) { + throw new NotFoundException('There is no course in this timetable!'); + } - await this.timetableCourseRepository.softDelete({ - timetableId, - courseId, - }); + await this.timetableCourseRepository.softDelete({ + timetableId, + courseId, + }); - return { deleted: true }; - } catch (error) { - console.error('Failed to delete TimetableCourse: ', error); - throw error; - } + return { deleted: true }; } async deleteTimetable( @@ -466,24 +446,19 @@ export class TimetableService { timetableDto: TimetableDto, user: AuthorizedUserDto, ): Promise { - try { - const mainTimetable = await this.timetableRepository.findOne({ - where: { - userId: user.id, - mainTimetable: true, - year: timetableDto.year, - semester: timetableDto.semester, - }, - }); + const mainTimetable = await this.timetableRepository.findOne({ + where: { + userId: user.id, + mainTimetable: true, + year: timetableDto.year, + semester: timetableDto.semester, + }, + }); - if (!mainTimetable) { - throw new NotFoundException('MainTimetable not found'); - } - return mainTimetable; - } catch (error) { - console.error('Failed to get MainTimetable: ', error); - throw error; + if (!mainTimetable) { + throw new NotFoundException('MainTimetable not found'); } + return mainTimetable; } // 시간표 색상 변경 @@ -492,23 +467,18 @@ export class TimetableService { user: AuthorizedUserDto, timetableColor: ColorType, ): Promise { - try { - const timetable = await this.timetableRepository.findOne({ - where: { - id: timetableId, - userId: user.id, - }, - }); - if (!timetable) { - throw new NotFoundException('Timetable not found'); - } - - timetable.color = timetableColor; - return await this.timetableRepository.save(timetable); - } catch (error) { - console.error('Failed to update Timetable color: ', error); - throw error; + const timetable = await this.timetableRepository.findOne({ + where: { + id: timetableId, + userId: user.id, + }, + }); + if (!timetable) { + throw new NotFoundException('Timetable not found'); } + + timetable.color = timetableColor; + return await this.timetableRepository.save(timetable); } // 시간표 이름 변경 @@ -517,23 +487,18 @@ export class TimetableService { user: AuthorizedUserDto, timetableName: string, ): Promise { - try { - const timetable = await this.timetableRepository.findOne({ - where: { - id: timetableId, - userId: user.id, - }, - }); - if (!timetable) { - throw new NotFoundException('Timetable not found'); - } - - timetable.timetableName = timetableName; - return await this.timetableRepository.save(timetable); - } catch (error) { - console.error('Failed to update Timetable name: ', error); - throw error; + const timetable = await this.timetableRepository.findOne({ + where: { + id: timetableId, + userId: user.id, + }, + }); + if (!timetable) { + throw new NotFoundException('Timetable not found'); } + + timetable.timetableName = timetableName; + return await this.timetableRepository.save(timetable); } // 기존의 대표시간표의 mainTimetable column을 false로 변경하고, 새로운 시간표의 mainTimetable column을 true로 변경