77 lines
1.5 KiB
Python
77 lines
1.5 KiB
Python
"""Order schemas."""
|
|
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
from uuid import UUID
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class OrderStatus(str, Enum):
|
|
"""Order status enum."""
|
|
|
|
PENDING = "pending"
|
|
PAID = "paid"
|
|
PROCESSING = "processing"
|
|
PRINTING = "printing"
|
|
SHIPPED = "shipped"
|
|
DELIVERED = "delivered"
|
|
CANCELLED = "cancelled"
|
|
REFUNDED = "refunded"
|
|
|
|
|
|
class OrderItemResponse(BaseModel):
|
|
"""Order item in response."""
|
|
|
|
id: UUID
|
|
product_slug: str
|
|
product_name: str
|
|
variant: str | None
|
|
quantity: int
|
|
unit_price: float
|
|
pod_provider: str | None
|
|
pod_status: str | None
|
|
pod_tracking_number: str | None
|
|
pod_tracking_url: str | None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class OrderResponse(BaseModel):
|
|
"""Order response."""
|
|
|
|
id: UUID
|
|
status: str
|
|
shipping_name: str | None
|
|
shipping_email: str | None
|
|
shipping_city: str | None
|
|
shipping_country: str | None
|
|
subtotal: float | None
|
|
shipping_cost: float | None
|
|
tax: float | None
|
|
total: float | None
|
|
currency: str
|
|
items: list[OrderItemResponse]
|
|
created_at: datetime
|
|
paid_at: datetime | None
|
|
shipped_at: datetime | None
|
|
|
|
class Config:
|
|
from_attributes = True
|
|
|
|
|
|
class CheckoutRequest(BaseModel):
|
|
"""Request to create checkout session."""
|
|
|
|
cart_id: UUID
|
|
success_url: str
|
|
cancel_url: str
|
|
|
|
|
|
class CheckoutResponse(BaseModel):
|
|
"""Checkout session response."""
|
|
|
|
checkout_url: str
|
|
session_id: str
|