CreateOrderRequest.java

package io.slayyyyer.orders.web.dto;

import io.slayyyyer.orders.service.CreateOrderCommand;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import java.util.UUID;

public record CreateOrderRequest(
        @NotNull(message = "customerId is required") UUID customerId,
        @NotEmpty(message = "an order needs at least one item") List<@Valid Item> items) {

    public record Item(
            @NotNull(message = "productId is required") UUID productId,
            @Min(value = 1, message = "quantity must be at least 1")
            @Max(value = 1000, message = "quantity must be at most 1000") int quantity) {
    }

    public CreateOrderCommand toCommand(String idempotencyKey) {
        return new CreateOrderCommand(
                customerId,
                items.stream()
                        .map(item -> new CreateOrderCommand.RequestedItem(item.productId(), item.quantity()))
                        .toList(),
                idempotencyKey);
    }
}