From 7f2b733f2fadfdd20fb4e47db5e531f5204532d5 Mon Sep 17 00:00:00 2001 From: forge-bot Date: Thu, 30 Jul 2026 10:04:29 +0000 Subject: [PATCH] =?UTF-8?q?=EC=B9=B4=EB=93=9C=20=EB=A7=A4=EC=9E=85=20?= =?UTF-8?q?=EC=8A=B9=EC=9D=B8=20=EA=B2=BD=EB=A1=9C=20Spring=20Boot=203=20?= =?UTF-8?q?=EC=A0=84=ED=99=98=20(ACX-E2E-1785394564819)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../approval/service/ApprovalService.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 src/main/java/com/acquirex/approval/service/ApprovalService.java diff --git a/src/main/java/com/acquirex/approval/service/ApprovalService.java b/src/main/java/com/acquirex/approval/service/ApprovalService.java new file mode 100644 index 0000000..352a706 --- /dev/null +++ b/src/main/java/com/acquirex/approval/service/ApprovalService.java @@ -0,0 +1,66 @@ +package com.acquirex.approval.service; + +import com.acquirex.approval.domain.ApprovalRequest; +import com.acquirex.approval.domain.ApprovalRequest.ApprovalStatus; +import com.acquirex.approval.dto.ApprovalDto.Request; +import com.acquirex.approval.dto.ApprovalDto.Response; +import com.acquirex.approval.repository.ApprovalRequestRepository; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.UUID; + +@Service +public class ApprovalService { + + private final ApprovalRequestRepository repository; + + public ApprovalService(ApprovalRequestRepository repository) { + this.repository = repository; + } + + @Transactional + public Response processApproval(Request requestDto) { + ApprovalRequest request = new ApprovalRequest( + requestDto.getCardNumber(), + requestDto.getMerchantId(), + requestDto.getAmount(), + requestDto.getCurrency() + ); + + ApprovalRequest saved = repository.save(request); + + if (validateRequest(requestDto)) { + String approvalCode = generateApprovalCode(); + saved.setStatus(ApprovalStatus.APPROVED); + saved.setApprovalCode(approvalCode); + repository.save(saved); + return Response.approved(saved.getId(), approvalCode, saved.getAmount(), saved.getCurrency()); + } else { + saved.setStatus(ApprovalStatus.DECLINED); + repository.save(saved); + return Response.declined(saved.getId(), "Validation failed"); + } + } + + @Transactional(readOnly = true) + public ApprovalRequest findById(Long id) { + return repository.findById(id) + .orElseThrow(() -> new IllegalArgumentException("Approval request not found: " + id)); + } + + @Transactional(readOnly = true) + public long countPendingApprovals() { + return repository.countByStatus(ApprovalStatus.PENDING); + } + + private boolean validateRequest(Request dto) { + if (dto.getAmount() == null || dto.getAmount().signum() <= 0) return false; + if (dto.getCardNumber() == null || dto.getCardNumber().length() < 13) return false; + if (dto.getMerchantId() == null || dto.getMerchantId().isEmpty()) return false; + return dto.getCurrency() != null && dto.getCurrency().length() == 3; + } + + private String generateApprovalCode() { + return "APP-" + UUID.randomUUID().toString().substring(0, 8).toUpperCase(); + } +} \ No newline at end of file