diff --git a/src/decorators/docs/friendship.decorator.ts b/src/decorators/docs/friendship.decorator.ts index f167404..d006422 100644 --- a/src/decorators/docs/friendship.decorator.ts +++ b/src/decorators/docs/friendship.decorator.ts @@ -15,9 +15,9 @@ import { SendFriendshipRequestDto } from 'src/friendship/dto/send-friendship-req import { SendFriendshipResponseDto } from 'src/friendship/dto/send-friendship-response.dto'; import { UpdateFriendshipResponseDto } from 'src/friendship/dto/update-friendship-response.dto'; import { FriendshipController } from 'src/friendship/friendship.controller'; -import { GetTimetableByTimetableIdDto } from 'src/timetable/dto/get-timetable-timetable.dto'; import { ApiKukeyExceptionResponse } from '../api-kukey-exception-response'; import { GetReceivedFriendshipRequestCountDto } from 'src/friendship/dto/get-received-friendship-request-count.dto'; +import { GetNullableTimetableResponseDto } from 'src/timetable/dto/get-nullable-timetable-response.dto'; type FriendshipEndPoints = MethodNames; @@ -79,14 +79,12 @@ const FriendshipDocsMap: Record = { }), ApiOkResponse({ description: '친구 시간표 반환', - type: GetTimetableByTimetableIdDto, - isArray: true, + type: GetNullableTimetableResponseDto, }), ApiKukeyExceptionResponse([ 'USER_NOT_FOUND', 'FRIENDSHIP_NOT_FOUND', 'FRIENDSHIP_REQUEST_NOT_ACCEPTED', - 'FRIEND_TIMETABLE_NOT_FOUND', ]), ], sendFriendshipRequest: [ diff --git a/src/decorators/docs/timetable.decorator.ts b/src/decorators/docs/timetable.decorator.ts index 47edf2c..638d88d 100644 --- a/src/decorators/docs/timetable.decorator.ts +++ b/src/decorators/docs/timetable.decorator.ts @@ -10,7 +10,6 @@ import { CommonDeleteResponseDto } from 'src/timetable/dto/common-delete-respons import { CommonTimetableResponseDto } from 'src/timetable/dto/common-timetable-response.dto'; import { CreateTimetableCourseResponseDto } from 'src/timetable/dto/create-timetable-course-response.dto'; import { CreateTimetableDto } from 'src/timetable/dto/create-timetable.dto'; -import { GetTimetableByTimetableIdDto } from 'src/timetable/dto/get-timetable-timetable.dto'; import { TimetableDto } from 'src/timetable/dto/timetable.dto'; import { UpdateTimetableColorDto } from 'src/timetable/dto/update-timetable-color.dto'; import { UpdateTimetableNameDto } from 'src/timetable/dto/update-timetable-name.dto'; @@ -18,6 +17,7 @@ import { GetTimetableByUserIdResponseDto } from 'src/timetable/dto/userId-timeta import { TimetableController } from 'src/timetable/timetable.controller'; import { ApiKukeyExceptionResponse } from '../api-kukey-exception-response'; import { GetTodayTimetableResponse } from 'src/timetable/dto/get-today-timetable-response.dto'; +import { GetNullableTimetableResponseDto } from 'src/timetable/dto/get-nullable-timetable-response.dto'; type TimetableEndPoints = MethodNames; @@ -48,7 +48,9 @@ const TimetableDocsMap: Record = { ApiKukeyExceptionResponse([ 'TIMETABLE_NOT_FOUND', 'COURSE_NOT_FOUND', + 'TIMETABLE_COURSE_MISMATCH', 'COURSE_ALREADY_EXIST', + 'COURSE_CONFLICT', ]), ], createTimetable: [ @@ -89,7 +91,6 @@ const TimetableDocsMap: Record = { description: '대표 시간표 조회 성공 시', type: CommonTimetableResponseDto, }), - ApiKukeyExceptionResponse(['TIMETABLE_NOT_FOUND']), ], getTimetableByUserId: [ ApiOperation({ @@ -103,7 +104,6 @@ const TimetableDocsMap: Record = { type: GetTimetableByUserIdResponseDto, isArray: true, }), - ApiKukeyExceptionResponse(['TIMETABLE_NOT_FOUND']), ], getTodayTimetable: [ ApiOperation({ @@ -136,14 +136,15 @@ const TimetableDocsMap: Record = { }), ApiParam({ name: 'timetableId', + type: 'number', + required: true, description: '특정 시간표 ID', }), ApiResponse({ status: 200, description: '특정 시간표 ID로 조회 성공 시', - type: GetTimetableByTimetableIdDto, + type: GetNullableTimetableResponseDto, }), - ApiKukeyExceptionResponse(['TIMETABLE_NOT_FOUND']), ], deleteTimetableCourse: [ ApiOperation({ @@ -177,6 +178,8 @@ const TimetableDocsMap: Record = { }), ApiParam({ name: 'timetableId', + type: 'number', + required: true, description: '삭제할 시간표 ID', }), ApiResponse({ @@ -193,6 +196,8 @@ const TimetableDocsMap: Record = { }), ApiParam({ name: 'timetableId', + type: 'number', + required: true, description: '변경할 시간표 ID', }), ApiBody({ @@ -212,6 +217,8 @@ const TimetableDocsMap: Record = { }), ApiParam({ name: 'timetableId', + type: 'number', + required: true, description: '변경할 시간표 ID', }), ApiBody({ @@ -232,6 +239,8 @@ const TimetableDocsMap: Record = { }), ApiParam({ name: 'timetableId', + type: 'number', + required: true, description: '대표 시간표로 변경할 시간표 ID', }), ApiBody({ diff --git a/src/friendship/friendship.controller.ts b/src/friendship/friendship.controller.ts index 59bd45e..4699e01 100644 --- a/src/friendship/friendship.controller.ts +++ b/src/friendship/friendship.controller.ts @@ -23,13 +23,13 @@ import { DeleteFriendshipResponseDto } from './dto/delete-friendship-response.dt import { SearchUserResponseDto } from './dto/search-user-response.dto'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { GetFriendTimetableRequestDto } from './dto/get-friend-timetable.dto'; -import { GetTimetableByTimetableIdDto } from 'src/timetable/dto/get-timetable-timetable.dto'; import { TransactionInterceptor } from 'src/common/interceptors/transaction.interceptor'; import { TransactionManager } from 'src/decorators/manager.decorator'; import { EntityManager } from 'typeorm'; import { SearchUserRequestDto } from './dto/search-user-query.dto'; import { FriendshipDocs } from 'src/decorators/docs/friendship.decorator'; import { GetReceivedFriendshipRequestCountDto } from './dto/get-received-friendship-request-count.dto'; +import { GetNullableTimetableResponseDto } from 'src/timetable/dto/get-nullable-timetable-response.dto'; @Controller('friendship') @ApiTags('friendship') @@ -64,7 +64,7 @@ export class FriendshipController { async getFriendTimetable( @User() user: AuthorizedUserDto, @Query() getFriendTimetableRequestDto: GetFriendTimetableRequestDto, - ): Promise { + ): Promise { return await this.friendshipService.getFriendTimetable( user.id, getFriendTimetableRequestDto, diff --git a/src/friendship/friendship.service.ts b/src/friendship/friendship.service.ts index 6d8bc99..7719e6b 100644 --- a/src/friendship/friendship.service.ts +++ b/src/friendship/friendship.service.ts @@ -11,7 +11,6 @@ import { FriendshipEntity } from 'src/entities/friendship.entity'; import { UserService } from 'src/user/user.service'; import { TimetableService } from 'src/timetable/timetable.service'; import { GetFriendTimetableRequestDto } from './dto/get-friend-timetable.dto'; -import { GetTimetableByTimetableIdDto } from 'src/timetable/dto/get-timetable-timetable.dto'; import { GetWaitingFriendResponseDto } from './dto/get-waiting-friend-response.dto'; import { EntityManager } from 'typeorm'; import { NoticeService } from 'src/notice/notice.service'; @@ -19,6 +18,7 @@ import { Notice } from 'src/notice/enum/notice.enum'; import { AuthorizedUserDto } from 'src/auth/dto/authorized-user-dto'; import { SearchUserRequestDto } from './dto/search-user-query.dto'; import { throwKukeyException } from 'src/utils/exception.util'; +import { GetNullableTimetableResponseDto } from 'src/timetable/dto/get-nullable-timetable-response.dto'; @Injectable() export class FriendshipService { @@ -367,7 +367,7 @@ export class FriendshipService { async getFriendTimetable( userId: number, getFriendTimetableRequestDto: GetFriendTimetableRequestDto, - ): Promise { + ): Promise { // username으로 친구정보 가져오기 const friend = await this.userService.findUserByUsername( getFriendTimetableRequestDto.username, @@ -397,9 +397,6 @@ export class FriendshipService { getFriendTimetableRequestDto.year, ); - if (!friendTimetable) { - throwKukeyException('FRIEND_TIMETABLE_NOT_FOUND'); - } return friendTimetable; } } diff --git a/src/timetable/dto/get-nullable-timetable-response.dto.ts b/src/timetable/dto/get-nullable-timetable-response.dto.ts new file mode 100644 index 0000000..1294bb1 --- /dev/null +++ b/src/timetable/dto/get-nullable-timetable-response.dto.ts @@ -0,0 +1,15 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { GetTimetableByTimetableIdDto } from './get-timetable-timetable.dto'; + +export class GetNullableTimetableResponseDto { + @ApiProperty({ + description: '특정 시간표 정보', + type: GetTimetableByTimetableIdDto, + nullable: true, + }) + timetable: GetTimetableByTimetableIdDto | null; + + constructor(timetable: GetTimetableByTimetableIdDto | null) { + this.timetable = timetable; + } +} diff --git a/src/timetable/timetable.controller.ts b/src/timetable/timetable.controller.ts index f39c507..413e097 100644 --- a/src/timetable/timetable.controller.ts +++ b/src/timetable/timetable.controller.ts @@ -22,13 +22,13 @@ import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { CreateTimetableCourseResponseDto } from './dto/create-timetable-course-response.dto'; import { CommonTimetableResponseDto } from './dto/common-timetable-response.dto'; import { CommonDeleteResponseDto } from './dto/common-delete-response.dto'; -import { GetTimetableByTimetableIdDto } from './dto/get-timetable-timetable.dto'; import { UpdateTimetableColorDto } from './dto/update-timetable-color.dto'; import { TransactionInterceptor } from 'src/common/interceptors/transaction.interceptor'; import { TransactionManager } from 'src/decorators/manager.decorator'; import { EntityManager } from 'typeorm'; import { TimetableDocs } from 'src/decorators/docs/timetable.decorator'; import { GetTodayTimetableResponse } from './dto/get-today-timetable-response.dto'; +import { GetNullableTimetableResponseDto } from './dto/get-nullable-timetable-response.dto'; @Controller('timetable') @ApiTags('timetable') @@ -98,7 +98,7 @@ export class TimetableController { async getTimetableByTimetableId( @Param('timetableId') timetableId: number, @User() user: AuthorizedUserDto, - ): Promise { + ): Promise { return await this.timetableService.getTimetableByTimetableId( timetableId, user.id, diff --git a/src/timetable/timetable.service.ts b/src/timetable/timetable.service.ts index 041cdec..abc5b26 100644 --- a/src/timetable/timetable.service.ts +++ b/src/timetable/timetable.service.ts @@ -19,6 +19,7 @@ import { DayType } from 'src/common/types/day-type.utils'; import { throwKukeyException } from 'src/utils/exception.util'; import { DeleteTimetableResponseDto } from './dto/delete-timetable-response.dto'; import { GetTodayTimetableResponse } from './dto/get-today-timetable-response.dto'; +import { GetNullableTimetableResponseDto } from './dto/get-nullable-timetable-response.dto'; @Injectable() export class TimetableService { @@ -226,7 +227,7 @@ export class TimetableService { async getTimetableByTimetableId( timetableId: number, userId: number, - ): Promise { + ): Promise { const timetable = await this.timetableRepository.findOne({ where: { id: timetableId, userId }, relations: [ @@ -235,8 +236,9 @@ export class TimetableService { 'timetableCourses.course.courseDetails', ], }); + if (!timetable) { - throwKukeyException('TIMETABLE_NOT_FOUND'); + return new GetNullableTimetableResponseDto(null); } const schedules = @@ -306,7 +308,9 @@ export class TimetableService { }); }); - return getTimetableByTimetableIdResponse; + return new GetNullableTimetableResponseDto( + getTimetableByTimetableIdResponse, + ); } async getTimetableByUserId( @@ -315,7 +319,11 @@ export class TimetableService { const userTimetable = await this.timetableRepository.find({ where: { userId }, }); - if (!userTimetable) throwKukeyException('TIMETABLE_NOT_FOUND'); + + if (!userTimetable) { + return []; + } + return userTimetable.map( (table) => new GetTimetableByUserIdResponseDto(table), ); @@ -326,7 +334,7 @@ export class TimetableService { friendId: number, semester: string, year: string, - ): Promise { + ): Promise { const timetable = await this.timetableRepository.findOne({ where: { userId: friendId, @@ -336,10 +344,7 @@ export class TimetableService { }, }); - // 시간표가 없을 경우 - if (!timetable) { - throwKukeyException('TIMETABLE_NOT_FOUND'); - } + if (!timetable) return new GetNullableTimetableResponseDto(null); // 시간표 id 추출 후 구현해놓은 함수 사용 const friendTimetableId = timetable.id; diff --git a/src/utils/exception.util.ts b/src/utils/exception.util.ts index 8b33203..0ced9ba 100644 --- a/src/utils/exception.util.ts +++ b/src/utils/exception.util.ts @@ -466,12 +466,6 @@ export const kukeyExceptions = createKukeyExceptions({ errorCode: 3409, statusCode: 500, }, - FRIEND_TIMETABLE_NOT_FOUND: { - name: 'FRIEND_TIMETABLE_NOT_FOUND', - message: "Friend's timetable not found.", - errorCode: 3410, - statusCode: 404, - }, // 4xxx : 커뮤니티 관련 예외 // - 40xx : Board BOARD_NOT_FOUND: {