cosmo_backend/app/models/db/user.py

40 lines
1.5 KiB
Python
Raw Normal View History

2025-12-02 06:29:38 +00:00
"""
User ORM model
"""
from sqlalchemy import Column, String, Integer, Boolean, TIMESTAMP, ForeignKey, Table
from sqlalchemy.sql import func
from sqlalchemy.orm import relationship
from app.database import Base
# Many-to-many relationship table: users <-> roles
user_roles = Table(
'user_roles',
Base.metadata,
Column('user_id', Integer, ForeignKey('users.id', ondelete='CASCADE'), primary_key=True),
Column('role_id', Integer, ForeignKey('roles.id', ondelete='CASCADE'), primary_key=True),
Column('created_at', TIMESTAMP, server_default=func.now()),
)
class User(Base):
"""User account"""
__tablename__ = "users"
id = Column(Integer, primary_key=True, autoincrement=True)
username = Column(String(50), unique=True, nullable=False, index=True, comment="Username (unique)")
password_hash = Column(String(255), nullable=False, comment="Password hash (bcrypt)")
email = Column(String(255), nullable=True, unique=True, index=True, comment="Email address")
full_name = Column(String(100), nullable=True, comment="Full name")
is_active = Column(Boolean, default=True, nullable=False, comment="Account active status")
created_at = Column(TIMESTAMP, server_default=func.now())
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
last_login_at = Column(TIMESTAMP, nullable=True, comment="Last login time")
# Relationships
roles = relationship("Role", secondary=user_roles, back_populates="users")
def __repr__(self):
return f"<User(id={self.id}, username='{self.username}')>"