Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
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.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;
Expand All @@ -24,15 +21,15 @@
@RequestMapping("/app/schedules")
public class UserScheduleController implements UserScheduleControllerSpec {

@Resource(name = "getMyWorkSchedule")
private final GetMyScheduleUseCase getMySchedule;
@Resource(name = "getMySchedule")
private final GetMyScheduleInquiryUseCase getMySchedule;

@Resource(name = "getWorkspaceWorkSchedule")
private final GetWorkspaceScheduleUseCase getWorkspaceSchedule;

@Override
@GetMapping("/self")
public ResponseEntity<CommonApiResponse<List<MyScheduleResponseDto>>> getMySchedule(
public ResponseEntity<CommonApiResponse<MyScheduleInquiryResponseDto>> getMySchedule(
WorkScheduleInquiryRequestDto request
) {
AppActor actor = AppActionContext.getInstance().getActor();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,11 +19,14 @@
@Tag(name = "APP - 근무 스케줄 관리 API")
public interface UserScheduleControllerSpec {

@Operation(summary = "나의 근무 스케줄 조회", description = "특정 월의 스케줄을 조회하려면 year, month 값을 모두 포함해야합니다.")
@Operation(summary = "나의 근무 스케줄 조회", description = "파라미터 조합에 따라 조회가 달라집니다. <br>"+
"- 인자 없음: 이번 주 스케줄 조회<br>" +
"- year, month: 해당 월 스케줄 조회<br>" +
"- year, month, day: 해당 일 스케줄 조회")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "스케줄 조회 성공")
})
ResponseEntity<CommonApiResponse<List<MyScheduleResponseDto>>> getMySchedule(
ResponseEntity<CommonApiResponse<MyScheduleInquiryResponseDto>> getMySchedule(
WorkScheduleInquiryRequestDto request
);

Expand Down
Original file line number Diff line number Diff line change
@@ -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<MyScheduleResponseDto> schedules;

public static MyScheduleInquiryResponseDto of(double totalWorkHours, List<MyScheduleResponseDto> schedules) {
return MyScheduleInquiryResponseDto.builder()
.totalWorkHours(totalWorkHours)
.schedules(schedules)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,7 @@ public class WorkScheduleInquiryRequestDto {

@Parameter(description = "조회할 월")
private Integer month;

@Parameter(description = "조회할 일 (일별 조회 시 사용)")
private Integer day;
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,21 @@ public List<WorkspaceShift> findByUserAndWeeklyRange(User user, LocalDate startD
.fetch();
}

@Override
public List<WorkspaceShift> 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<WorkspaceShift> findByWorkspaceAndDateRange(Workspace workspace, int year, int month) {
return queryFactory
Expand Down
Original file line number Diff line number Diff line change
@@ -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<WorkspaceShift> 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<MyScheduleResponseDto> scheduleDtos = shifts.stream()
.map(MyScheduleResponseDto::of)
.toList();

return MyScheduleInquiryResponseDto.of(totalWorkHours, scheduleDtos);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +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.WorkScheduleInquiryRequestDto;
import com.dreamteam.alter.domain.user.context.AppActor;

public interface GetMyScheduleInquiryUseCase {
MyScheduleInquiryResponseDto execute(AppActor actor, WorkScheduleInquiryRequestDto request);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
public interface WorkspaceShiftQueryRepository {
List<WorkspaceShift> findByUserAndDateRange(User user, int year, int month);
List<WorkspaceShift> findByUserAndWeeklyRange(User user, LocalDate startDate, LocalDate endDate);
List<WorkspaceShift> findByUserAndDate(User user, int year, int month, int day);
List<WorkspaceShift> findByWorkspaceAndDateRange(Workspace workspace, int year, int month);
List<WorkspaceShift> findByManagerAndDateRange(ManagerUser managerUser, Long workspaceId, int year, int month);
Optional<WorkspaceShift> findById(Long id);
Expand Down