카드 매입 승인 경로 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 b379184b90 - Show all commits

View file

@ -0,0 +1,70 @@
package com.acquirex.controller;
import com.acquirex.service.CardAcquisitionService;
import com.acquirex.service.CardAcquisitionService.AcquisitionRequest;
import com.acquirex.service.CardAcquisitionService.AcquisitionResponse;
import com.acquirex.service.CardAcquisitionService.ApprovalRequest;
import com.acquirex.service.CardAcquisitionService.AcquisitionNotFoundException;
import com.acquirex.service.CardAcquisitionService.InvalidAcquisitionStateException;
import jakarta.validation.Valid;
import jakarta.validation.constraints.*;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/acquisitions")
@RequiredArgsConstructor
public class CardAcquisitionController {
private final CardAcquisitionService service;
public record RequestDto(
@NotBlank(message = "카드번호 필수") @Size(min = 13, max = 19) String cardNumber,
@NotBlank @Size(max = 20) String merchantId,
@NotNull @DecimalMin("0.01") BigDecimal amount) {}
public record ApprovalDto(@NotBlank @Size(max = 50) String approvedBy) {}
@PostMapping
public ResponseEntity<AcquisitionResponse> requestAcquisition(@Valid @RequestBody RequestDto dto) {
return ResponseEntity.status(HttpStatus.CREATED)
.body(service.requestAcquisition(new AcquisitionRequest(dto.cardNumber(), dto.merchantId(), dto.amount())));
}
@GetMapping("/{id}")
public ResponseEntity<AcquisitionResponse> getAcquisition(@PathVariable Long id) {
return ResponseEntity.ok(service.getAcquisition(id));
}
@GetMapping("/pending")
public ResponseEntity<List<AcquisitionResponse>> getPendingAcquisitions() {
return ResponseEntity.ok(service.getPendingAcquisitions());
}
@PostMapping("/{id}/approve")
public ResponseEntity<AcquisitionResponse> approveAcquisition(@PathVariable Long id, @Valid @RequestBody ApprovalDto dto) {
return ResponseEntity.ok(service.approveAcquisition(id, new ApprovalRequest(dto.approvedBy())));
}
@PostMapping("/{id}/reject")
public ResponseEntity<AcquisitionResponse> rejectAcquisition(@PathVariable Long id, @Valid @RequestBody ApprovalDto dto) {
return ResponseEntity.ok(service.rejectAcquisition(id, new ApprovalRequest(dto.approvedBy())));
}
@ExceptionHandler(AcquisitionNotFoundException.class)
public ResponseEntity<Map<String, Object>> handleNotFound(AcquisitionNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(Map.of("timestamp", LocalDateTime.now(), "status", 404, "error", ex.getMessage()));
}
@ExceptionHandler(InvalidAcquisitionStateException.class)
public ResponseEntity<Map<String, Object>> handleInvalidState(InvalidAcquisitionStateException ex) {
return ResponseEntity.badRequest()
.body(Map.of("timestamp", LocalDateTime.now(), "status", 400, "error", ex.getMessage()));
}
}