52 lines
1.4 KiB
Python
52 lines
1.4 KiB
Python
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]
|