from __future__ import annotations from datetime import datetime from sqlalchemy import Boolean, DateTime, Index, String, func, text from sqlalchemy.dialects.postgresql import CIDR, INET from sqlalchemy.orm import Mapped, mapped_column from app.models.db import Base class InterceptLog(Base): __tablename__ = "intercept_logs" __table_args__ = ( Index("idx_intercept_logs_hash", "token_hash"), Index("idx_intercept_logs_time", text("intercepted_at DESC")), ) id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) token_hash: Mapped[str] = mapped_column(String(64), nullable=False) token_display: Mapped[str] = mapped_column(String(20), nullable=False) bound_ip: Mapped[str] = mapped_column(CIDR, nullable=False) attempt_ip: Mapped[str] = mapped_column(INET, nullable=False) alerted: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, server_default=text("FALSE")) intercepted_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), )