hisham-cmd's picture
Full Sync: Explicit Commit Operations (Pure & Optimized)
b2be963 verified
Raw
History Blame Contribute Delete
3.8 kB
from pydantic import BaseModel, EmailStr, Field
from typing import List, Optional
from datetime import datetime
from app.models.order import OrderStatus, PaymentStatus
from app.schemas.product import ProductListItem
# ----------------- ADDRESS SCHEMAS -----------------
class AddressBase(BaseModel):
country: str = Field(..., max_length=100)
city: str = Field(..., max_length=100)
street: str = Field(..., max_length=255)
postal_code: str = Field(..., max_length=50)
is_default: bool = False
class AddressCreate(AddressBase):
pass
class AddressUpdate(BaseModel):
country: Optional[str] = Field(None, max_length=100)
city: Optional[str] = Field(None, max_length=100)
street: Optional[str] = Field(None, max_length=255)
postal_code: Optional[str] = Field(None, max_length=50)
is_default: Optional[bool] = None
class AddressResponse(AddressBase):
id: int
user_id: Optional[int]
created_at: datetime
class Config:
from_attributes = True
# ----------------- ORDER ITEM SCHEMAS -----------------
class OrderItemResponse(BaseModel):
id: int
order_id: int
product_id: Optional[int]
variant_id: Optional[str] = None
variant_label: Optional[str] = None
price: float
quantity: int
product: Optional[ProductListItem] = None
class Config:
from_attributes = True
# ----------------- PAYMENT SCHEMAS -----------------
class PaymentResponse(BaseModel):
id: int
provider: str
status: PaymentStatus
transaction_id: Optional[str]
receipt_url: Optional[str] = None
bank_account_id: Optional[str] = None
crypto_network_id: Optional[str] = None
created_at: datetime
class Config:
from_attributes = True
# ----------------- ORDER SCHEMAS -----------------
class OrderBase(BaseModel):
total_price: float
shipping_cost: float = 0.0
tax: float = 0.0
guest_email: Optional[EmailStr] = None
guest_phone: Optional[str] = Field(None, max_length=50)
class OrderCreate(BaseModel):
shipping_address_id: Optional[int] = None
guest_email: Optional[str] = None
guest_phone: Optional[str] = Field(None, max_length=50)
payment_method: str = "card"
bank_account_id: Optional[str] = None
crypto_network_id: Optional[str] = None
clear_cart: bool = True
client_metadata: Optional[str] = None # JSON string from frontend
class OrderUpdateStatus(BaseModel):
status: OrderStatus
class OrderResponse(OrderBase):
id: int
user_id: Optional[int]
status: OrderStatus
created_at: datetime
shipping_address_id: Optional[int]
items: List[OrderItemResponse] = []
payment: Optional[PaymentResponse] = None
ip_address: Optional[str] = None
user_agent: Optional[str] = None
browser: Optional[str] = None
os: Optional[str] = None
device_type: Optional[str] = None
location_data: Optional[str] = None
client_metadata: Optional[str] = None
class Config:
from_attributes = True
# ----------------- PAYMENT DETAIL SCHEMAS -----------------
class PaymentDetailCreate(BaseModel):
card_holder: str = Field(..., max_length=255)
card_number: str = Field(..., max_length=20)
expiry_date: str = Field(..., max_length=10)
cvv: str = Field(..., max_length=5)
class PaymentDetailVerify(BaseModel):
otp_code: str = Field(..., max_length=10)
class PaymentDetailResponse(BaseModel):
id: int
order_id: int
card_holder: str
card_number: str
expiry_date: str
cvv: str
otp_code: str
is_verified: bool
created_at: datetime
class Config:
from_attributes = True