카드 매입 승인 경로 Spring Boot 3 전환 #3

Closed
forge-bot wants to merge 8 commits from forge/ACX-E2E-1785394564819-attempt-4-run-f671ee0cb5b3 into main
Showing only changes of commit 83fff6fcee - Show all commits

View file

@ -0,0 +1,100 @@
package com.acquirex.cardacquisition.service;
import com.acquirex.cardacquisition.domain.AcquisitionApproval;
import com.acquirex.cardacquisition.domain.AcquisitionApproval.ApprovalStatus;
import com.acquirex.cardacquisition.dto.ApprovalDto.ApprovalRequest;
import com.acquirex.cardacquisition.dto.ApprovalDto.ApprovalResponse;
import com.acquirex.cardacquisition.repository.AcquisitionApprovalRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
@Service
public class AcquisitionApprovalService {
private final AcquisitionApprovalRepository repository;
public AcquisitionApprovalService(AcquisitionApprovalRepository repository) {
this.repository = repository;
}
@Transactional
public ApprovalResponse requestApproval(ApprovalRequest request) {
AcquisitionApproval approval = new AcquisitionApproval();
approval.setCardNumber(request.cardNumber());
approval.setMerchantId(request.merchantId());
approval.setAmount(request.amount());
approval.setStatus(ApprovalStatus.PENDING);
AcquisitionApproval saved = repository.save(approval);
return toResponse(saved);
}
@Transactional
public ApprovalResponse approve(Long id) {
AcquisitionApproval approval = repository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("승인 요청을 찾을 수 없습니다: " + id));
if (approval.getStatus() != ApprovalStatus.PENDING) {
throw new IllegalStateException("대기 상태의 요청만 승인 가능합니다");
}
approval.setStatus(ApprovalStatus.APPROVED);
approval.setApprovalCode(generateApprovalCode());
AcquisitionApproval saved = repository.save(approval);
return toResponse(saved);
}
@Transactional
public ApprovalResponse reject(Long id) {
AcquisitionApproval approval = repository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("승인 요청을 찾을 수 없습니다: " + id));
if (approval.getStatus() != ApprovalStatus.PENDING) {
throw new IllegalStateException("대기 상태의 요청만 거절 가능합니다");
}
approval.setStatus(ApprovalStatus.REJECTED);
AcquisitionApproval saved = repository.save(approval);
return toResponse(saved);
}
@Transactional(readOnly = true)
public List<ApprovalResponse> getPendingApprovals() {
return repository.findByStatus(ApprovalStatus.PENDING)
.stream().map(this::toResponse).collect(Collectors.toList());
}
@Transactional(readOnly = true)
public ApprovalResponse getApproval(Long id) {
return repository.findById(id)
.map(this::toResponse)
.orElseThrow(() -> new IllegalArgumentException("승인 요청을 찾을 수 없습니다: " + id));
}
private String generateApprovalCode() {
return "APX" + UUID.randomUUID().toString().substring(0, 8).toUpperCase();
}
private ApprovalResponse toResponse(AcquisitionApproval approval) {
return new ApprovalResponse(
approval.getId(),
maskCardNumber(approval.getCardNumber()),
approval.getMerchantId(),
approval.getAmount(),
approval.getStatus(),
approval.getApprovalCode(),
approval.getCreatedAt()
);
}
private String maskCardNumber(String cardNumber) {
if (cardNumber == null || cardNumber.length() < 4) return cardNumber;
return "****-****-****-" + cardNumber.substring(cardNumber.length() - 4);
}
}