diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/posting/controller/ManagerPostingControllerSpec.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/posting/controller/ManagerPostingControllerSpec.java index 18a52e29..d599de3f 100644 --- a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/posting/controller/ManagerPostingControllerSpec.java +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/posting/controller/ManagerPostingControllerSpec.java @@ -192,15 +192,21 @@ ResponseEntity> updatePostingStatus( name = "요청에 키워드가 포함되지 않은 경우", value = "{\"code\" : \"B001\"}" ), + })), + @ApiResponse(responseCode = "404", description = "404 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { @ExampleObject( name = "삭제할 스케줄이 존재하지 않는 경우", - value = "{\"code\" : \"B021\", \"message\" : \"해당 Schedule ID\"}" + value = "{\"code\" : \"B019\"}" ), @ExampleObject( name = "수정할 스케줄이 존재하지 않는 경우", - value = "{\"code\" : \"B022\", \"message\" : \"해당 Schedule ID\"}" + value = "{\"code\" : \"B019\"}" ), - })) + })), }) ResponseEntity> updatePosting( @PathVariable Long postingId, diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerFixedWorkerScheduleController.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerFixedWorkerScheduleController.java new file mode 100644 index 00000000..cda59f4d --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerFixedWorkerScheduleController.java @@ -0,0 +1,70 @@ +package com.dreamteam.alter.adapter.inbound.manager.schedule.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse; +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.UpdateWorkerScheduleRequestDto; +import com.dreamteam.alter.adapter.inbound.manager.workspace.dto.CreateWorkerScheduleRequestDto; +import com.dreamteam.alter.application.aop.ManagerActionContext; +import com.dreamteam.alter.domain.user.context.ManagerActor; +import com.dreamteam.alter.domain.workspace.port.inbound.ManagerCreateFixedWorkerScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.inbound.ManagerDeleteFixedWorkerScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.inbound.ManagerUpdateFixedWorkerScheduleUseCase; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; + +@RestController +@PreAuthorize("hasAnyRole('MANAGER')") +@RequiredArgsConstructor +@Validated +@RequestMapping("/manager/workspaces/{workspaceId}/fixed-worker-schedules") +public class ManagerFixedWorkerScheduleController implements ManagerFixedWorkerScheduleControllerSpec { + + private final ManagerCreateFixedWorkerScheduleUseCase managerCreateFixedWorkerSchedule; + private final ManagerUpdateFixedWorkerScheduleUseCase managerUpdateWorkerSchedule; + private final ManagerDeleteFixedWorkerScheduleUseCase managerDeleteFixedWorkerSchedule; + + @Override + @PostMapping + public ResponseEntity> createWorkerSchedule( + @PathVariable Long workspaceId, + @RequestBody @Valid CreateWorkerScheduleRequestDto request + ) { + ManagerActor actor = ManagerActionContext.getInstance().getActor(); + managerCreateFixedWorkerSchedule.execute(actor, workspaceId, request); + return ResponseEntity.ok(CommonApiResponse.empty()); + } + + @Override + @PatchMapping("/{workerScheduleId}") + public ResponseEntity> updateWorkerSchedule( + @PathVariable Long workspaceId, + @PathVariable Long workerScheduleId, + @RequestBody @Valid UpdateWorkerScheduleRequestDto request + ) { + ManagerActor actor = ManagerActionContext.getInstance().getActor(); + managerUpdateWorkerSchedule.execute(actor, workspaceId, workerScheduleId, request); + return ResponseEntity.ok(CommonApiResponse.empty()); + } + + @Override + @DeleteMapping("/{workerScheduleId}") + public ResponseEntity> deleteWorkerSchedule( + @PathVariable Long workspaceId, + @PathVariable Long workerScheduleId + ) { + ManagerActor actor = ManagerActionContext.getInstance().getActor(); + managerDeleteFixedWorkerSchedule.execute(actor, workspaceId, workerScheduleId); + return ResponseEntity.ok(CommonApiResponse.empty()); + } +} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerFixedWorkerScheduleControllerSpec.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerFixedWorkerScheduleControllerSpec.java new file mode 100644 index 00000000..d9dcf424 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/controller/ManagerFixedWorkerScheduleControllerSpec.java @@ -0,0 +1,133 @@ +package com.dreamteam.alter.adapter.inbound.manager.schedule.controller; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; + +import com.dreamteam.alter.adapter.inbound.common.dto.CommonApiResponse; +import com.dreamteam.alter.adapter.inbound.common.dto.ErrorResponse; +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.UpdateWorkerScheduleRequestDto; +import com.dreamteam.alter.adapter.inbound.manager.workspace.dto.CreateWorkerScheduleRequestDto; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; + +@Tag(name = "MANAGER - 근무자 고정 스케줄 관리 API") +public interface ManagerFixedWorkerScheduleControllerSpec { + + @Operation(summary = "매니저 - 근무자 고정 스케줄 등록", description = "근무자의 요일별 고정 근무 시간을 등록합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "고정 스케줄 등록 성공"), + @ApiResponse(responseCode = "400", description = "400 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { + @ExampleObject( + name = "시작시간은 종료 시간보다 늦을 수 없습니다.", + value = "{\"code\" : \"B001\"}" + ), + })), + @ApiResponse(responseCode = "404", description = "404 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { + @ExampleObject( + name = "존재하지 않는 업장입니다.", + value = "{\"code\" : \"B019\"}" + ), + @ExampleObject( + name = "해당업장에 근무하는 근무자가 아닙니다.", + value = "{\"code\" : \"B019\"}" + ), + })), + @ApiResponse(responseCode = "409", description = "409 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { + @ExampleObject( + name = "같은 요일에 겹치는 근무 시간이 존재합니다.", + value = "{\"code\" : \"B020\"}" + ), + })), + }) + ResponseEntity> createWorkerSchedule( + @PathVariable Long workspaceId, + @RequestBody @Valid CreateWorkerScheduleRequestDto requests + ); + + @Operation(summary = "매니저 - 근무자 고정 스케줄 수정", description = "근무자의 요일별 고정 근무 시간을 수정합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "고정 스케줄 수정 성공"), + @ApiResponse(responseCode = "400", description = "400 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { + @ExampleObject( + name = "시작시간은 종료 시간보다 늦을 수 없습니다.", + value = "{\"code\" : \"B001\"}" + ), + })), + @ApiResponse(responseCode = "404", description = "404 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { + @ExampleObject( + name = "존재하지 않는 업장입니다.", + value = "{\"code\" : \"B019\"}" + ), + @ExampleObject( + name = "수정할 스케줄을 찾을 수 없습니다.", + value = "{\"code\" : \"B019\"}" + ), + })), + @ApiResponse(responseCode = "409", description = "409 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { + @ExampleObject( + name = "같은 요일에 겹치는 근무 시간이 존재합니다.", + value = "{\"code\" : \"B020\"}" + ), + })), + }) + ResponseEntity> updateWorkerSchedule( + @PathVariable Long workspaceId, + @PathVariable Long workerScheduleId, + @RequestBody @Valid UpdateWorkerScheduleRequestDto request + ); + + @Operation(summary = "매니저 - 근무자 고정 스케줄 삭제", description = "근무자의 요일별 고정 근무 시간을 삭제합니다.") + @ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "고정 스케줄 삭제 성공"), + @ApiResponse(responseCode = "404", description = "404 Error 실패 케이스", + content = @Content( + mediaType = "application/json", + schema = @Schema(implementation = ErrorResponse.class), + examples = { + @ExampleObject( + name = "존재하지 않는 업장입니다.", + value = "{\"code\" : \"B019\"}" + ), + @ExampleObject( + name = "삭제할 스케줄을 찾을 수 없습니다.", + value = "{\"code\" : \"B019\"}" + ), + })), + }) + ResponseEntity> deleteWorkerSchedule( + @PathVariable Long workspaceId, + @PathVariable Long workerScheduleId + ); +} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/UpdateWorkerScheduleRequestDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/UpdateWorkerScheduleRequestDto.java new file mode 100644 index 00000000..a351f7dd --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/UpdateWorkerScheduleRequestDto.java @@ -0,0 +1,33 @@ +package com.dreamteam.alter.adapter.inbound.manager.schedule.dto; + +import java.time.DayOfWeek; +import java.time.LocalTime; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "매니저 - 근무자 고정 스케줄 수정 DTO") +public class UpdateWorkerScheduleRequestDto { + + @NotNull(message = "시작 요일은 필수입니다") + @Schema(description = "시작 요일", example = "MONDAY") + private DayOfWeek startDayOfWeek; + + @NotNull(message = "시작 시간은 필수입니다") + @Schema(description = "시작 시간", example = "22:00:00") + private LocalTime startTime; + + @NotNull(message = "종료 요일은 필수입니다") + @Schema(description = "종료 요일", example = "TUESDAY") + private DayOfWeek endDayOfWeek; + + @NotNull(message = "종료 시간은 필수입니다") + @Schema(description = "종료 시간", example = "04:00:00") + private LocalTime endTime; +} diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/WorkerScheduleDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/WorkerScheduleDto.java new file mode 100644 index 00000000..57cd0f65 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/schedule/dto/WorkerScheduleDto.java @@ -0,0 +1,32 @@ +package com.dreamteam.alter.adapter.inbound.manager.schedule.dto; + +import java.time.DayOfWeek; +import java.time.LocalTime; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "근무자 스케줄 정보") +public class WorkerScheduleDto { + @NotNull(message = "시작 요일은 필수입니다") + @Schema(description = "시작 요일", example = "MONDAY") + private DayOfWeek startDayOfWeek; + + @NotNull(message = "시작 시간은 필수입니다") + @Schema(description = "시작 시간", example = "22:00:00") + private LocalTime startTime; + + @NotNull(message = "종료 요일은 필수입니다") + @Schema(description = "종료 요일", example = "TUESDAY") + private DayOfWeek endDayOfWeek; + + @NotNull(message = "종료 시간은 필수입니다") + @Schema(description = "종료 시간", example = "04:00:00") + private LocalTime endTime; +} \ No newline at end of file diff --git a/src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/dto/CreateWorkerScheduleRequestDto.java b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/dto/CreateWorkerScheduleRequestDto.java new file mode 100644 index 00000000..725e9910 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/inbound/manager/workspace/dto/CreateWorkerScheduleRequestDto.java @@ -0,0 +1,28 @@ +package com.dreamteam.alter.adapter.inbound.manager.workspace.dto; + +import java.util.List; + +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.WorkerScheduleDto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Schema(description = "매니저 - 근무자 고정 스케줄 등록 DTO") +public class CreateWorkerScheduleRequestDto { + + @NotNull(message = "업장 근무자 ID는 필수입니다.") + @Schema(description = "업장 근무자 ID", example = "1") + private Long workspaceWorkerId; + + @NotEmpty(message = "스케줄 목록은 필수입니다.") + @Valid + private List schedules; +} diff --git a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceJpaRepository.java b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceJpaRepository.java new file mode 100644 index 00000000..70dbf57f --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceJpaRepository.java @@ -0,0 +1,8 @@ +package com.dreamteam.alter.adapter.outbound.workspace.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.dreamteam.alter.domain.workspace.entity.Workspace; + +public interface WorkspaceJpaRepository extends JpaRepository { +} diff --git a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceQueryRepositoryImpl.java b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceQueryRepositoryImpl.java index 4f9958ca..6187de3b 100644 --- a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceQueryRepositoryImpl.java +++ b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceQueryRepositoryImpl.java @@ -1,16 +1,24 @@ package com.dreamteam.alter.adapter.outbound.workspace.persistence; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.stereotype.Repository; + import com.dreamteam.alter.adapter.inbound.common.dto.CursorDto; import com.dreamteam.alter.adapter.inbound.common.dto.CursorPageRequest; import com.dreamteam.alter.adapter.inbound.manager.workspace.dto.ManagerWorkspaceWorkerListFilterDto; import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.ManagerWorkspaceListResponse; +import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.ManagerWorkspaceManagerListResponse; import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.ManagerWorkspaceResponse; import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.ManagerWorkspaceWorkerListResponse; -import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.UserWorkspaceWorkerListResponse; import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.UserWorkspaceManagerListResponse; -import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.ManagerWorkspaceManagerListResponse; -import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.WorkspaceWorkerResponse; +import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.UserWorkspaceWorkerListResponse; import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.UserWorkspaceWorkerResponse; +import com.dreamteam.alter.adapter.outbound.workspace.persistence.readonly.WorkspaceWorkerResponse; import com.dreamteam.alter.domain.reputation.entity.QReputationSummary; import com.dreamteam.alter.domain.reputation.type.ReputationType; import com.dreamteam.alter.domain.user.entity.ManagerUser; @@ -24,20 +32,15 @@ import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceQueryRepository; import com.dreamteam.alter.domain.workspace.type.WorkerPositionType; import com.dreamteam.alter.domain.workspace.type.WorkspaceShiftStatus; +import com.dreamteam.alter.domain.workspace.type.WorkspaceStatus; import com.dreamteam.alter.domain.workspace.type.WorkspaceWorkerStatus; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; -import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.ObjectUtils; -import org.springframework.stereotype.Repository; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; +import lombok.RequiredArgsConstructor; @Repository @RequiredArgsConstructor @@ -544,6 +547,23 @@ public List getManagerWorkspaceManagerListW .fetch(); } + @Override + public boolean existsByIdAndManagerUser(Long workspaceId, ManagerUser managerUser) { + QWorkspace qWorkspace = QWorkspace.workspace; + + Integer result = queryFactory + .selectOne() + .from(qWorkspace) + .where( + qWorkspace.id.eq(workspaceId), + qWorkspace.managerUser.eq(managerUser), + qWorkspace.status.eq(WorkspaceStatus.ACTIVATED) + ) + .fetchFirst(); + + return result != null; + } + private BooleanExpression eqWorkerStatus(QWorkspaceWorker qWorkspaceWorker, WorkspaceWorkerStatus status) { return status != null ? qWorkspaceWorker.status.eq(status) : null; } diff --git a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleJpaRepository.java b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleJpaRepository.java new file mode 100644 index 00000000..014811e4 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleJpaRepository.java @@ -0,0 +1,8 @@ +package com.dreamteam.alter.adapter.outbound.workspace.persistence; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorkerSchedule; + +public interface WorkspaceWorkerScheduleJpaRepository extends JpaRepository { +} diff --git a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleQueryRepositoryImpl.java b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleQueryRepositoryImpl.java new file mode 100644 index 00000000..cae549a4 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleQueryRepositoryImpl.java @@ -0,0 +1,68 @@ +package com.dreamteam.alter.adapter.outbound.workspace.persistence; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import com.dreamteam.alter.domain.workspace.entity.QWorkspaceWorker; +import com.dreamteam.alter.domain.workspace.entity.QWorkspaceWorkerSchedule; +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorker; +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorkerSchedule; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceWorkerScheduleQueryRepository; +import com.dreamteam.alter.domain.workspace.type.WorkspaceWorkerScheduleStatus; +import com.querydsl.jpa.impl.JPAQueryFactory; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class WorkspaceWorkerScheduleQueryRepositoryImpl implements WorkspaceWorkerScheduleQueryRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public Optional findById(Long workerScheduleId) { + QWorkspaceWorkerSchedule qWorkspaceWorkerSchedule = QWorkspaceWorkerSchedule.workspaceWorkerSchedule; + + return Optional.ofNullable( + queryFactory + .selectFrom(qWorkspaceWorkerSchedule) + .where( + qWorkspaceWorkerSchedule.id.eq(workerScheduleId), + qWorkspaceWorkerSchedule.status.ne(WorkspaceWorkerScheduleStatus.DELETED) + ) + .fetchOne() + ); + } + + @Override + public Optional getByIdWithWorkspaceWorker(Long workerScheduleId) { + QWorkspaceWorkerSchedule qWorkspaceWorkerSchedule = QWorkspaceWorkerSchedule.workspaceWorkerSchedule; + QWorkspaceWorker qWorkspaceWorker = QWorkspaceWorker.workspaceWorker; + + return Optional.ofNullable( + queryFactory + .selectFrom(qWorkspaceWorkerSchedule) + .join(qWorkspaceWorkerSchedule.workspaceWorker, qWorkspaceWorker).fetchJoin() + .where( + qWorkspaceWorkerSchedule.id.eq(workerScheduleId), + qWorkspaceWorkerSchedule.status.ne(WorkspaceWorkerScheduleStatus.DELETED) + ) + .fetchOne() + ); + } + + @Override + public List getByWorkspaceWorker(WorkspaceWorker workspaceWorker) { + QWorkspaceWorkerSchedule qWorkspaceWorkerSchedule = QWorkspaceWorkerSchedule.workspaceWorkerSchedule; + + return queryFactory + .selectFrom(qWorkspaceWorkerSchedule) + .where( + qWorkspaceWorkerSchedule.workspaceWorker.eq(workspaceWorker), + qWorkspaceWorkerSchedule.status.ne(WorkspaceWorkerScheduleStatus.DELETED) + ) + .fetch(); + } +} diff --git a/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleRepositoryImpl.java b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleRepositoryImpl.java new file mode 100644 index 00000000..0a279ac0 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/adapter/outbound/workspace/persistence/WorkspaceWorkerScheduleRepositoryImpl.java @@ -0,0 +1,22 @@ +package com.dreamteam.alter.adapter.outbound.workspace.persistence; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorkerSchedule; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceWorkerScheduleRepository; + +import lombok.RequiredArgsConstructor; + +@Repository +@RequiredArgsConstructor +public class WorkspaceWorkerScheduleRepositoryImpl implements WorkspaceWorkerScheduleRepository { + + private final WorkspaceWorkerScheduleJpaRepository workspaceWorkerScheduleJpaRepository; + + @Override + public void saveAll(List workspaceWorkerSchedules) { + workspaceWorkerScheduleJpaRepository.saveAll(workspaceWorkerSchedules); + } +} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerCreateFixedWorkerSchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerCreateFixedWorkerSchedule.java new file mode 100644 index 00000000..4ab9e3b7 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerCreateFixedWorkerSchedule.java @@ -0,0 +1,75 @@ +package com.dreamteam.alter.application.workspace.usecase; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.WorkerScheduleDto; +import com.dreamteam.alter.adapter.inbound.manager.workspace.dto.CreateWorkerScheduleRequestDto; +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.WorkspaceWorker; +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorkerSchedule; +import com.dreamteam.alter.domain.workspace.port.inbound.ManagerCreateFixedWorkerScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceQueryRepository; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceWorkerQueryRepository; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceWorkerScheduleQueryRepository; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceWorkerScheduleRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional +public class ManagerCreateFixedWorkerSchedule implements ManagerCreateFixedWorkerScheduleUseCase { + + private final WorkspaceQueryRepository workspaceQueryRepository; + private final WorkspaceWorkerQueryRepository workspaceWorkerQueryRepository; + private final WorkspaceWorkerScheduleRepository workspaceWorkerScheduleRepository; + private final WorkspaceWorkerScheduleQueryRepository workspaceWorkerScheduleQueryRepository; + + @Override + public void execute(ManagerActor actor, Long workspaceId, CreateWorkerScheduleRequestDto request) { + if (!workspaceQueryRepository.existsByIdAndManagerUser(workspaceId, actor.getManagerUser())) + throw new CustomException(ErrorCode.WORKSPACE_NOT_FOUND); + + WorkspaceWorker workspaceWorker = workspaceWorkerQueryRepository.findById(request.getWorkspaceWorkerId()) + .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND, "해당 업장에 근무하는 사용자가 아닙니다.")); + + validOverlappingTime(workspaceWorker, request.getSchedules()); + + workspaceWorkerScheduleRepository.saveAll( + request.getSchedules().stream() + .map(r -> WorkspaceWorkerSchedule.create( + workspaceWorker, + r.getStartDayOfWeek(), + r.getStartTime(), + r.getEndDayOfWeek(), + r.getEndTime() + )) + .toList() + ); + } + + /** + * 겹치는 시간 검증 + * @param workspaceWorker 해당 근무자 + * @param newSchedules 새로 생성할 스케줄 목록 + */ + private void validOverlappingTime(WorkspaceWorker workspaceWorker, List newSchedules) { + List existingSchedules = workspaceWorkerScheduleQueryRepository.getByWorkspaceWorker(workspaceWorker); + + for (WorkspaceWorkerSchedule existingSchedule : existingSchedules) { + for (WorkerScheduleDto newSchedule : newSchedules) { + existingSchedule.validOverlappingTime( + newSchedule.getStartDayOfWeek(), + newSchedule.getStartTime(), + newSchedule.getEndDayOfWeek(), + newSchedule.getEndTime() + ); + } + } + } +} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerDeleteFixedWorkerSchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerDeleteFixedWorkerSchedule.java new file mode 100644 index 00000000..0cd2c37d --- /dev/null +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerDeleteFixedWorkerSchedule.java @@ -0,0 +1,34 @@ +package com.dreamteam.alter.application.workspace.usecase; + +import org.springframework.stereotype.Service; + +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.WorkspaceWorkerSchedule; +import com.dreamteam.alter.domain.workspace.port.inbound.ManagerDeleteFixedWorkerScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceQueryRepository; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceWorkerScheduleQueryRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional +public class ManagerDeleteFixedWorkerSchedule implements ManagerDeleteFixedWorkerScheduleUseCase { + + private final WorkspaceQueryRepository workspaceQueryRepository; + private final WorkspaceWorkerScheduleQueryRepository workspaceWorkerScheduleQueryRepository; + + @Override + public void execute(ManagerActor actor, Long workspaceId, Long workerScheduleId) { + if (!workspaceQueryRepository.existsByIdAndManagerUser(workspaceId, actor.getManagerUser())) + throw new CustomException(ErrorCode.WORKSPACE_NOT_FOUND); + + WorkspaceWorkerSchedule workspaceWorkerSchedule = workspaceWorkerScheduleQueryRepository.findById(workerScheduleId) + .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND, "삭제할 스케줄을 찾지 못하였습니다.")); + + workspaceWorkerSchedule.delete(); + } +} diff --git a/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerUpdateFixedWorkerSchedule.java b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerUpdateFixedWorkerSchedule.java new file mode 100644 index 00000000..f9fb8b63 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/application/workspace/usecase/ManagerUpdateFixedWorkerSchedule.java @@ -0,0 +1,62 @@ +package com.dreamteam.alter.application.workspace.usecase; + +import java.util.List; + +import org.springframework.stereotype.Service; + +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.UpdateWorkerScheduleRequestDto; +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.WorkspaceWorkerSchedule; +import com.dreamteam.alter.domain.workspace.port.inbound.ManagerUpdateFixedWorkerScheduleUseCase; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceQueryRepository; +import com.dreamteam.alter.domain.workspace.port.outbound.WorkspaceWorkerScheduleQueryRepository; + +import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +@Transactional +public class ManagerUpdateFixedWorkerSchedule implements ManagerUpdateFixedWorkerScheduleUseCase { + + private final WorkspaceQueryRepository workspaceQueryRepository; + private final WorkspaceWorkerScheduleQueryRepository workspaceWorkerScheduleQueryRepository; + + @Override + public void execute(ManagerActor actor, Long workspaceId, Long workerScheduleId, UpdateWorkerScheduleRequestDto request) { + if (!workspaceQueryRepository.existsByIdAndManagerUser(workspaceId, actor.getManagerUser())) + throw new CustomException(ErrorCode.WORKSPACE_NOT_FOUND); + + WorkspaceWorkerSchedule workspaceWorkerSchedule = workspaceWorkerScheduleQueryRepository.getByIdWithWorkspaceWorker(workerScheduleId) + .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND, "수정할 스케줄을 찾을 수 없습니다.")); + + validOverlappingTime(workspaceWorkerSchedule, request); + + workspaceWorkerSchedule.update( + request.getStartDayOfWeek(), + request.getStartTime(), + request.getEndDayOfWeek(), + request.getEndTime() + ); + } + + /** + * 겹치는 시간 검증 (자기 자신 제외) + * @param workspaceWorkerSchedule 수정 중인 스케줄 + * @param request 요청 정보 + */ + private void validOverlappingTime(WorkspaceWorkerSchedule workspaceWorkerSchedule, UpdateWorkerScheduleRequestDto request) { + List existingSchedules = workspaceWorkerScheduleQueryRepository.getByWorkspaceWorker(workspaceWorkerSchedule.getWorkspaceWorker()); + + existingSchedules.stream() + .filter(schedule -> !schedule.getId().equals(workspaceWorkerSchedule.getId())) + .forEach(schedule -> schedule.validOverlappingTime( + request.getStartDayOfWeek(), + request.getStartTime(), + request.getEndDayOfWeek(), + request.getEndTime() + )); + } +} diff --git a/src/main/java/com/dreamteam/alter/common/exception/ErrorCode.java b/src/main/java/com/dreamteam/alter/common/exception/ErrorCode.java index b81c5d6d..4d37eccc 100644 --- a/src/main/java/com/dreamteam/alter/common/exception/ErrorCode.java +++ b/src/main/java/com/dreamteam/alter/common/exception/ErrorCode.java @@ -42,9 +42,6 @@ public enum ErrorCode { WORKSPACE_WORKER_ALREADY_EXISTS(400, "B018", "이미 근무중인 사용자입니다."), NOT_FOUND(404, "B019", "요청한 리소스를 찾을 수 없습니다."), CONFLICT(409, "B020", "변경할 수 없는 상태입니다."), - SCHEDULE_NOT_FOUND_FOR_DELETE(400, "B021", "삭제할 스케줄을 찾을 수 없습니다"), - SCHEDULE_NOT_FOUND_FOR_UPDATE(400, "B022", "수정할 스케줄을 찾을 수 없습니다"), - INTERNAL_SERVER_ERROR(400, "C001", "서버 내부 오류입니다."), EXTERNAL_API_ERROR(502, "C002", "외부 API 연동에 실패했습니다."), ; diff --git a/src/main/java/com/dreamteam/alter/domain/posting/entity/Posting.java b/src/main/java/com/dreamteam/alter/domain/posting/entity/Posting.java index 919b9abb..0f2bc054 100644 --- a/src/main/java/com/dreamteam/alter/domain/posting/entity/Posting.java +++ b/src/main/java/com/dreamteam/alter/domain/posting/entity/Posting.java @@ -177,7 +177,7 @@ public void updateSchedules(List updateSchedules) { PostingSchedule existingSchedule = this.schedules.stream() .filter(schedule -> schedule.getId().equals(updateDto.getId())) .findFirst() - .orElseThrow(() -> new CustomException(ErrorCode.SCHEDULE_NOT_FOUND_FOR_UPDATE, updateDto.getId().toString())); + .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND, "수정할 스케줄을 찾을 수 없습니다.")); existingSchedule.update( updateDto.getWorkingDays().stream() @@ -200,7 +200,7 @@ public void deleteSchedules(List deleteScheduleIds) { PostingSchedule existingSchedule = this.schedules.stream() .filter(schedule -> schedule.getId().equals(scheduleId)) .findFirst() - .orElseThrow(() -> new CustomException(ErrorCode.SCHEDULE_NOT_FOUND_FOR_DELETE, scheduleId.toString())); + .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND, "삭제할 스케줄을 찾을 수 없습니다.")); existingSchedule.updateStatus(PostingStatus.DELETED); } diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceWorkerSchedule.java b/src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceWorkerSchedule.java new file mode 100644 index 00000000..574b76c5 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/entity/WorkspaceWorkerSchedule.java @@ -0,0 +1,131 @@ +package com.dreamteam.alter.domain.workspace.entity; + +import java.time.DayOfWeek; +import java.time.LocalDateTime; +import java.time.LocalTime; + +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import com.dreamteam.alter.common.exception.CustomException; +import com.dreamteam.alter.common.exception.ErrorCode; +import com.dreamteam.alter.domain.workspace.type.WorkspaceWorkerScheduleStatus; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EntityListeners; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@Getter +@Table(name = "workspace_worker_schedules") +@Builder(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@EntityListeners(AuditingEntityListener.class) +public class WorkspaceWorkerSchedule { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "workspace_worker_id", nullable = false) + private WorkspaceWorker workspaceWorker; + + @Enumerated(EnumType.STRING) + @Column(name = "start_day_of_week", nullable = false) + private DayOfWeek startDayOfWeek; + + @Column(name = "start_time", nullable = false) + private LocalTime startTime; + + @Enumerated(EnumType.STRING) + @Column(name = "end_day_of_week", nullable = false) + private DayOfWeek endDayOfWeek; + + @Column(name = "end_time", nullable = false) + private LocalTime endTime; + + @Enumerated(EnumType.STRING) + @Column(name = "status", nullable = false) + private WorkspaceWorkerScheduleStatus status; + + @CreatedDate + @Column(name = "created_at", nullable = false, updatable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + @Column(name = "updated_at", nullable = false) + private LocalDateTime updatedAt; + + public static WorkspaceWorkerSchedule create( + WorkspaceWorker workspaceWorker, + DayOfWeek startDayOfWeek, + LocalTime startTime, + DayOfWeek endDayOfWeek, + LocalTime endTime + ) { + WorkspaceWorkerSchedule workspaceWorkerSchedule = WorkspaceWorkerSchedule.builder() + .workspaceWorker(workspaceWorker) + .startDayOfWeek(startDayOfWeek) + .startTime(startTime) + .endDayOfWeek(endDayOfWeek) + .endTime(endTime) + .status(WorkspaceWorkerScheduleStatus.ACTIVATED) + .build(); + + workspaceWorkerSchedule.validTime(); + return workspaceWorkerSchedule; + } + + public void update(DayOfWeek startDayOfWeek, LocalTime startTime, DayOfWeek endDayOfWeek, LocalTime endTime) { + this.startDayOfWeek = startDayOfWeek; + this.startTime = startTime; + this.endDayOfWeek = endDayOfWeek; + this.endTime = endTime; + + validTime(); + } + + public void validTime() { + if (toWeekMinutes(this.startDayOfWeek, this.startTime) >= toWeekMinutes(this.endDayOfWeek, this.endTime)) + throw new CustomException(ErrorCode.ILLEGAL_ARGUMENT, "시작 시간은 종료 시간보다 늦을 수 없습니다."); + } + + public void validOverlappingTime(DayOfWeek newStartDay, LocalTime newStart, DayOfWeek newEndDay, LocalTime newEnd) { + long thisStartMinutes = toWeekMinutes(this.startDayOfWeek, this.startTime); + long thisEndMinutes = toWeekMinutes(this.endDayOfWeek, this.endTime); + long newStartMinutes = toWeekMinutes(newStartDay, newStart); + long newEndMinutes = toWeekMinutes(newEndDay, newEnd); + + if (newStartMinutes < thisEndMinutes && newEndMinutes > thisStartMinutes) + throw new CustomException(ErrorCode.CONFLICT, "겹치는 근무 시간이 존재합니다."); + } + + /** + * 요일과 시간을 주 시작(월요일 00:00) 기준 분 단위로 변환 + * 예: 월요일 09:00 → 540분, 화요일 18:30 → 2550분 + */ + private long toWeekMinutes(DayOfWeek dayOfWeek, LocalTime time) { + return (long) (dayOfWeek.getValue() - 1) * 24 * 60 + time.getHour() * 60 + time.getMinute(); + } + + public void delete() { + this.status = WorkspaceWorkerScheduleStatus.DELETED; + } +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerCreateFixedWorkerScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerCreateFixedWorkerScheduleUseCase.java new file mode 100644 index 00000000..4e495469 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerCreateFixedWorkerScheduleUseCase.java @@ -0,0 +1,8 @@ +package com.dreamteam.alter.domain.workspace.port.inbound; + +import com.dreamteam.alter.adapter.inbound.manager.workspace.dto.CreateWorkerScheduleRequestDto; +import com.dreamteam.alter.domain.user.context.ManagerActor; + +public interface ManagerCreateFixedWorkerScheduleUseCase { + void execute(ManagerActor actor, Long workspaceId, CreateWorkerScheduleRequestDto request); +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerDeleteFixedWorkerScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerDeleteFixedWorkerScheduleUseCase.java new file mode 100644 index 00000000..68592416 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerDeleteFixedWorkerScheduleUseCase.java @@ -0,0 +1,7 @@ +package com.dreamteam.alter.domain.workspace.port.inbound; + +import com.dreamteam.alter.domain.user.context.ManagerActor; + +public interface ManagerDeleteFixedWorkerScheduleUseCase { + void execute(ManagerActor actor, Long workspaceId, Long workerScheduleId); +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerUpdateFixedWorkerScheduleUseCase.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerUpdateFixedWorkerScheduleUseCase.java new file mode 100644 index 00000000..ca431e55 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/inbound/ManagerUpdateFixedWorkerScheduleUseCase.java @@ -0,0 +1,8 @@ +package com.dreamteam.alter.domain.workspace.port.inbound; + +import com.dreamteam.alter.adapter.inbound.manager.schedule.dto.UpdateWorkerScheduleRequestDto; +import com.dreamteam.alter.domain.user.context.ManagerActor; + +public interface ManagerUpdateFixedWorkerScheduleUseCase { + void execute(ManagerActor actor, Long workspaceId, Long workerScheduleId, UpdateWorkerScheduleRequestDto request); +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceQueryRepository.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceQueryRepository.java index bd0073bd..b2e3f53e 100644 --- a/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceQueryRepository.java +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceQueryRepository.java @@ -71,4 +71,6 @@ List getManagerWorkspaceManagerListWithCurs Long workspaceId, CursorPageRequest pageRequest ); + + boolean existsByIdAndManagerUser(Long workspaceId, ManagerUser managerUser); } diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceWorkerScheduleQueryRepository.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceWorkerScheduleQueryRepository.java new file mode 100644 index 00000000..cd0be073 --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceWorkerScheduleQueryRepository.java @@ -0,0 +1,13 @@ +package com.dreamteam.alter.domain.workspace.port.outbound; + +import java.util.List; +import java.util.Optional; + +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorker; +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorkerSchedule; + +public interface WorkspaceWorkerScheduleQueryRepository { + Optional findById(Long workerScheduleId); + Optional getByIdWithWorkspaceWorker(Long workerScheduleId); + List getByWorkspaceWorker(WorkspaceWorker workspaceWorker); +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceWorkerScheduleRepository.java b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceWorkerScheduleRepository.java new file mode 100644 index 00000000..46c5dd6e --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/port/outbound/WorkspaceWorkerScheduleRepository.java @@ -0,0 +1,9 @@ +package com.dreamteam.alter.domain.workspace.port.outbound; + +import java.util.List; + +import com.dreamteam.alter.domain.workspace.entity.WorkspaceWorkerSchedule; + +public interface WorkspaceWorkerScheduleRepository { + void saveAll(List workspaceWorkerSchedules); +} diff --git a/src/main/java/com/dreamteam/alter/domain/workspace/type/WorkspaceWorkerScheduleStatus.java b/src/main/java/com/dreamteam/alter/domain/workspace/type/WorkspaceWorkerScheduleStatus.java new file mode 100644 index 00000000..df43ef5f --- /dev/null +++ b/src/main/java/com/dreamteam/alter/domain/workspace/type/WorkspaceWorkerScheduleStatus.java @@ -0,0 +1,6 @@ +package com.dreamteam.alter.domain.workspace.type; + +public enum WorkspaceWorkerScheduleStatus { + ACTIVATED, + DELETED +}