카드 매입 승인 경로 Spring Boot 3 전환 (ACX-E2E-1785394564819)
Some checks are pending
Verify / source-contract (push) Waiting to run
Some checks are pending
Verify / source-contract (push) Waiting to run
This commit is contained in:
parent
6b14edeaf1
commit
ac3006a215
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