From d598db7321688a3d4658b3a3e02c986caa8e8d14 Mon Sep 17 00:00:00 2001 From: Choi Junyoung Date: Wed, 15 Apr 2026 22:09:10 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=EA=B8=88=EC=9D=BC=20=EC=8A=A4?= =?UTF-8?q?=EC=BC=80=EC=A4=84=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ManagerScheduleController.java | 13 ++++++ .../ManagerScheduleControllerSpec.java | 10 +++++ .../dto/ManagerTodayScheduleResponseDto.java | 40 +++++++++++++++++ .../WorkspaceShiftQueryRepositoryImpl.java | 37 ++++++++++++++++ .../ManagerGetDailyWorkScheduleList.java | 43 +++++++++++++++++++ .../model/WorkspaceShiftTodayResponse.java | 11 +++++ .../ManagerGetDailyScheduleListUseCase.java | 10 +++++ .../WorkspaceShiftQueryRepository.java | 3 ++ 8 files changed, 167 insertions(+) create mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java create mode 100644 src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java create mode 100644 src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java create mode 100644 src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerGetDailyScheduleListUseCase.java diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleController.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleController.java index 9f032ee9..9bbaabfc 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleController.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleController.java @@ -5,6 +5,7 @@ import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.CreateWorkScheduleRequestDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerWorkScheduleInquiryRequestDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerScheduleResponseDto; +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerTodayScheduleResponseDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.UpdateWorkScheduleRequestDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.UpdateWorkerRequestDto; import com.dreamteam.alter.application.aop.ManagerActionContext; @@ -48,6 +49,9 @@ public class ManagerScheduleController implements ManagerScheduleControllerSpec @Resource(name = "managerRemoveWorkerFromSchedule") private final ManagerRemoveWorkerUseCase managerRemoveWorker; + @Resource(name = "managerGetTodayWorkScheduleList") + private final ManagerGetDailyScheduleListUseCase managerGetTodayScheduleList; + @Override @PostMapping public ResponseEntity> createSchedule( @@ -68,6 +72,15 @@ public ResponseEntity>> getSc return ResponseEntity.ok(CommonApiResponse.of(managerGetScheduleList.execute(actor, request.getWorkspaceId(), request.getYear(), request.getMonth()))); } + @Override + @GetMapping("/today") + public ResponseEntity>> getTodayScheduleList( + @RequestParam Long workspaceId + ) { + ManagerActor actor = ManagerActionContext.getInstance().getActor(); + return ResponseEntity.ok(CommonApiResponse.of(managerGetTodayScheduleList.execute(actor, workspaceId))); + } + @Override @PutMapping("/{workShiftId}") public ResponseEntity> updateSchedule( diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java index 1a32b1a5..6820e22b 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java @@ -4,6 +4,7 @@ import com.dreamteam.alter.adapter.inbound.common.dto.ErrorResponse; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.AssignWorkerRequestDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.CreateWorkScheduleRequestDto; +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerTodayScheduleResponseDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerWorkScheduleInquiryRequestDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerScheduleResponseDto; import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.UpdateWorkScheduleRequestDto; @@ -51,6 +52,15 @@ ResponseEntity>> getScheduleL ManagerWorkScheduleInquiryRequestDto request ); + @Operation(summary = "금일 스케줄 목록 조회", description = "특정 워크스페이스의 오늘 날짜 스케줄 목록을 조회합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "금일 스케줄 목록 조회 성공") + }) + ResponseEntity>> getTodayScheduleList( + @Parameter(description = "워크스페이스 ID", example = "1", required = true) + @RequestParam Long workspaceId + ); + @Operation(summary = "스케줄 수정", description = "기존 스케줄의 정보를 수정합니다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "스케줄 수정 성공"), diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java new file mode 100644 index 00000000..980d9653 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java @@ -0,0 +1,40 @@ +package com.dreamteam.alter.adapter.inbound.manager.schedule.dto; + +import com.dreamteam.alter.domain.workspace.model.WorkspaceShiftTodayResponse; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder(access = AccessLevel.PRIVATE) +@Schema(description = "매니저 금일 스케줄 응답") +public class ManagerTodayScheduleResponseDto { + + @Schema(description = "스케줄 ID", example = "1") + private Long shiftId; + + @Schema(description = "근무자 이름", example = "홍길동") + private String workerName; + + @Schema(description = "근무자 프로필 이미지 S3 URL") + private String profileImageUrl; + + @Schema(description = "근무 시작 시간", example = "2024-01-15T09:00:00") + private LocalDateTime startDateTime; + + @Schema(description = "근무 종료 시간", example = "2024-01-15T18:00:00") + private LocalDateTime endDateTime; + + public static ManagerTodayScheduleResponseDto of(WorkspaceShiftTodayResponse entity) { + return ManagerTodayScheduleResponseDto.builder() + .shiftId(entity.shiftId()) + .workerName(entity.workerName()) + .profileImageUrl(entity.profileImageUrl()) + .startDateTime(entity.startDateTime()) + .endDateTime(entity.endDateTime()) + .build(); + } +} 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 0fd1b84c..8377ca88 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 @@ -1,12 +1,16 @@ package com.dreamteam.alter.adapter.outbound.workspace.persistence; +import com.dreamteam.alter.domain.file.type.FileStatus; +import com.dreamteam.alter.domain.file.type.FileTargetType; import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorker; import com.dreamteam.alter.domain.user.entity.ManagerUser; import com.dreamteam.alter.domain.user.entity.User; import com.dreamteam.alter.domain.workspace.entity.Workspace; import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; +import com.dreamteam.alter.domain.workspace.model.WorkspaceShiftTodayResponse; import com.dreamteam.alter.domain.workspace.type.WorkspaceShiftStatus; import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; +import com.querydsl.core.types.Projections; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -16,7 +20,10 @@ import java.util.List; import java.util.Optional; +import static com.dreamteam.alter.domain.file.entity.QFile.file; +import static com.dreamteam.alter.domain.user.entity.QUser.user; import static com.dreamteam.alter.domain.workspace.entity.QWorkspaceShift.workspaceShift; +import static com.dreamteam.alter.domain.workspace.entity.QWorkspaceWorker.workspaceWorker; @Repository @RequiredArgsConstructor @@ -24,6 +31,36 @@ public class WorkspaceShiftQueryRepositoryImpl implements WorkspaceShiftQueryRep private final JPAQueryFactory queryFactory; + @Override + public List getTodayShiftList( + Long workspaceId + ) { + LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); + LocalDateTime endOfDay = startOfDay.plusDays(1); + return queryFactory + .select(Projections.constructor(WorkspaceShiftTodayResponse.class, + workspaceShift.id, + user.name, + file.fileUrl, + workspaceShift.startDateTime, + workspaceShift.endDateTime + )) + .from(workspaceShift) + .leftJoin(workspaceShift.assignedWorkspaceWorker, workspaceWorker) + .leftJoin(workspaceWorker.user, user) + .leftJoin(file).on( + file.targetType.eq(FileTargetType.USER_PROFILE) + .and(file.targetId.eq(user.id.stringValue())) + .and(file.status.eq(FileStatus.ATTACHED)) + ) + .where(workspaceShift.workspace.id.eq(workspaceId) + .and(workspaceShift.startDateTime.goe(startOfDay)) + .and(workspaceShift.startDateTime.lt(endOfDay)) + .and(workspaceShift.status.ne(WorkspaceShiftStatus.DELETED))) + .orderBy(workspaceShift.startDateTime.asc()) + .fetch(); + } + @Override public List findByUserAndDateRange(User user, int year, int month) { return queryFactory diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java new file mode 100644 index 00000000..a12f0cf1 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java @@ -0,0 +1,43 @@ +package com.dreamteam.alter.application.workspace.usecase; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerTodayScheduleResponseDto; +import com.dreamteam.alter.common.exception.CustomException; +import com.dreamteam.alter.common.exception.ErrorCode; +import com.dreamteam.alter.domain.user.context.ManagerActor; +import com.dreamteam.alter.domain.workspace.entity.Workspace; +import com.dreamteam.alter.domain.workspace.port.inbound.ManagerGetDailyScheduleListUseCase; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceQueryRepository; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; + +import lombok.RequiredArgsConstructor; + +@Service("managerGetTodayWorkScheduleList") +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class ManagerGetDailyWorkScheduleList implements ManagerGetDailyScheduleListUseCase { + + private final WorkspaceShiftQueryRepository workspaceShiftQueryRepository; + private final WorkspaceQueryRepository workspaceQueryRepository; + + @Override + public List execute(ManagerActor actor, Long workspaceId) { + Optional workspace = workspaceQueryRepository.findById(workspaceId); + if (workspace.isEmpty()) { + throw new CustomException(ErrorCode.WORKSPACE_NOT_FOUND); + } + + if (!workspace.get().getManagerUser().equals(actor.getManagerUser())) { + throw new CustomException(ErrorCode.FORBIDDEN, "관리 중인 업장이 아닙니다."); + } + + return workspaceShiftQueryRepository.getTodayShiftList(workspaceId).stream() + .map(ManagerTodayScheduleResponseDto::of) + .toList(); + } +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java b/src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java new file mode 100644 index 00000000..199e8d83 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java @@ -0,0 +1,11 @@ +package com.dreamteam.alter.domain.workspace.model; + +import java.time.LocalDateTime; + +public record WorkspaceShiftTodayResponse( + Long shiftId, + String workerName, + String profileImageUrl, + LocalDateTime startDateTime, + LocalDateTime endDateTime +) {} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerGetDailyScheduleListUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerGetDailyScheduleListUseCase.java new file mode 100644 index 00000000..848718fd --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerGetDailyScheduleListUseCase.java @@ -0,0 +1,10 @@ +package com.dreamteam.alter.domain.workspace.port.inbound; + +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.ManagerTodayScheduleResponseDto; +import com.dreamteam.alter.domain.user.context.ManagerActor; + +import java.util.List; + +public interface ManagerGetDailyScheduleListUseCase { + List execute(ManagerActor actor, Long workspaceId); +} 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 3fa43c7b..22d25d0f 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 @@ -5,6 +5,7 @@ import com.dreamteam.alter.domain.user.entity.User; import com.dreamteam.alter.domain.workspace.entity.Workspace; import com.dreamteam.alter.domain.workspace.entity.WorkspaceShift; +import com.dreamteam.alter.domain.workspace.model.WorkspaceShiftTodayResponse; import java.time.LocalDate; import java.time.LocalDateTime; @@ -12,6 +13,8 @@ import java.util.Optional; public interface WorkspaceShiftQueryRepository { + List getTodayShiftList(Long workspaceId); + 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); From 68c85af674d757d5532961a13e1b2edd1895d3ec Mon Sep 17 00:00:00 2001 From: Choi Junyoung Date: Wed, 15 Apr 2026 22:14:19 +0900 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=EA=B2=80=EC=A6=9D=20exists=EB=A1=9C?= =?UTF-8?q?=20=EC=B6=95=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/ManagerGetDailyWorkScheduleList.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java index a12f0cf1..16094279 100644 --- a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java @@ -1,7 +1,6 @@ package com.dreamteam.alter.application.workspace.usecase; import java.util.List; -import java.util.Optional; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -10,7 +9,6 @@ import com.dreamteam.alter.common.exception.CustomException; import com.dreamteam.alter.common.exception.ErrorCode; import com.dreamteam.alter.domain.user.context.ManagerActor; -import com.dreamteam.alter.domain.workspace.entity.Workspace; import com.dreamteam.alter.domain.workspace.port.inbound.ManagerGetDailyScheduleListUseCase; import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceQueryRepository; import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceShiftQueryRepository; @@ -27,15 +25,10 @@ public class ManagerGetDailyWorkScheduleList implements ManagerGetDailyScheduleL @Override public List execute(ManagerActor actor, Long workspaceId) { - Optional workspace = workspaceQueryRepository.findById(workspaceId); - if (workspace.isEmpty()) { + if (!workspaceQueryRepository.existsByIdAndManagerUser(workspaceId, actor.getManagerUser())) { throw new CustomException(ErrorCode.WORKSPACE_NOT_FOUND); } - if (!workspace.get().getManagerUser().equals(actor.getManagerUser())) { - throw new CustomException(ErrorCode.FORBIDDEN, "관리 중인 업장이 아닙니다."); - } - return workspaceShiftQueryRepository.getTodayShiftList(workspaceId).stream() .map(ManagerTodayScheduleResponseDto::of) .toList(); From 05bdef52b195d54ac4bd94728a20784e6ebb3196 Mon Sep 17 00:00:00 2001 From: Choi Junyoung Date: Wed, 15 Apr 2026 22:21:10 +0900 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20workspaceShift=20=EC=83=81=ED=83=9C?= =?UTF-8?q?=20=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/WorkspaceShiftQueryRepositoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8377ca88..a94dbf58 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 @@ -56,7 +56,7 @@ public List getTodayShiftList( .where(workspaceShift.workspace.id.eq(workspaceId) .and(workspaceShift.startDateTime.goe(startOfDay)) .and(workspaceShift.startDateTime.lt(endOfDay)) - .and(workspaceShift.status.ne(WorkspaceShiftStatus.DELETED))) + .and(workspaceShift.status.eq(WorkspaceShiftStatus.CONFIRMED))) .orderBy(workspaceShift.startDateTime.asc()) .fetch(); } From c129f8913639f75bede94c60c513e9870973ee31 Mon Sep 17 00:00:00 2001 From: Choi Junyoung Date: Wed, 15 Apr 2026 22:22:31 +0900 Subject: [PATCH 4/7] =?UTF-8?q?fix:=20swagger=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/controller/ManagerScheduleControllerSpec.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java index 6820e22b..ba7dd657 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerScheduleControllerSpec.java @@ -54,7 +54,8 @@ ResponseEntity>> getScheduleL @Operation(summary = "금일 스케줄 목록 조회", description = "특정 워크스페이스의 오늘 날짜 스케줄 목록을 조회합니다.") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "금일 스케줄 목록 조회 성공") + @ApiResponse(responseCode = "200", description = "금일 스케줄 목록 조회 성공"), + @ApiResponse(responseCode = "404", description = "해당 워크스페이스 찾을 수 없음") }) ResponseEntity>> getTodayScheduleList( @Parameter(description = "워크스페이스 ID", example = "1", required = true) From f86acef802244fca7d26625db2657c3c5989da15 Mon Sep 17 00:00:00 2001 From: Choi Junyoung Date: Mon, 20 Apr 2026 19:22:48 +0900 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=EC=A1=B0=ED=9A=8C=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EA=B7=B8=EB=A3=B9=ED=95=91=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workspace/persistence/WorkspaceShiftQueryRepositoryImpl.java | 1 + 1 file changed, 1 insertion(+) 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 a94dbf58..8f080c69 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 @@ -57,6 +57,7 @@ public List getTodayShiftList( .and(workspaceShift.startDateTime.goe(startOfDay)) .and(workspaceShift.startDateTime.lt(endOfDay)) .and(workspaceShift.status.eq(WorkspaceShiftStatus.CONFIRMED))) + .groupBy(user.id) .orderBy(workspaceShift.startDateTime.asc()) .fetch(); } From db5e562c8e6b58fe05070b3b059b6dad77e14871 Mon Sep 17 00:00:00 2001 From: Choi Junyoung Date: Mon, 20 Apr 2026 19:30:43 +0900 Subject: [PATCH 6/7] =?UTF-8?q?fix:=20groupBy=20=EC=A0=9C=EA=B1=B0=20?= =?UTF-8?q?=EB=B0=8F=20workerId=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manager/schedule/dto/ManagerTodayScheduleResponseDto.java | 3 +++ .../persistence/WorkspaceShiftQueryRepositoryImpl.java | 2 +- .../domain/workspace/model/WorkspaceShiftTodayResponse.java | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java index 980d9653..4676d162 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java @@ -16,6 +16,9 @@ public class ManagerTodayScheduleResponseDto { @Schema(description = "스케줄 ID", example = "1") private Long shiftId; + @Schema(description = "근무자 ID", example = "1") + private Long workerId; + @Schema(description = "근무자 이름", example = "홍길동") private String workerName; 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 8f080c69..3a5f4e6f 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 @@ -40,6 +40,7 @@ public List getTodayShiftList( return queryFactory .select(Projections.constructor(WorkspaceShiftTodayResponse.class, workspaceShift.id, + workspaceWorker.id, user.name, file.fileUrl, workspaceShift.startDateTime, @@ -57,7 +58,6 @@ public List getTodayShiftList( .and(workspaceShift.startDateTime.goe(startOfDay)) .and(workspaceShift.startDateTime.lt(endOfDay)) .and(workspaceShift.status.eq(WorkspaceShiftStatus.CONFIRMED))) - .groupBy(user.id) .orderBy(workspaceShift.startDateTime.asc()) .fetch(); } diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java b/src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java index 199e8d83..6e6ad046 100644 --- a/src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java +++ b/src/main/java/com/dreamteam/alter/domain/workspace/model/WorkspaceShiftTodayResponse.java @@ -4,6 +4,7 @@ public record WorkspaceShiftTodayResponse( Long shiftId, + Long workerId, String workerName, String profileImageUrl, LocalDateTime startDateTime, From 5bc1771fb98c59e2636af17e5adda0b7349c94da Mon Sep 17 00:00:00 2001 From: Choi Junyoung Date: Mon, 20 Apr 2026 19:51:48 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20API=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/ManagerTodayScheduleResponseDto.java | 53 +++++++++++-------- .../dto/ManagerTodayScheduleShiftItem.java | 35 ++++++++++++ .../ManagerGetDailyWorkScheduleList.java | 4 +- 3 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleShiftItem.java diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java index 4676d162..8c1df825 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleResponseDto.java @@ -1,21 +1,24 @@ package com.dreamteam.alter.adapter.inbound.manager.schedule.dto; +import java.util.List; +import java.util.stream.Collectors; + import com.dreamteam.alter.domain.workspace.model.WorkspaceShiftTodayResponse; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.time.LocalDateTime; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) @Builder(access = AccessLevel.PRIVATE) -@Schema(description = "매니저 금일 스케줄 응답") +@Schema(description = "매니저 금일 근무자 응답") public class ManagerTodayScheduleResponseDto { - @Schema(description = "스케줄 ID", example = "1") - private Long shiftId; - @Schema(description = "근무자 ID", example = "1") private Long workerId; @@ -25,19 +28,27 @@ public class ManagerTodayScheduleResponseDto { @Schema(description = "근무자 프로필 이미지 S3 URL") private String profileImageUrl; - @Schema(description = "근무 시작 시간", example = "2024-01-15T09:00:00") - private LocalDateTime startDateTime; - - @Schema(description = "근무 종료 시간", example = "2024-01-15T18:00:00") - private LocalDateTime endDateTime; - - public static ManagerTodayScheduleResponseDto of(WorkspaceShiftTodayResponse entity) { - return ManagerTodayScheduleResponseDto.builder() - .shiftId(entity.shiftId()) - .workerName(entity.workerName()) - .profileImageUrl(entity.profileImageUrl()) - .startDateTime(entity.startDateTime()) - .endDateTime(entity.endDateTime()) - .build(); + @Schema(description = "금일 근무 목록") + private List shifts; + + public static List from(List responses) { + return responses.stream() + .collect(Collectors.groupingBy(WorkspaceShiftTodayResponse::workerId)) + .values() + .stream() + .map(group -> { + WorkspaceShiftTodayResponse first = group.getFirst(); + return ManagerTodayScheduleResponseDto.builder() + .workerId(first.workerId()) + .workerName(first.workerName()) + .profileImageUrl(first.profileImageUrl()) + .shifts( + group.stream() + .map(r -> ManagerTodayScheduleShiftItem.of(r.shiftId(), r.startDateTime(), r.endDateTime())) + .toList() + ) + .build(); + }) + .toList(); } } diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleShiftItem.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleShiftItem.java new file mode 100644 index 00000000..f9b70b42 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/ManagerTodayScheduleShiftItem.java @@ -0,0 +1,35 @@ +package com.dreamteam.alter.adapter.inbound.manager.schedule.dto; + +import java.time.LocalDateTime; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder(access = AccessLevel.PRIVATE) +@Schema(description = "근무 항목") +public class ManagerTodayScheduleShiftItem { + + @Schema(description = "스케줄 ID", example = "1") + private Long shiftId; + + @Schema(description = "근무 시작 시간", example = "2024-01-15T09:00:00") + private LocalDateTime startDateTime; + + @Schema(description = "근무 종료 시간", example = "2024-01-15T18:00:00") + private LocalDateTime endDateTime; + + public static ManagerTodayScheduleShiftItem of(Long shiftId, LocalDateTime startDateTime, LocalDateTime endDateTime) { + return ManagerTodayScheduleShiftItem.builder() + .shiftId(shiftId) + .startDateTime(startDateTime) + .endDateTime(endDateTime) + .build(); + } +} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java index 16094279..b414b5cf 100644 --- a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerGetDailyWorkScheduleList.java @@ -29,8 +29,6 @@ public List execute(ManagerActor actor, Long wo throw new CustomException(ErrorCode.WORKSPACE_NOT_FOUND); } - return workspaceShiftQueryRepository.getTodayShiftList(workspaceId).stream() - .map(ManagerTodayScheduleResponseDto::of) - .toList(); + return ManagerTodayScheduleResponseDto.from(workspaceShiftQueryRepository.getTodayShiftList(workspaceId)); } }