from __future__ import annotations from datetime import datetime from sqlmodel import Field, Relationship, SQLModel from app.core.constants import Role from app.db.base import SoftDeleteMixin, TimestampMixin class User(TimestampMixin, SoftDeleteMixin, SQLModel, table=True): __tablename__ = "users" id: int | None = Field(default=None, primary_key=True) email: str = Field(max_length=255, unique=True, index=True) hashed_password: str = Field(max_length=255) role: str = Field(default=Role.USER, max_length=20) is_active: bool = Field(default=True) is_verified: bool = Field(default=False) last_login_at: datetime | None = Field(default=None) # Relationships profile: UserProfile | None = Relationship(back_populates="user") refresh_tokens: list[RefreshToken] = Relationship(back_populates="user") class UserProfile(TimestampMixin, SQLModel, table=True): __tablename__ = "user_profiles" id: int | None = Field(default=None, primary_key=True) user_id: int = Field(foreign_key="users.id", unique=True, index=True) full_name: str = Field(default="", max_length=100) phone: str = Field(default="", max_length=20) organization: str = Field(default="", max_length=100) avatar_url: str = Field(default="", max_length=500) # Relationships user: User | None = Relationship(back_populates="profile") # Forward reference resolution from app.models.mariadb.auth import RefreshToken # noqa: E402 User.model_rebuild()