CouponApplicationService.java
package com.deveagles.be15_deveagles_be.features.coupons.application.validation;
import com.deveagles.be15_deveagles_be.features.coupons.common.CouponResponseFactory;
import com.deveagles.be15_deveagles_be.features.coupons.domain.service.CouponDiscountCalculator;
import com.deveagles.be15_deveagles_be.features.coupons.domain.vo.DiscountResult;
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class CouponApplicationService {
private final CouponValidationService couponValidationService;
private final CouponResponseFactory couponResponseFactory;
private final CouponDiscountCalculator couponDiscountCalculator = new CouponDiscountCalculator();
public CouponValidationResponse validateCoupon(CouponApplicationRequest request) {
log.info("쿠폰 검증 요청 - 코드: {}", request.getCouponCode());
return couponValidationService.validateForSale(request);
}
public CouponApplicationResponse applyCoupon(CouponApplicationRequest request) {
log.info("쿠폰 적용 요청 - 코드: {}, 원금액: {}", request.getCouponCode(), request.getOriginalAmount());
CouponValidationResponse validationResult = couponValidationService.validateForSale(request);
if (!validationResult.isValid()) {
return couponResponseFactory.createFailedResponse(validationResult.getErrorMessage());
}
DiscountResult discountResult =
couponDiscountCalculator.calculateDiscount(
validationResult.getCoupon(), request.getOriginalAmount());
log.info(
"할인 계산 완료 - 쿠폰ID: {}, 원금액: {}, 할인율: {}%, 할인금액: {}, 최종금액: {}",
validationResult.getCoupon().getId(),
discountResult.getOriginalAmount(),
discountResult.getDiscountRate(),
discountResult.getDiscountAmount(),
discountResult.getFinalAmount());
return couponResponseFactory.createSuccessResponse(
validationResult.getCoupon(), discountResult);
}
}