import enum from sqlalchemy import Boolean, Column, DateTime, Enum, Index, Integer, JSON, String, UniqueConstraint, func from web.database import Base class UserRoleEnum(str, enum.Enum): system = "system" admin = "admin" user = "user" class UserStatusEnum(str, enum.Enum): pending = "pending" active = "active" suspended = "suspended" class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, autoincrement=True) first_name = Column(String(100), nullable=False) last_name = Column(String(100), nullable=False) email = Column(String(255), nullable=False) phone = Column(String(20), nullable=False) password_hash = Column(String(255), nullable=True) is_email_confirmed = Column(Boolean, nullable=False, default=False) email_confirm_token = Column(String(255), nullable=True) password_reset_token = Column(String(255), nullable=True) password_reset_expires = Column(DateTime, nullable=True) role = Column(Enum(UserRoleEnum), nullable=False, default=UserRoleEnum.user) status = Column(Enum(UserStatusEnum), nullable=False, default=UserStatusEnum.pending) evotor_user_id = Column(String(255), nullable=True) evotor_meta = Column(JSON, nullable=True) invite_token = Column(String(255), nullable=True) invite_expires = Column(DateTime, nullable=True) phone_otp = Column(String(10), nullable=True) phone_otp_expires = Column(DateTime, nullable=True) created_at = Column(DateTime, nullable=False, server_default=func.now()) updated_at = Column(DateTime, nullable=False, server_default=func.now(), onupdate=func.now()) __table_args__ = ( UniqueConstraint("email", name="ix_users_email"), UniqueConstraint("phone", name="ix_users_phone"), UniqueConstraint("evotor_user_id", name="ix_users_evotor_user_id"), Index("ix_users_role", "role"), Index("ix_users_status", "status"), )