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

Closed
forge-bot wants to merge 8 commits from forge/ACX-E2E-1785394564819-attempt-14-run-fd5303eb949f into main
Showing only changes of commit ac3006a215 - Show all commits

View file

@ -0,0 +1,91 @@
package com.acquirex.service;
import com.acquirex.domain.AcquisitionStatus;
import com.acquirex.domain.CardAcquisition;
import com.acquirex.repository.CardAcquisitionRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Service
@RequiredArgsConstructor
@Slf4j
public class CardAcquisitionService {
private final CardAcquisitionRepository repository;
public record AcquisitionRequest(String cardNumber, String merchantId, BigDecimal amount) {}
public record ApprovalRequest(String approvedBy) {}
public record AcquisitionResponse(
Long id, String cardNumber, String merchantId, BigDecimal amount,
AcquisitionStatus status, LocalDateTime requestedAt,
LocalDateTime approvedAt, String approvedBy) {}
@Transactional
public AcquisitionResponse requestAcquisition(AcquisitionRequest request) {
log.info("매입 요청: merchantId={}, amount={}", request.merchantId(), request.amount());
CardAcquisition entity = CardAcquisition.builder()
.cardNumber(request.cardNumber())
.merchantId(request.merchantId())
.amount(request.amount())
.status(AcquisitionStatus.PENDING)
.requestedAt(LocalDateTime.now())
.build();
CardAcquisition saved = repository.save(entity);
return toResponse(saved);
}
@Transactional(readOnly = true)
public AcquisitionResponse getAcquisition(Long id) {
return repository.findById(id).map(this::toResponse)
.orElseThrow(() -> new AcquisitionNotFoundException(id));
}
@Transactional(readOnly = true)
public List<AcquisitionResponse> getPendingAcquisitions() {
return repository.findByStatus(AcquisitionStatus.PENDING).stream().map(this::toResponse).toList();
}
@Transactional
public AcquisitionResponse approveAcquisition(Long id, ApprovalRequest request) {
log.info("매입 승인: id={}, approvedBy={}", id, request.approvedBy());
CardAcquisition entity = repository.findById(id).orElseThrow(() -> new AcquisitionNotFoundException(id));
if (entity.getStatus() != AcquisitionStatus.PENDING) {
throw new InvalidAcquisitionStateException(id, entity.getStatus());
}
entity.setStatus(AcquisitionStatus.APPROVED);
entity.setApprovedAt(LocalDateTime.now());
entity.setApprovedBy(request.approvedBy());
return toResponse(repository.save(entity));
}
@Transactional
public AcquisitionResponse rejectAcquisition(Long id, ApprovalRequest request) {
log.info("매입 거절: id={}, rejectedBy={}", id, request.approvedBy());
CardAcquisition entity = repository.findById(id).orElseThrow(() -> new AcquisitionNotFoundException(id));
if (entity.getStatus() != AcquisitionStatus.PENDING) {
throw new InvalidAcquisitionStateException(id, entity.getStatus());
}
entity.setStatus(AcquisitionStatus.REJECTED);
entity.setApprovedAt(LocalDateTime.now());
entity.setApprovedBy(request.approvedBy());
return toResponse(repository.save(entity));
}
private AcquisitionResponse toResponse(CardAcquisition e) {
return new AcquisitionResponse(e.getId(), e.getCardNumber(), e.getMerchantId(),
e.getAmount(), e.getStatus(), e.getRequestedAt(), e.getApprovedAt(), e.getApprovedBy());
}
public static class AcquisitionNotFoundException extends RuntimeException {
public AcquisitionNotFoundException(Long id) { super("매입 요청을 찾을 수 없습니다: id=" + id); }
}
public static class InvalidAcquisitionStateException extends RuntimeException {
public InvalidAcquisitionStateException(Long id, AcquisitionStatus status) {
super("유효하지 않은 상태: id=" + id + ", status=" + status);
}
}
}