OrderRestController.java
package com.example.orderplatform.orders.api;
import com.example.orderplatform.generated.api.OrdersApi;
import com.example.orderplatform.generated.model.Money;
import com.example.orderplatform.generated.model.OrderCreateRequest;
import com.example.orderplatform.generated.model.OrderLineResponse;
import com.example.orderplatform.generated.model.OrderResponse;
import java.net.URI;
import java.util.List;
import java.util.UUID;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;
@RestController
class OrderRestController implements OrdersApi {
private final OrderManagement orders;
OrderRestController(OrderManagement orders) {
this.orders = orders;
}
@Override
public ResponseEntity<OrderResponse> createOrder(OrderCreateRequest request) {
OrderSummary order = orders.placeOrder(new OrderCommand(
request.getCustomerId(),
request.getItems().stream()
.map(item -> new OrderItemCommand(item.getProductCode(), item.getQuantity()))
.toList()));
return ResponseEntity
.created(URI.create("/orders/" + order.id()))
.body(toResponse(order));
}
@Override
public ResponseEntity<OrderResponse> getOrder(UUID orderId) {
return ResponseEntity.ok(toResponse(orders.getOrder(orderId)));
}
private OrderResponse toResponse(OrderSummary order) {
return new OrderResponse()
.id(order.id())
.customerId(order.customerId())
.status(OrderResponse.StatusEnum.valueOf(order.status()))
.total(toMoney(order.total()))
.lines(toLines(order.lines()))
.createdAt(order.createdAt());
}
private List<OrderLineResponse> toLines(List<OrderLineSummary> lines) {
return lines.stream()
.map(line -> new OrderLineResponse()
.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());
}
}