Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -192,15 +192,21 @@ ResponseEntity<CommonApiResponse<Void>> 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<CommonApiResponse<Void>> updatePosting(
@PathVariable Long postingId,
Expand Down
Original file line number Diff line number Diff line change
@@ -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<CommonApiResponse<Void>> 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<CommonApiResponse<Void>> 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<CommonApiResponse<Void>> deleteWorkerSchedule(
@PathVariable Long workspaceId,
@PathVariable Long workerScheduleId
) {
ManagerActor actor = ManagerActionContext.getInstance().getActor();
managerDeleteFixedWorkerSchedule.execute(actor, workspaceId, workerScheduleId);
return ResponseEntity.ok(CommonApiResponse.empty());
}
}
Original file line number Diff line number Diff line change
@@ -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<CommonApiResponse<Void>> 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<CommonApiResponse<Void>> 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<CommonApiResponse<Void>> deleteWorkerSchedule(
@PathVariable Long workspaceId,
@PathVariable Long workerScheduleId
);
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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<WorkerScheduleDto> schedules;
}
Original file line number Diff line number Diff line change
@@ -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<Workspace, Long> {
}
Loading