import uuid from datetime import datetime from sqlalchemy import Boolean, DateTime, Index, String, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column from app.db.base import Base class User(Base): __tablename__ = "users" id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, ) full_name: Mapped[str] = mapped_column( String(150), nullable=False, ) email: Mapped[str] = mapped_column( String(320), nullable=False, unique=True, ) password_hash: Mapped[str] = mapped_column( String(255), nullable=False, ) country_code: Mapped[str | None] = mapped_column( String(2), nullable=True, ) preferred_language: Mapped[str] = mapped_column( String(5), nullable=False, default="fr", server_default="fr", ) role: Mapped[str] = mapped_column( String(30), nullable=False, default="user", server_default="user", ) is_active: Mapped[bool] = mapped_column( Boolean, nullable=False, default=True, server_default="true", ) is_email_verified: Mapped[bool] = mapped_column( Boolean, nullable=False, default=False, server_default="false", ) onboarding_completed: Mapped[bool] = mapped_column( Boolean, nullable=False, default=False, server_default="false", ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), ) updated_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now(), onupdate=func.now(), ) __table_args__ = ( Index("ix_users_email", "email"), Index("ix_users_role", "role"), )