JpaPaymentStore.java

package com.example.orderplatform.payments.infrastructure;

import com.example.orderplatform.Money;
import com.example.orderplatform.payments.application.PaymentStore;
import com.example.orderplatform.payments.domain.Payment;
import java.util.Optional;
import java.util.UUID;
import org.springframework.stereotype.Service;

@Service
class JpaPaymentStore implements PaymentStore {

    private final PaymentRepository payments;

    JpaPaymentStore(PaymentRepository payments) {
        this.payments = payments;
    }

    @Override
    public Optional<Payment> findById(UUID paymentId) {
        return payments.findById(paymentId).map(this::toDomain);
    }

    @Override
    public Optional<Payment> findByOrderId(UUID orderId) {
        return payments.findByOrderId(orderId).map(this::toDomain);
    }

    @Override
    public Payment save(Payment payment) {
        PaymentEntity entity = payments.findById(payment.id())
                .map(existing -> {
                    existing.updateFrom(payment);
                    return existing;
                })
                .orElseGet(() -> PaymentEntity.from(payment));
        return toDomain(payments.save(entity));
    }

    private Payment toDomain(PaymentEntity payment) {
        return new Payment(
                payment.id(),
                payment.orderId(),
                payment.status(),
                Money.of(payment.amount(), payment.currency()),
                payment.createdAt(),
                payment.authorizedAt());
    }
}