PricingRestController.java

package com.example.orderplatform.pricing.api;

import com.example.orderplatform.generated.api.PricingApi;
import com.example.orderplatform.generated.model.Money;
import com.example.orderplatform.generated.model.PricingLineResponse;
import com.example.orderplatform.generated.model.PricingQuoteRequest;
import com.example.orderplatform.generated.model.PricingQuoteResponse;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;

@RestController
class PricingRestController implements PricingApi {

    private final PricingService pricing;

    PricingRestController(PricingService pricing) {
        this.pricing = pricing;
    }

    @Override
    public ResponseEntity<PricingQuoteResponse> quotePrices(PricingQuoteRequest request) {
        PricingQuote quote = pricing.quoteFor(request.getItems().stream()
                .map(item -> new PricingRequest(item.getProductCode(), item.getQuantity()))
                .toList());

        return ResponseEntity.ok(new PricingQuoteResponse()
                .total(toMoney(quote.total()))
                .lines(toLines(quote.lines())));
    }

    private List<PricingLineResponse> toLines(List<PricedLine> lines) {
        return lines.stream()
                .map(line -> new PricingLineResponse()
                        .productCode(line.productCode())
                        .quantity(line.quantity())
                        .unitPrice(toMoney(line.unitPrice()))
                        .lineTotal(toMoney(line.lineTotal())))
                .toList();
    }

    private Money toMoney(com.example.orderplatform.Money money) {
        return new Money().amount(money.amount()).currency(money.currency());
    }
}