PaymentRestController.java
package com.example.orderplatform.payments.api;
import com.example.orderplatform.BusinessRuleViolationException;
import com.example.orderplatform.Money;
import com.example.orderplatform.generated.api.PaymentsApi;
import com.example.orderplatform.generated.model.PaymentAuthorizeRequest;
import com.example.orderplatform.generated.model.PaymentResponse;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;
@RestController
class PaymentRestController implements PaymentsApi {
private final PaymentManagement payments;
PaymentRestController(PaymentManagement payments) {
this.payments = payments;
}
@Override
public ResponseEntity<PaymentResponse> authorizePayment(PaymentAuthorizeRequest request) {
var amount = request.getAmount().getAmount();
// Enforce the contract before Money normalizes values for internal arithmetic.
if (amount.stripTrailingZeros().scale() > 2) {
throw new BusinessRuleViolationException("Payment amount must be a multiple of 0.01.");
}
PaymentSummary payment = payments.authorize(
request.getOrderId(),
Money.of(amount, request.getAmount().getCurrency()));
return ResponseEntity.ok(toResponse(payment));
}
@Override
public ResponseEntity<PaymentResponse> getPayment(UUID paymentId) {
return ResponseEntity.ok(toResponse(payments.getPayment(paymentId)));
}
private PaymentResponse toResponse(PaymentSummary payment) {
return new PaymentResponse()
.id(payment.id())
.orderId(payment.orderId())
.status(PaymentResponse.StatusEnum.valueOf(payment.status()))
.amount(new com.example.orderplatform.generated.model.Money()
.amount(payment.amount().amount())
.currency(payment.amount().currency()))
.createdAt(payment.createdAt())
.authorizedAt(payment.authorizedAt());
}
}