auth_user.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from sqlalchemy import DateTime, Index, Integer, String, func
  4. from sqlalchemy.orm import Mapped, mapped_column
  5. from supply_infra.db.base import Base
  6. class AuthUser(Base):
  7. """Local SupplyAgent account with one fixed role."""
  8. __tablename__ = "auth_user"
  9. __table_args__ = (
  10. Index("idx_auth_user_role_status", "role", "status"),
  11. )
  12. id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
  13. username: Mapped[str] = mapped_column(
  14. String(64),
  15. nullable=False,
  16. unique=True,
  17. index=True,
  18. )
  19. password_hash: Mapped[str] = mapped_column(String(255), nullable=False)
  20. display_name: Mapped[str] = mapped_column(String(128), nullable=False)
  21. role: Mapped[str] = mapped_column(String(16), nullable=False, default="user")
  22. status: Mapped[str] = mapped_column(String(16), nullable=False, default="active")
  23. failed_login_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
  24. locked_until: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  25. last_login_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  26. created_at: Mapped[datetime] = mapped_column(
  27. DateTime,
  28. nullable=False,
  29. server_default=func.now(),
  30. )
  31. updated_at: Mapped[datetime] = mapped_column(
  32. DateTime,
  33. nullable=False,
  34. server_default=func.now(),
  35. onupdate=func.now(),
  36. )