From 37f4b6bb94a2f952fd93da0e894954e2d177c466 Mon Sep 17 00:00:00 2001 From: hodoon Date: Sun, 11 Jan 2026 23:40:53 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=90=EC=8B=A0=EC=9D=98=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EC=8A=A4=ED=8E=99=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserScheduleController.java | 32 ++++++++++-- .../UserScheduleControllerSpec.java | 22 ++++++-- .../DailyWorkScheduleInquiryRequestDto.java | 25 ++++++++++ .../MonthlyWorkScheduleInquiryRequestDto.java | 22 ++++++++ .../dto/MyScheduleMonthlyResponseDto.java | 19 +++++++ .../dto/WorkScheduleInquiryRequestDto.java | 3 ++ .../WorkspaceShiftQueryRepositoryImpl.java | 15 ++++++ .../workspace/usecase/GetMyDailySchedule.java | 38 ++++++++++++++ .../usecase/GetMyMonthlySchedule.java | 50 +++++++++++++++++++ .../inbound/GetMyDailyScheduleUseCase.java | 11 ++++ .../inbound/GetMyMonthlyScheduleUseCase.java | 9 ++++ .../WorkspaceShiftQueryRepository.java | 1 + 12 files changed, 241 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java create mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java create mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java create mode 100644 src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java create mode 100644 src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java create mode 100644 src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java create mode 100644 src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyMonthlyScheduleUseCase.java diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java index e98c9561..064c1337 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java @@ -1,11 +1,11 @@ package com.dreamteam.alter.adapter.inbound.general.schedule.controller; import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkspaceScheduleResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.*; import com.dreamteam.alter.application.aop.AppActionContext; import com.dreamteam.alter.domain.user.context.AppActor; +import com.dreamteam.alter.domain.workspace.port.inbound.GetMyDailyScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.inbound.GetMyMonthlyScheduleUseCase; import com.dreamteam.alter.domain.workspace.port.inbound.GetMyScheduleUseCase; import com.dreamteam.alter.domain.workspace.port.inbound.GetWorkspaceScheduleUseCase; import jakarta.annotation.Resource; @@ -27,6 +27,12 @@ public class UserScheduleController implements UserScheduleControllerSpec { @Resource(name = "getMyWorkSchedule") private final GetMyScheduleUseCase getMySchedule; + @Resource(name = "getMyDailySchedule") + private final GetMyDailyScheduleUseCase getMyDailySchedule; + + @Resource(name = "getMyMonthlySchedule") + private final GetMyMonthlyScheduleUseCase getMyMonthlySchedule; + @Resource(name = "getWorkspaceWorkSchedule") private final GetWorkspaceScheduleUseCase getWorkspaceSchedule; @@ -40,6 +46,26 @@ public ResponseEntity>> getMySched return ResponseEntity.ok(CommonApiResponse.of(getMySchedule.execute(actor, request))); } + @Override + @GetMapping("/self/monthly") + public ResponseEntity> getMyMonthlySchedule( + MonthlyWorkScheduleInquiryRequestDto request + ) { + AppActor actor = AppActionContext.getInstance().getActor(); + + return ResponseEntity.ok(CommonApiResponse.of(getMyMonthlySchedule.execute(actor, request))); + } + + @Override + @GetMapping("/self/daily") + public ResponseEntity>> getMyDailySchedule( + DailyWorkScheduleInquiryRequestDto request + ) { + AppActor actor = AppActionContext.getInstance().getActor(); + + return ResponseEntity.ok(CommonApiResponse.of(getMyDailySchedule.execute(actor, request))); + } + @Override @GetMapping("/workspaces/{workspaceId}") public ResponseEntity>> getWorkspaceSchedule( diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java index acca29d9..1cb2fe98 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java @@ -2,9 +2,7 @@ import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse; import com.dreamteam.alter.adapter.inbound.common.dto.ErrorResponse; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkspaceScheduleResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; @@ -29,6 +27,24 @@ ResponseEntity>> getMySchedule( WorkScheduleInquiryRequestDto request ); + @Operation(summary = "나의 월별 근무 스케쥴 조회", description = "특정 월의 총 근무시간과 스케줄 목록을 조회합니다. year, month 값을 모두 포함해야합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "월별 스케줄 조회 성공") + }) + ResponseEntity> getMyMonthlySchedule( + MonthlyWorkScheduleInquiryRequestDto request + ); + + @Operation(summary = "나의 일별 근무 스케줄 조회", description = "특정 일의 상세 스케줄 목록을 조회합니다. year, month, day 값을 모두 포함해야합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "일별 스케줄 조회 성공") + }) + ResponseEntity>> getMyDailySchedule( + DailyWorkScheduleInquiryRequestDto request + ); + + + @Operation(summary = "업장별 근무 스케줄 조회", description = "year, month 값을 모두 포함해야합니다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "스케줄 조회 성공"), diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java new file mode 100644 index 00000000..066e9135 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java @@ -0,0 +1,25 @@ +package com.dreamteam.alter.adapter.inbound.general.schedule.dto; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ParameterObject +@Schema(description = "일별 스케줄 조회 요청") +public class DailyWorkScheduleInquiryRequestDto { + + @Parameter(description = "조회할 연도", required = true, example = "2024") + private Integer year; + + @Parameter(description = "조회할 월", required = true, example = "5") + private Integer month; + + @Parameter(description = "조회할 일", required = true, example = "20") + private Integer day; +} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java new file mode 100644 index 00000000..482beb0c --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java @@ -0,0 +1,22 @@ +package com.dreamteam.alter.adapter.inbound.general.schedule.dto; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ParameterObject +@Schema(description = "월별 스케줄 조회 요청") +public class MonthlyWorkScheduleInquiryRequestDto { + + @Parameter(description = "조회할 연도", required = true, example = "2024") + private Integer year; + + @Parameter(description = "조회할 월", required = true, example = "5") + private Integer month; +} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java new file mode 100644 index 00000000..601ea21f --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java @@ -0,0 +1,19 @@ +package com.dreamteam.alter.adapter.inbound.general.schedule.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +@Getter +@Builder +@Schema(description = "내 월별 스케쥴 응답") +public class MyScheduleMonthlyResponseDto { + + @Schema(description = "월 총 근무시간", example = "160.5") + private double totalWorkHoursInMonth; + + @Schema(description = "월별 스케쥴 목록") + private List schedules; +} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/WorkScheduleInquiryRequestDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/WorkScheduleInquiryRequestDto.java index 91903d19..5c33239a 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/WorkScheduleInquiryRequestDto.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/WorkScheduleInquiryRequestDto.java @@ -17,4 +17,7 @@ public class WorkScheduleInquiryRequestDto { @Parameter(description = "조회할 월") private Integer month; + + @Parameter(description = "조회할 일 (일별 조회 시 사용)") + private Integer day; } diff --git a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceShiftQueryRepositoryImpl.java b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceShiftQueryRepositoryImpl.java index 906c1832..4680d0b8 100644 --- a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceShiftQueryRepositoryImpl.java +++ b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceShiftQueryRepositoryImpl.java @@ -48,6 +48,21 @@ public List findByUserAndWeeklyRange(User user, LocalDate startD .fetch(); } + @Override + public List findByUserAndDate(User user, int year, int month, int day) { + LocalDateTime startOfDay = LocalDateTime.of(year, month, day, 0, 0, 0); + LocalDateTime endOfDay = startOfDay.plusDays(1); + return queryFactory + .selectFrom(workspaceShift) + .where( + workspaceShift.assignedWorkspaceWorker.user.eq(user), + workspaceShift.startDateTime.goe(startOfDay), + workspaceShift.startDateTime.lt(endOfDay) + ) + .orderBy(workspaceShift.startDateTime.asc()) + .fetch(); + } + @Override public List findByWorkspaceAndDateRange(Workspace workspace, int year, int month) { return queryFactory diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java new file mode 100644 index 00000000..50b0d260 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java @@ -0,0 +1,38 @@ +package com.dreamteam.alter.application.workspace.usecase; + +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.DailyWorkScheduleInquiryRequestDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; +import com.dreamteam.alter.domain.user.context.AppActor; +import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; +import com.dreamteam.alter.domain.workspace.port.inbound.GetMyDailyScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; +import lombok.RequiredArgsConstructor; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service("getMyDailySchedule") +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GetMyDailySchedule implements GetMyDailyScheduleUseCase { + + private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; + + @Override + public List execute(AppActor actor, @MonotonicNonNull DailyWorkScheduleInquiryRequestDto request) { + + List dailyShifts = workspaceShiftQueryRepository.findByUserAndDate( + actor.getUser(), + request.getYear(), + request.getMonth(), + request.getDay() + ); + + return dailyShifts.stream() + .map(MyScheduleResponseDto::of) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java new file mode 100644 index 00000000..6732252a --- /dev/null +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java @@ -0,0 +1,50 @@ +package com.dreamteam.alter.application.workspace.usecase; + +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MonthlyWorkScheduleInquiryRequestDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleMonthlyResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; +import com.dreamteam.alter.domain.user.context.AppActor; +import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; +import com.dreamteam.alter.domain.workspace.port.inbound.GetMyMonthlyScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; +import lombok.RequiredArgsConstructor; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.Duration; +import java.util.List; + +@Service("getMyMonthlySchedule") +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class GetMyMonthlySchedule implements GetMyMonthlyScheduleUseCase { + + private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; + + @Override + public MyScheduleMonthlyResponseDto execute(AppActor actor, @MonotonicNonNull MonthlyWorkScheduleInquiryRequestDto request) { + + + List shifts = workspaceShiftQueryRepository.findByUserAndDateRange( + actor.getUser(), + request.getYear(), + request.getMonth() + ); + + double totalWorkHours = shifts.stream() + .mapToDouble(shift -> { + Duration duration = Duration.between(shift.getStartDateTime(), shift.getEndDateTime()); + return duration.toMinutes() / 60.0; + }) + .sum(); + + List scheduleDtos = shifts.stream() + .map(MyScheduleResponseDto::of) + .toList(); + return MyScheduleMonthlyResponseDto.builder() + .totalWorkHoursInMonth(totalWorkHours) + .schedules(scheduleDtos) + .build(); + } +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java new file mode 100644 index 00000000..7dfcaaee --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java @@ -0,0 +1,11 @@ +package com.dreamteam.alter.domain.workspace.port.inbound; + +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.DailyWorkScheduleInquiryRequestDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; +import com.dreamteam.alter.domain.user.context.AppActor; + +import java.util.List; + +public interface GetMyDailyScheduleUseCase { + List execute(AppActor actor, DailyWorkScheduleInquiryRequestDto request); +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyMonthlyScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyMonthlyScheduleUseCase.java new file mode 100644 index 00000000..d584da1c --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyMonthlyScheduleUseCase.java @@ -0,0 +1,9 @@ +package com.dreamteam.alter.domain.workspace.port.inbound; + +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MonthlyWorkScheduleInquiryRequestDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleMonthlyResponseDto; +import com.dreamteam.alter.domain.user.context.AppActor; + +public interface GetMyMonthlyScheduleUseCase { + MyScheduleMonthlyResponseDto execute(AppActor actor, MonthlyWorkScheduleInquiryRequestDto request); +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceShiftQueryRepository.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceShiftQueryRepository.java index 94ac6bd3..18180183 100644 --- a/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceShiftQueryRepository.java +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceShiftQueryRepository.java @@ -14,6 +14,7 @@ public interface WorkspaceShiftQueryRepository { List findByUserAndDateRange(User user, int year, int month); List findByUserAndWeeklyRange(User user, LocalDate startDate, LocalDate endDate); + List findByUserAndDate(User user, int year, int month, int day); List findByWorkspaceAndDateRange(Workspace workspace, int year, int month); List findByManagerAndDateRange(ManagerUser managerUser, Long workspaceId, int year, int month); Optional findById(Long id); From fb566505c2a3c5f355cb994aa5cef7e17396550a Mon Sep 17 00:00:00 2001 From: hodoon Date: Tue, 13 Jan 2026 22:45:45 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=90=EC=8B=A0=EC=9D=98=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserScheduleController.java | 37 +-------- .../UserScheduleControllerSpec.java | 25 ++---- .../DailyWorkScheduleInquiryRequestDto.java | 25 ------ .../MonthlyWorkScheduleInquiryRequestDto.java | 22 ------ .../dto/MyScheduleInquiryResponseDto.java | 27 +++++++ .../dto/MyScheduleMonthlyResponseDto.java | 19 ----- .../workspace/usecase/GetMyDailySchedule.java | 38 --------- .../usecase/GetMyMonthlySchedule.java | 50 ------------ .../workspace/usecase/GetMySchedule.java | 77 +++++++++++++++++++ .../inbound/GetMyDailyScheduleUseCase.java | 11 --- ....java => GetMyScheduleInquiryUseCase.java} | 8 +- 11 files changed, 117 insertions(+), 222 deletions(-) delete mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java delete mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java create mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleInquiryResponseDto.java delete mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java delete mode 100644 src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java delete mode 100644 src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java create mode 100644 src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java delete mode 100644 src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java rename src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/{GetMyMonthlyScheduleUseCase.java => GetMyScheduleInquiryUseCase.java} (53%) diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java index 064c1337..a44989e3 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java @@ -4,10 +4,7 @@ import com.dreamteam.alter.adapter.inbound.general.schedule.dto.*; import com.dreamteam.alter.application.aop.AppActionContext; import com.dreamteam.alter.domain.user.context.AppActor; -import com.dreamteam.alter.domain.workspace.port.inbound.GetMyDailyScheduleUseCase; -import com.dreamteam.alter.domain.workspace.port.inbound.GetMyMonthlyScheduleUseCase; -import com.dreamteam.alter.domain.workspace.port.inbound.GetMyScheduleUseCase; -import com.dreamteam.alter.domain.workspace.port.inbound.GetWorkspaceScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.inbound.*; import jakarta.annotation.Resource; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -24,21 +21,15 @@ @RequestMapping("/app/schedules") public class UserScheduleController implements UserScheduleControllerSpec { - @Resource(name = "getMyWorkSchedule") - private final GetMyScheduleUseCase getMySchedule; - - @Resource(name = "getMyDailySchedule") - private final GetMyDailyScheduleUseCase getMyDailySchedule; - - @Resource(name = "getMyMonthlySchedule") - private final GetMyMonthlyScheduleUseCase getMyMonthlySchedule; + @Resource(name = "getMySchedule") + private final GetMyScheduleInquiryUseCase getMySchedule; @Resource(name = "getWorkspaceWorkSchedule") private final GetWorkspaceScheduleUseCase getWorkspaceSchedule; @Override @GetMapping("/self") - public ResponseEntity>> getMySchedule( + public ResponseEntity> getMySchedule( WorkScheduleInquiryRequestDto request ) { AppActor actor = AppActionContext.getInstance().getActor(); @@ -46,26 +37,6 @@ public ResponseEntity>> getMySched return ResponseEntity.ok(CommonApiResponse.of(getMySchedule.execute(actor, request))); } - @Override - @GetMapping("/self/monthly") - public ResponseEntity> getMyMonthlySchedule( - MonthlyWorkScheduleInquiryRequestDto request - ) { - AppActor actor = AppActionContext.getInstance().getActor(); - - return ResponseEntity.ok(CommonApiResponse.of(getMyMonthlySchedule.execute(actor, request))); - } - - @Override - @GetMapping("/self/daily") - public ResponseEntity>> getMyDailySchedule( - DailyWorkScheduleInquiryRequestDto request - ) { - AppActor actor = AppActionContext.getInstance().getActor(); - - return ResponseEntity.ok(CommonApiResponse.of(getMyDailySchedule.execute(actor, request))); - } - @Override @GetMapping("/workspaces/{workspaceId}") public ResponseEntity>> getWorkspaceSchedule( diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java index 1cb2fe98..c8e511d4 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java @@ -19,32 +19,17 @@ @Tag(name = "APP - 근무 스케줄 관리 API") public interface UserScheduleControllerSpec { - @Operation(summary = "나의 근무 스케줄 조회", description = "특정 월의 스케줄을 조회하려면 year, month 값을 모두 포함해야합니다.") + @Operation(summary = "나의 근무 스케줄 조회", description = "파라미터 조합에 따라 조회가 달라집니다.
"+ + "- 인자 없음: 이번 주 스케줄 조회
" + + "- year, month: 해당 월 스케줄 조회
" + + "- year, month, day: 해당 일 스케줄 조회") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "스케줄 조회 성공") }) - ResponseEntity>> getMySchedule( + ResponseEntity> getMySchedule( WorkScheduleInquiryRequestDto request ); - @Operation(summary = "나의 월별 근무 스케쥴 조회", description = "특정 월의 총 근무시간과 스케줄 목록을 조회합니다. year, month 값을 모두 포함해야합니다.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "월별 스케줄 조회 성공") - }) - ResponseEntity> getMyMonthlySchedule( - MonthlyWorkScheduleInquiryRequestDto request - ); - - @Operation(summary = "나의 일별 근무 스케줄 조회", description = "특정 일의 상세 스케줄 목록을 조회합니다. year, month, day 값을 모두 포함해야합니다.") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "일별 스케줄 조회 성공") - }) - ResponseEntity>> getMyDailySchedule( - DailyWorkScheduleInquiryRequestDto request - ); - - - @Operation(summary = "업장별 근무 스케줄 조회", description = "year, month 값을 모두 포함해야합니다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "스케줄 조회 성공"), diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java deleted file mode 100644 index 066e9135..00000000 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/DailyWorkScheduleInquiryRequestDto.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dreamteam.alter.adapter.inbound.general.schedule.dto; - -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springdoc.core.annotations.ParameterObject; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@ParameterObject -@Schema(description = "일별 스케줄 조회 요청") -public class DailyWorkScheduleInquiryRequestDto { - - @Parameter(description = "조회할 연도", required = true, example = "2024") - private Integer year; - - @Parameter(description = "조회할 월", required = true, example = "5") - private Integer month; - - @Parameter(description = "조회할 일", required = true, example = "20") - private Integer day; -} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java deleted file mode 100644 index 482beb0c..00000000 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MonthlyWorkScheduleInquiryRequestDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dreamteam.alter.adapter.inbound.general.schedule.dto; - -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import org.springdoc.core.annotations.ParameterObject; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@ParameterObject -@Schema(description = "월별 스케줄 조회 요청") -public class MonthlyWorkScheduleInquiryRequestDto { - - @Parameter(description = "조회할 연도", required = true, example = "2024") - private Integer year; - - @Parameter(description = "조회할 월", required = true, example = "5") - private Integer month; -} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleInquiryResponseDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleInquiryResponseDto.java new file mode 100644 index 00000000..703dd266 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleInquiryResponseDto.java @@ -0,0 +1,27 @@ +package com.dreamteam.alter.adapter.inbound.general.schedule.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.util.List; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder(access = AccessLevel.PRIVATE) +@Schema(description = "스케줄 조회 통합 응답") +public class MyScheduleInquiryResponseDto { + + @Schema(description = "총 근무 시간", example = "40.5") + private double totalWorkHours; + + @Schema(description = "스케줄 목록") + private List schedules; + + public static MyScheduleInquiryResponseDto of(double totalWorkHours, List schedules) { + return MyScheduleInquiryResponseDto.builder() + .totalWorkHours(totalWorkHours) + .schedules(schedules) + .build(); + } +} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java deleted file mode 100644 index 601ea21f..00000000 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleMonthlyResponseDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dreamteam.alter.adapter.inbound.general.schedule.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Builder; -import lombok.Getter; - -import java.util.List; - -@Getter -@Builder -@Schema(description = "내 월별 스케쥴 응답") -public class MyScheduleMonthlyResponseDto { - - @Schema(description = "월 총 근무시간", example = "160.5") - private double totalWorkHoursInMonth; - - @Schema(description = "월별 스케쥴 목록") - private List schedules; -} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java deleted file mode 100644 index 50b0d260..00000000 --- a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyDailySchedule.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dreamteam.alter.application.workspace.usecase; - -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.DailyWorkScheduleInquiryRequestDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; -import com.dreamteam.alter.domain.user.context.AppActor; -import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; -import com.dreamteam.alter.domain.workspace.port.inbound.GetMyDailyScheduleUseCase; -import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; -import lombok.RequiredArgsConstructor; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -@Service("getMyDailySchedule") -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class GetMyDailySchedule implements GetMyDailyScheduleUseCase { - - private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; - - @Override - public List execute(AppActor actor, @MonotonicNonNull DailyWorkScheduleInquiryRequestDto request) { - - List dailyShifts = workspaceShiftQueryRepository.findByUserAndDate( - actor.getUser(), - request.getYear(), - request.getMonth(), - request.getDay() - ); - - return dailyShifts.stream() - .map(MyScheduleResponseDto::of) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java deleted file mode 100644 index 6732252a..00000000 --- a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyMonthlySchedule.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.dreamteam.alter.application.workspace.usecase; - -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MonthlyWorkScheduleInquiryRequestDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleMonthlyResponseDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; -import com.dreamteam.alter.domain.user.context.AppActor; -import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; -import com.dreamteam.alter.domain.workspace.port.inbound.GetMyMonthlyScheduleUseCase; -import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; -import lombok.RequiredArgsConstructor; -import org.checkerframework.checker.nullness.qual.MonotonicNonNull; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.Duration; -import java.util.List; - -@Service("getMyMonthlySchedule") -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class GetMyMonthlySchedule implements GetMyMonthlyScheduleUseCase { - - private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; - - @Override - public MyScheduleMonthlyResponseDto execute(AppActor actor, @MonotonicNonNull MonthlyWorkScheduleInquiryRequestDto request) { - - - List shifts = workspaceShiftQueryRepository.findByUserAndDateRange( - actor.getUser(), - request.getYear(), - request.getMonth() - ); - - double totalWorkHours = shifts.stream() - .mapToDouble(shift -> { - Duration duration = Duration.between(shift.getStartDateTime(), shift.getEndDateTime()); - return duration.toMinutes() / 60.0; - }) - .sum(); - - List scheduleDtos = shifts.stream() - .map(MyScheduleResponseDto::of) - .toList(); - return MyScheduleMonthlyResponseDto.builder() - .totalWorkHoursInMonth(totalWorkHours) - .schedules(scheduleDtos) - .build(); - } -} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java new file mode 100644 index 00000000..3833943d --- /dev/null +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java @@ -0,0 +1,77 @@ +package com.dreamteam.alter.application.workspace.usecase; + +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleInquiryResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; +import com.dreamteam.alter.common.exception.CustomException; +import com.dreamteam.alter.common.exception.ErrorCode; +import com.dreamteam.alter.domain.user.context.AppActor; +import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; +import com.dreamteam.alter.domain.workspace.port.inbound.GetMyScheduleInquiryUseCase; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.DayOfWeek; +import java.time.Duration; +import java.time.LocalDate; +import java.time.temporal.TemporalAdjusters; +import java.util.List; + +@Service("getMySchedule") +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class GetMySchedule implements GetMyScheduleInquiryUseCase { + + private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; + + @Override + public MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request) { + + List shifts; + + if (request.getYear() != null && request.getMonth() != null && request.getDay() != null) { + shifts = workspaceShiftQueryRepository.findByUserAndDate( + actor.getUser(), + request.getYear(), + request.getMonth(), + request.getDay() + ); + + } else if (request.getYear() != null && request.getMonth() != null) { + shifts = workspaceShiftQueryRepository.findByUserAndDateRange( + actor.getUser(), + request.getYear(), + request.getMonth() + ); + + } else if (request.getYear() == null && request.getMonth() == null && request.getDay() == null) { + LocalDate now = LocalDate.now(); + LocalDate startOfWeek = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); + LocalDate endOfWeek = now.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); + + shifts = workspaceShiftQueryRepository.findByUserAndWeeklyRange( + actor.getUser(), + startOfWeek, + endOfWeek + ); + + } else { + throw new CustomException(ErrorCode.ILLEGAL_ARGUMENT, "연단위 요청은 불가능합니다."); + } + + double totalWorkHours = shifts.stream() + .mapToDouble(shift -> { + Duration duration = Duration.between(shift.getStartDateTime(), shift.getEndDateTime()); + return duration.toMinutes() / 60.0; + }) + .sum(); + + List scheduleDtos = shifts.stream() + .map(MyScheduleResponseDto::of) + .toList(); + + return MyScheduleInquiryResponseDto.of(totalWorkHours, scheduleDtos); + } +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java deleted file mode 100644 index 7dfcaaee..00000000 --- a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyDailyScheduleUseCase.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dreamteam.alter.domain.workspace.port.inbound; - -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.DailyWorkScheduleInquiryRequestDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; -import com.dreamteam.alter.domain.user.context.AppActor; - -import java.util.List; - -public interface GetMyDailyScheduleUseCase { - List execute(AppActor actor, DailyWorkScheduleInquiryRequestDto request); -} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyMonthlyScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleInquiryUseCase.java similarity index 53% rename from src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyMonthlyScheduleUseCase.java rename to src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleInquiryUseCase.java index d584da1c..d510671e 100644 --- a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyMonthlyScheduleUseCase.java +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleInquiryUseCase.java @@ -1,9 +1,9 @@ package com.dreamteam.alter.domain.workspace.port.inbound; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MonthlyWorkScheduleInquiryRequestDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleMonthlyResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleInquiryResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; import com.dreamteam.alter.domain.user.context.AppActor; -public interface GetMyMonthlyScheduleUseCase { - MyScheduleMonthlyResponseDto execute(AppActor actor, MonthlyWorkScheduleInquiryRequestDto request); +public interface GetMyScheduleInquiryUseCase { + MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request); } From 9f1939c59244977e6e06470e67f359423b108fcd Mon Sep 17 00:00:00 2001 From: hodoon Date: Mon, 19 Jan 2026 14:40:14 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=90=EC=8B=A0=EC=9D=98=20=EC=8A=A4=EC=BC=80=EC=A4=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API=20=EB=B6=84=EA=B8=B0=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20null=20check=20ObjectUtils=EC=82=AC=EC=9A=A9,=20usecase=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserScheduleController.java | 2 +- .../workspace/usecase/GetMySchedule.java | 14 +++--- .../workspace/usecase/GetMyWorkSchedule.java | 43 ------------------- .../inbound/GetMyScheduleInquiryUseCase.java | 9 ---- .../port/inbound/GetMyScheduleUseCase.java | 6 +-- 5 files changed, 12 insertions(+), 62 deletions(-) delete mode 100644 src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyWorkSchedule.java delete mode 100644 src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleInquiryUseCase.java diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java index a44989e3..7c101e11 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java @@ -22,7 +22,7 @@ public class UserScheduleController implements UserScheduleControllerSpec { @Resource(name = "getMySchedule") - private final GetMyScheduleInquiryUseCase getMySchedule; + private final GetMyScheduleUseCase getMySchedule; @Resource(name = "getWorkspaceWorkSchedule") private final GetWorkspaceScheduleUseCase getWorkspaceSchedule; diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java index 3833943d..e45aabbd 100644 --- a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java @@ -7,9 +7,10 @@ import com.dreamteam.alter.common.exception.ErrorCode; import com.dreamteam.alter.domain.user.context.AppActor; import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; -import com.dreamteam.alter.domain.workspace.port.inbound.GetMyScheduleInquiryUseCase; +import com.dreamteam.alter.domain.workspace.port.inbound.GetMyScheduleUseCase; import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,7 +23,7 @@ @Service("getMySchedule") @Transactional(readOnly = true) @RequiredArgsConstructor -public class GetMySchedule implements GetMyScheduleInquiryUseCase { +public class GetMySchedule implements GetMyScheduleUseCase { private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; @@ -31,7 +32,8 @@ public MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryR List shifts; - if (request.getYear() != null && request.getMonth() != null && request.getDay() != null) { + if (ObjectUtils.isNotEmpty(request.getYear()) && ObjectUtils.isNotEmpty(request.getMonth()) && ObjectUtils.isNotEmpty(request.getDay())) { + // 1. 년/월/일 포함 -> 일별 조회 shifts = workspaceShiftQueryRepository.findByUserAndDate( actor.getUser(), request.getYear(), @@ -39,14 +41,16 @@ public MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryR request.getDay() ); - } else if (request.getYear() != null && request.getMonth() != null) { + } else if (ObjectUtils.isNotEmpty(request.getYear()) && ObjectUtils.isNotEmpty(request.getMonth())) { + // 2. 년/월 포함 -> 월별 조회 shifts = workspaceShiftQueryRepository.findByUserAndDateRange( actor.getUser(), request.getYear(), request.getMonth() ); - } else if (request.getYear() == null && request.getMonth() == null && request.getDay() == null) { + } else if (ObjectUtils.isEmpty(request.getYear()) && ObjectUtils.isEmpty(request.getMonth()) && ObjectUtils.isEmpty(request.getDay())) { + // 3. 인자 없음 -> 이번 주 스케줄 조회 (월~일) LocalDate now = LocalDate.now(); LocalDate startOfWeek = now.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); LocalDate endOfWeek = now.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyWorkSchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyWorkSchedule.java deleted file mode 100644 index a4573f0c..00000000 --- a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMyWorkSchedule.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dreamteam.alter.application.workspace.usecase; - -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; -import com.dreamteam.alter.domain.user.context.AppActor; -import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; -import com.dreamteam.alter.domain.workspace.port.inbound.GetMyScheduleUseCase; -import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; -import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.util.List; - -@Service("getMyWorkSchedule") -@RequiredArgsConstructor -@Transactional(readOnly = true) -public class GetMyWorkSchedule implements GetMyScheduleUseCase { - - private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; - - @Override - public List execute(AppActor actor, WorkScheduleInquiryRequestDto request) { - List shifts; - - if (ObjectUtils.isEmpty(request.getYear()) || ObjectUtils.isEmpty(request.getMonth())) { - // 날짜 정보가 null인 경우: 일주일 범위 조회 - LocalDate startOfWeek = LocalDate.now(); - LocalDate endOfWeek = startOfWeek.plusDays(7); - - shifts = workspaceShiftQueryRepository.findByUserAndWeeklyRange(actor.getUser(), startOfWeek, endOfWeek); - } else { - // 날짜 정보가 제공된 경우: 해당 월의 일정 조회 - shifts = workspaceShiftQueryRepository.findByUserAndDateRange(actor.getUser(), request.getYear(), request.getMonth()); - } - - return shifts.stream() - .map(MyScheduleResponseDto::of) - .toList(); - } -} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleInquiryUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleInquiryUseCase.java deleted file mode 100644 index d510671e..00000000 --- a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleInquiryUseCase.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dreamteam.alter.domain.workspace.port.inbound; - -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleInquiryResponseDto; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; -import com.dreamteam.alter.domain.user.context.AppActor; - -public interface GetMyScheduleInquiryUseCase { - MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request); -} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java index 5ed1b809..af03664a 100644 --- a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java @@ -1,11 +1,9 @@ package com.dreamteam.alter.domain.workspace.port.inbound; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleInquiryResponseDto; import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; import com.dreamteam.alter.domain.user.context.AppActor; -import java.util.List; - public interface GetMyScheduleUseCase { - List execute(AppActor actor, WorkScheduleInquiryRequestDto request); + MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request); } From 87acf51bdee56623ca539d37676869f69f39c155 Mon Sep 17 00:00:00 2001 From: hodoon Date: Mon, 19 Jan 2026 14:43:35 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor:=20=EC=9D=91=EB=8B=B5=20DTO=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=AA=85=20=EB=8B=A8=EC=88=9C?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../general/schedule/controller/UserScheduleController.java | 2 +- .../schedule/controller/UserScheduleControllerSpec.java | 2 +- ...nquiryResponseDto.java => GetMyScheduleResponseDto.java} | 6 +++--- .../alter/application/workspace/usecase/GetMySchedule.java | 6 +++--- .../domain/workspace/port/inbound/GetMyScheduleUseCase.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/{MyScheduleInquiryResponseDto.java => GetMyScheduleResponseDto.java} (76%) diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java index 7c101e11..43135341 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleController.java @@ -29,7 +29,7 @@ public class UserScheduleController implements UserScheduleControllerSpec { @Override @GetMapping("/self") - public ResponseEntity> getMySchedule( + public ResponseEntity> getMySchedule( WorkScheduleInquiryRequestDto request ) { AppActor actor = AppActionContext.getInstance().getActor(); diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java index c8e511d4..8f425267 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/controller/UserScheduleControllerSpec.java @@ -26,7 +26,7 @@ public interface UserScheduleControllerSpec { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "스케줄 조회 성공") }) - ResponseEntity> getMySchedule( + ResponseEntity> getMySchedule( WorkScheduleInquiryRequestDto request ); diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleInquiryResponseDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/GetMyScheduleResponseDto.java similarity index 76% rename from src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleInquiryResponseDto.java rename to src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/GetMyScheduleResponseDto.java index 703dd266..58270684 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/MyScheduleInquiryResponseDto.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/general/schedule/dto/GetMyScheduleResponseDto.java @@ -10,7 +10,7 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder(access = AccessLevel.PRIVATE) @Schema(description = "스케줄 조회 통합 응답") -public class MyScheduleInquiryResponseDto { +public class GetMyScheduleResponseDto { @Schema(description = "총 근무 시간", example = "40.5") private double totalWorkHours; @@ -18,8 +18,8 @@ public class MyScheduleInquiryResponseDto { @Schema(description = "스케줄 목록") private List schedules; - public static MyScheduleInquiryResponseDto of(double totalWorkHours, List schedules) { - return MyScheduleInquiryResponseDto.builder() + public static GetMyScheduleResponseDto of(double totalWorkHours, List schedules) { + return GetMyScheduleResponseDto.builder() .totalWorkHours(totalWorkHours) .schedules(schedules) .build(); diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java index e45aabbd..f0e1b2f7 100644 --- a/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/GetMySchedule.java @@ -1,6 +1,6 @@ package com.dreamteam.alter.application.workspace.usecase; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleInquiryResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.GetMyScheduleResponseDto; import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleResponseDto; import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; import com.dreamteam.alter.common.exception.CustomException; @@ -28,7 +28,7 @@ public class GetMySchedule implements GetMyScheduleUseCase { private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; @Override - public MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request) { + public GetMyScheduleResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request) { List shifts; @@ -76,6 +76,6 @@ public MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryR .map(MyScheduleResponseDto::of) .toList(); - return MyScheduleInquiryResponseDto.of(totalWorkHours, scheduleDtos); + return GetMyScheduleResponseDto.of(totalWorkHours, scheduleDtos); } } diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java index af03664a..e92f0a8f 100644 --- a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/GetMyScheduleUseCase.java @@ -1,9 +1,9 @@ package com.dreamteam.alter.domain.workspace.port.inbound; -import com.dreamteam.alter.adapter.inbound.general.schedule.dto.MyScheduleInquiryResponseDto; +import com.dreamteam.alter.adapter.inbound.general.schedule.dto.GetMyScheduleResponseDto; import com.dreamteam.alter.adapter.inbound.general.schedule.dto.WorkScheduleInquiryRequestDto; import com.dreamteam.alter.domain.user.context.AppActor; public interface GetMyScheduleUseCase { - MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request); + GetMyScheduleResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request); }