feat(sub): subscription logic (pre release)

This commit is contained in:
2026-08-02 13:23:50 +07:00
parent cde8ce28f5
commit 24f857ef1b
15 changed files with 469 additions and 42 deletions

48
db/models/orders.py Normal file
View File

@@ -0,0 +1,48 @@
from enum import StrEnum
from typing import TYPE_CHECKING
from sqlalchemy import INTEGER, Enum, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from db.base import Base
if TYPE_CHECKING:
from db.models import User
class OrderStatus(StrEnum):
PENDING = "pending"
PAID = "paid"
DISCARDED = "discarded"
class OrderAddon(Base):
__tablename__ = "order_addons"
id: Mapped[int] = mapped_column(
INTEGER, nullable=False, unique=True, autoincrement=True, primary_key=True
)
order_id: Mapped[int] = mapped_column(ForeignKey("orders.id"), nullable=False)
addon_id: Mapped[str] = mapped_column(ForeignKey("addons.id"), nullable=False)
order: Mapped["Order"] = relationship("Order", back_populates="addons", lazy="selectin")
class Order(Base):
__tablename__ = "orders"
id: Mapped[int] = mapped_column(
INTEGER, nullable=False, autoincrement=True, unique=True, primary_key=True
)
user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False)
devices: Mapped[int] = mapped_column(INTEGER, nullable=False)
duration_days: Mapped[int] = mapped_column(INTEGER, nullable=False)
status: Mapped[OrderStatus] = mapped_column(
Enum(OrderStatus, name="orderstatus"), nullable=False, default=OrderStatus.PENDING
)
user: Mapped["User"] = relationship("User", back_populates="orders", lazy="selectin")
addons: Mapped[list["OrderAddon"]] = relationship(
"OrderAddon", back_populates="order", lazy="selectin"
)