import enum import uuid from datetime import datetime from sqlalchemy import DateTime, Enum, Float, ForeignKey, Integer, String, Text, func from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database import Base def _uuid() -> str: return str(uuid.uuid4()) def _now() -> datetime: return datetime.utcnow() class TenantStatus(str, enum.Enum): active = "active" suspended = "suspended" deleted = "deleted" class Tenant(Base): __tablename__ = "tenants" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=_uuid) name: Mapped[str] = mapped_column(String(200), nullable=False) slug: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) status: Mapped[TenantStatus] = mapped_column( Enum(TenantStatus), default=TenantStatus.active ) created_at: Mapped[datetime] = mapped_column(DateTime, default=_now) updated_at: Mapped[datetime] = mapped_column(DateTime, default=_now, onupdate=_now) config: Mapped["TenantConfig | None"] = relationship(back_populates="tenant", uselist=False) class TenantConfig(Base): __tablename__ = "tenant_configs" id: Mapped[str] = mapped_column(String(36), primary_key=True, default=_uuid) tenant_id: Mapped[str] = mapped_column( String(36), ForeignKey("tenants.id"), unique=True, nullable=False ) llm_provider: Mapped[str] = mapped_column(String(50), nullable=False) llm_api_key: Mapped[str] = mapped_column(Text, nullable=False) llm_model: Mapped[str] = mapped_column(String(100), nullable=False) llm_base_url: Mapped[str | None] = mapped_column(String(500), nullable=True) max_tokens_per_month: Mapped[int] = mapped_column(Integer, default=1000000) created_at: Mapped[datetime] = mapped_column(DateTime, default=_now) updated_at: Mapped[datetime] = mapped_column(DateTime, default=_now, onupdate=_now) tenant: Mapped["Tenant"] = relationship(back_populates="config")