ifixkart-backend/Backend/app/models/UserModel.py

43 lines
2.2 KiB
Python

from sqlalchemy import Column, String, Boolean, DateTime, Date, Integer, ForeignKey
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.core.database.db_session import Base
class User(Base):
__tablename__ = "users"
user_id = Column(String(26), primary_key=True)
employee_code = Column(String(30), unique=True, nullable=True)
first_name = Column(String(50), nullable=False)
last_name = Column(String(50), nullable=False)
display_name = Column(String(100), nullable=True)
email = Column(String(150), unique=True, nullable=False)
phone = Column(String(20), unique=True, nullable=False)
password_hash = Column(String(255), nullable=False)
profile_image_id = Column(String(26), nullable=True) # FK defined via alter table or string to avoid circular dependency
gender = Column(String(15), nullable=True)
dob = Column(Date, nullable=True)
department_id = Column(String(26), ForeignKey("departments.department_id", ondelete="RESTRICT"), nullable=False)
designation_id = Column(String(26), ForeignKey("designations.designation_id", ondelete="RESTRICT"), nullable=False)
role_id = Column(String(26), ForeignKey("roles.role_id", ondelete="RESTRICT"), nullable=False)
manager_id = Column(String(26), ForeignKey("users.user_id", ondelete="SET NULL"), nullable=True)
is_active = Column(Boolean, default=True)
email_verified = Column(Boolean, default=False)
phone_verified = Column(Boolean, default=False)
failed_login_attempts = Column(Integer, default=0)
is_locked = Column(Boolean, default=False)
last_login = Column(DateTime, nullable=True)
mfa_secret = Column(String(32), nullable=True)
mfa_enabled = Column(Boolean, default=False)
created_at = Column(DateTime, server_default=func.now())
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
deleted_at = Column(DateTime, nullable=True)
# Relationships
department = relationship("Department", foreign_keys=[department_id])
designation = relationship("Designation", foreign_keys=[designation_id])
role = relationship("Role", foreign_keys=[role_id])
manager = relationship("User", remote_side=[user_id], backref="subordinates")