from __future__ import annotations from datetime import datetime from sqlalchemy import DateTime, Index, Integer, String, func from sqlalchemy.orm import Mapped, mapped_column from supply_infra.db.base import Base class AuthUser(Base): """Local SupplyAgent account with one fixed role.""" __tablename__ = "auth_user" __table_args__ = ( Index("idx_auth_user_role_status", "role", "status"), ) id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) username: Mapped[str] = mapped_column( String(64), nullable=False, unique=True, index=True, ) password_hash: Mapped[str] = mapped_column(String(255), nullable=False) display_name: Mapped[str] = mapped_column(String(128), nullable=False) role: Mapped[str] = mapped_column(String(16), nullable=False, default="user") status: Mapped[str] = mapped_column(String(16), nullable=False, default="active") failed_login_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0) locked_until: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) last_login_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) created_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, server_default=func.now(), ) updated_at: Mapped[datetime] = mapped_column( DateTime, nullable=False, server_default=func.now(), onupdate=func.now(), )