import enum from typing import List, Optional from sqlalchemy import ForeignKey, BigInteger from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.dialects.postgresql import ENUM from db.base import Base from db.models.products import Product class OrderStatus(enum.Enum): CREATED = "CREATED" PAID = "PAID" IN_PROGRESS = "IN_PROGRESS" CANCELLED = "CANCELLED" DRAFT = "DRAFT" class Order(Base): __tablename__ = "orders" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) customer: Mapped[Optional[int]] = mapped_column(BigInteger) status: Mapped[OrderStatus] = mapped_column(ENUM(OrderStatus, name="order_status")) items: Mapped[List["OrderItem"]] = relationship("OrderItem", back_populates="order") class OrderItem(Base): __tablename__ = "order_items" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) order_id: Mapped[int] = mapped_column(ForeignKey("orders.id")) product_id: Mapped[int] = mapped_column(ForeignKey("products.id")) quantity: Mapped[int] = mapped_column(default=1) order: Mapped["Order"] = relationship("Order", back_populates="items") product: Mapped["Product"] = relationship("Product")