Files
fquiz/api/app/models/user.py
T

58 lines
1.6 KiB
Python

from __future__ import annotations
from datetime import datetime
from typing import TYPE_CHECKING
from uuid import uuid4
from sqlalchemy import DateTime, String
from sqlalchemy.orm import Mapped, mapped_column, relationship
from ..core.database import Base
from .base import utcnow
if TYPE_CHECKING:
from .auth_session import AuthSession
from .audit_log import AuditLog
from .rbac import Role
class User(Base):
__tablename__ = "users"
id: Mapped[str] = mapped_column(
String(36),
primary_key=True,
default=lambda: str(uuid4()),
)
email: Mapped[str] = mapped_column(String(255), unique=True, index=True)
username: Mapped[str] = mapped_column(String(64), unique=True, index=True)
password_hash: Mapped[str] = mapped_column(String(255))
status: Mapped[str] = mapped_column(String(32), default="active", index=True)
last_login_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=utcnow,
)
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=utcnow,
onupdate=utcnow,
)
roles: Mapped[list[Role]] = relationship(
"Role",
secondary="user_roles",
back_populates="users",
lazy="selectin",
)
sessions: Mapped[list[AuthSession]] = relationship(
"AuthSession",
back_populates="user",
lazy="selectin",
)
audit_logs: Mapped[list[AuditLog]] = relationship(
"AuditLog",
back_populates="user",
lazy="selectin",
)