LeaveCommandController.java

package com.deveagles.be15_deveagles_be.features.schedules.command.application.controller;

import com.deveagles.be15_deveagles_be.common.dto.ApiResponse;
import com.deveagles.be15_deveagles_be.features.auth.command.application.model.CustomUser;
import com.deveagles.be15_deveagles_be.features.schedules.command.application.dto.request.*;
import com.deveagles.be15_deveagles_be.features.schedules.command.application.service.LeaveCommandService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/schedules")
@RequiredArgsConstructor
@Tag(name = "휴무 관리", description = "직원 단기 및 정기 휴무 등록, 수정, 삭제 API")
public class LeaveCommandController {

  private final LeaveCommandService leaveCommandService;

  @Operation(summary = "단기 휴무 등록", description = "직원의 단기 휴무 일정을 등록합니다.")
  @PostMapping("/leaves")
  public ResponseEntity<ApiResponse<Long>> createLeave(
      @AuthenticationPrincipal CustomUser user, @RequestBody CreateLeaveRequest request) {
    Long id = leaveCommandService.createLeave(user.getShopId(), request);
    return ResponseEntity.ok(ApiResponse.success(id));
  }

  @Operation(summary = "단기 휴무 수정", description = "기존 단기 휴무 일정을 수정합니다.")
  @PutMapping("/leaves/{leaveId}")
  public ResponseEntity<ApiResponse<Void>> updateLeave(
      @AuthenticationPrincipal CustomUser user,
      @PathVariable Long leaveId,
      @RequestBody UpdateLeaveRequest request) {
    leaveCommandService.updateLeave(user.getShopId(), leaveId, request);
    return ResponseEntity.ok(ApiResponse.success(null));
  }

  @Operation(summary = "정기 휴무 등록", description = "직원의 정기 휴무 일정을 등록합니다.")
  @PostMapping("/regular-leaves")
  public ResponseEntity<ApiResponse<Long>> createRegularLeave(
      @AuthenticationPrincipal CustomUser user, @RequestBody CreateRegularLeaveRequest request) {
    Long id = leaveCommandService.createRegularLeave(user.getShopId(), request);
    return ResponseEntity.ok(ApiResponse.success(id));
  }

  @Operation(summary = "정기 휴무 수정", description = "기존 정기 휴무 일정을 수정합니다.")
  @PutMapping("/regular-leaves/{regularLeaveId}")
  public ResponseEntity<ApiResponse<Void>> updateRegularLeave(
      @AuthenticationPrincipal CustomUser user,
      @PathVariable Long regularLeaveId,
      @RequestBody UpdateRegularLeaveRequest request) {
    leaveCommandService.updateRegularLeave(user.getShopId(), regularLeaveId, request);
    return ResponseEntity.ok(ApiResponse.success(null));
  }

  @Operation(summary = "휴무 삭제 (다건)", description = "단기 및 정기 휴무를 함께 삭제합니다.")
  @DeleteMapping("/leaves")
  public ResponseEntity<ApiResponse<Void>> deleteSchedules(
      @AuthenticationPrincipal CustomUser user, @RequestBody List<DeleteScheduleRequest> requests) {
    leaveCommandService.deleteMixedLeaves(user.getShopId(), requests);
    return ResponseEntity.ok(ApiResponse.success(null));
  }

  @Operation(summary = "휴무 일정 타입 전환", description = "정기 ↔ 단기 휴무로 일정 타입을 전환합니다.")
  @PostMapping("/leaves/switch")
  public ResponseEntity<ApiResponse<Void>> switchSchedule(
      @AuthenticationPrincipal CustomUser user, @RequestBody UpdateLeaveScheduleRequest request) {
    leaveCommandService.switchSchedule(user.getShopId(), request);
    return ResponseEntity.ok(ApiResponse.success(null));
  }
}