Spaces:
Sleeping
Sleeping
| 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 | |