from __future__ import annotations from datetime import datetime from decimal import Decimal from typing import Annotated from pydantic import BaseModel, ConfigDict, Field, StrictInt, model_validator from app.models.order import OrderStatusEnum class OrderCreateItem(BaseModel): model_config = ConfigDict(extra="forbid") product_id: Annotated[StrictInt, Field(gt=0)] quantity: Annotated[StrictInt, Field(gt=0, le=1000)] class OrderCreate(BaseModel): model_config = ConfigDict(extra="forbid") items: Annotated[list[OrderCreateItem], Field(min_length=1, max_length=100)] @model_validator(mode="after") def validate_unique_products(self) -> "OrderCreate": product_ids = [item.product_id for item in self.items] if len(product_ids) != len(set(product_ids)): raise ValueError("Each product may only appear once per order") return self class OrderItemResponse(BaseModel): model_config = ConfigDict(from_attributes=True, extra="forbid") id: int product_id: int product_name: str quantity: int unit_price: Decimal subtotal: Decimal class OrderResponse(BaseModel): model_config = ConfigDict(from_attributes=True, extra="forbid") id: int status: OrderStatusEnum total_amount: Decimal created_at: datetime paid_at: datetime | None items: list[OrderItemResponse]