from __future__ import annotations from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Index, Integer, String, func from sqlalchemy.orm import Mapped, mapped_column from supply_infra.db.base import Base class AuthSession(Base): """Server-side browser session. Only a SHA-256 token hash is persisted.""" __tablename__ = "auth_session" __table_args__ = ( Index("idx_auth_session_user", "user_id", "expires_at"), Index("idx_auth_session_expiry", "expires_at"), ) id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) token_hash: Mapped[str] = mapped_column( String(64), nullable=False, unique=True, index=True, ) user_id: Mapped[int] = mapped_column( Integer, ForeignKey("auth_user.id", ondelete="CASCADE"), nullable=False, ) expires_at: Mapped[datetime] = mapped_column(DateTime, nullable=False) ip_address: Mapped[str | None] = mapped_column(String(64), nullable=True) user_agent: Mapped[str | None] = mapped_column(String(512), nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, server_default=func.now(), )