from datetime import datetime from typing import TYPE_CHECKING from sqlalchemy import BOOLEAN, INTEGER, TEXT, ForeignKey, func from sqlalchemy.dialects.postgresql import TIMESTAMP from sqlalchemy.orm import Mapped, mapped_column, relationship from db.base import Base if TYPE_CHECKING: from db.models.users import User class Session(Base): __tablename__ = "sessions" id: Mapped[int] = mapped_column( INTEGER, unique=True, autoincrement=True, nullable=False, primary_key=True ) user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), nullable=False) refresh_token_hash: Mapped[str] = mapped_column(TEXT, nullable=False) source: Mapped[str] = mapped_column(TEXT, nullable=False) created_at: Mapped[datetime] = mapped_column(TIMESTAMP, default=func.now()) is_revoked: Mapped[bool] = mapped_column(BOOLEAN, default=False) revoked_at: Mapped[datetime] = mapped_column(TIMESTAMP, nullable=True) user: Mapped["User"] = relationship(back_populates="sessions", lazy="selectin")