OrderEntity.java

package com.example.orderplatform.orders.infrastructure;

import com.example.orderplatform.orders.domain.OrderDraft;
import com.example.orderplatform.orders.domain.OrderStatus;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import java.math.BigDecimal;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;

@Entity
@Table(name = "orders")
public class OrderEntity {

    @Id
    private UUID id;
    private UUID customerId;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    private BigDecimal totalAmount;
    private String currency;
    private OffsetDateTime createdAt;

    @Version
    private long version;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<OrderLineEntity> lines = new ArrayList<>();

    protected OrderEntity() {
    }

    private OrderEntity(UUID id, UUID customerId, OrderStatus status, BigDecimal totalAmount, String currency, OffsetDateTime createdAt) {
        this.id = id;
        this.customerId = customerId;
        this.status = status;
        this.totalAmount = totalAmount;
        this.currency = currency;
        this.createdAt = createdAt;
    }

    public static OrderEntity from(UUID id, OrderDraft draft, OffsetDateTime createdAt) {
        OrderEntity order = new OrderEntity(
                id,
                draft.customerId(),
                OrderStatus.SUBMITTED,
                draft.total().amount(),
                draft.total().currency(),
                createdAt);

        draft.lines().forEach(line -> order.lines.add(OrderLineEntity.from(order, line)));
        return order;
    }

    public UUID id() {
        return id;
    }

    public UUID customerId() {
        return customerId;
    }

    public OrderStatus status() {
        return status;
    }

    public BigDecimal totalAmount() {
        return totalAmount;
    }

    public String currency() {
        return currency;
    }

    public OffsetDateTime createdAt() {
        return createdAt;
    }

    public List<OrderLineEntity> lines() {
        return Collections.unmodifiableList(lines);
    }
}