MessageCommandController.java

package com.deveagles.be15_deveagles_be.features.messages.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.messages.command.application.dto.request.SmsRequest;
import com.deveagles.be15_deveagles_be.features.messages.command.application.dto.request.UpdateReservationRequest;
import com.deveagles.be15_deveagles_be.features.messages.command.application.dto.response.MessageSendResult;
import com.deveagles.be15_deveagles_be.features.messages.command.application.service.MessageCommandService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;
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
@RequiredArgsConstructor
@RequestMapping("/message")
public class MessageCommandController {

  private final MessageCommandService messageCommandService;

  @Operation(summary = "문자 메시지 발송", description = "매장의 선택된 고객에게 문자 메시지를 발송합니다.")
  @ApiResponses({
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "200",
        description = "발송 성공"),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "400",
        description = "잘못된 요청")
  })
  @PostMapping("/send")
  public ResponseEntity<ApiResponse<List<MessageSendResult>>> sendSms(
      @AuthenticationPrincipal CustomUser customUser, @RequestBody @Valid SmsRequest request) {

    List<MessageSendResult> resultList =
        messageCommandService.sendSms(customUser.getShopId(), request);
    return ResponseEntity.ok(ApiResponse.success(resultList));
  }

  @Operation(summary = "예약 문자 수정", description = "이미 등록된 예약 문자의 전송 내용을 수정합니다.")
  @ApiResponses({
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "200",
        description = "수정 성공"),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "404",
        description = "해당 메시지를 찾을 수 없음")
  })
  @PutMapping("/{messageId}")
  public ResponseEntity<ApiResponse<Void>> updateReservation(
      @AuthenticationPrincipal CustomUser customUser,
      @RequestBody @Valid UpdateReservationRequest updateReservationRequest,
      @PathVariable Long messageId) {
    messageCommandService.updateReservationMessage(
        updateReservationRequest, customUser.getShopId(), messageId);
    return ResponseEntity.ok(ApiResponse.success(null));
  }

  @Operation(summary = "예약 문자 취소", description = "등록된 예약 문자 전송을 취소합니다.")
  @ApiResponses({
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "200",
        description = "취소 성공"),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "404",
        description = "해당 메시지를 찾을 수 없음")
  })
  @DeleteMapping("/{messageId}/cancel")
  public ResponseEntity<ApiResponse<Void>> cancelReservation(
      @AuthenticationPrincipal CustomUser customUser, @PathVariable Long messageId) {
    messageCommandService.cancelScheduledMessage(messageId, customUser.getShopId());

    return ResponseEntity.ok(ApiResponse.success(null));
  }
}