카드 매입 승인 경로 Spring Boot 3 전환 #13
1 changed files with 91 additions and 0 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue