JpaOrderStore.java

package com.example.orderplatform.orders.infrastructure;

import com.example.orderplatform.Money;
import com.example.orderplatform.orders.api.OrderLineSummary;
import com.example.orderplatform.orders.api.OrderSummary;
import com.example.orderplatform.orders.application.OrderStore;
import com.example.orderplatform.orders.domain.OrderDraft;
import java.time.OffsetDateTime;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import org.springframework.stereotype.Service;

@Service
class JpaOrderStore implements OrderStore {

    private final OrderRepository orders;

    JpaOrderStore(OrderRepository orders) {
        this.orders = orders;
    }

    @Override
    public OrderSummary save(UUID id, OrderDraft draft, OffsetDateTime createdAt) {
        return toSummary(orders.save(OrderEntity.from(id, draft, createdAt)));
    }

    @Override
    public Optional<OrderSummary> findById(UUID orderId) {
        return orders.findById(orderId).map(this::toSummary);
    }

    private OrderSummary toSummary(OrderEntity order) {
        List<OrderLineSummary> lines = order.lines().stream()
                .map(this::toLineSummary)
                .toList();
        return new OrderSummary(
                order.id(),
                order.customerId(),
                order.status().name(),
                Money.of(order.totalAmount(), order.currency()),
                lines,
                order.createdAt());
    }

    private OrderLineSummary toLineSummary(OrderLineEntity line) {
        Money unitPrice = Money.of(line.unitAmount(), line.currency());
        return new OrderLineSummary(line.productCode(), line.quantity(), unitPrice, unitPrice.multiply(line.quantity()));
    }
}