CouponValidationController.java

package com.deveagles.be15_deveagles_be.features.coupons.presentation.controller;

import com.deveagles.be15_deveagles_be.common.dto.ApiResponse;
import com.deveagles.be15_deveagles_be.features.coupons.application.validation.CouponApplicationService;
import com.deveagles.be15_deveagles_be.features.coupons.presentation.dto.request.CouponApplicationRequest;
import com.deveagles.be15_deveagles_be.features.coupons.presentation.dto.response.CouponApplicationResponse;
import com.deveagles.be15_deveagles_be.features.coupons.presentation.dto.response.CouponValidationResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Tag(name = "쿠폰 검증/적용", description = "쿠폰 유효성 검증 및 할인 적용 API")
@RestController
@RequestMapping("/coupons/validation")
@RequiredArgsConstructor
@Validated
@Slf4j
public class CouponValidationController {

  private final CouponApplicationService couponApplicationService;

  @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("/validate")
  public ResponseEntity<ApiResponse<CouponValidationResponse>> validateCoupon(
      @Parameter(description = "쿠폰 검증 요청 정보", required = true) @Valid @RequestBody
          CouponApplicationRequest request) {
    log.info("쿠폰 검증 요청 - 코드: {}, 매장ID: {}", request.getCouponCode(), request.getShopId());

    CouponValidationResponse result = couponApplicationService.validateCoupon(request);
    return ResponseEntity.ok(ApiResponse.success(result));
  }

  @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("/apply-simulation")
  public ResponseEntity<ApiResponse<CouponApplicationResponse>> applyCouponSimulation(
      @Parameter(description = "쿠폰 적용 요청 정보", required = true) @Valid @RequestBody
          CouponApplicationRequest request) {
    log.info(
        "쿠폰 적용 시뮬레이션 요청 - 코드: {}, 원금액: {}", request.getCouponCode(), request.getOriginalAmount());

    CouponApplicationResponse result = couponApplicationService.applyCoupon(request);
    return ResponseEntity.ok(ApiResponse.success(result));
  }
}