""" User and Role models for authentication and RBAC. """ import uuid from datetime import datetime from app import db class Role(db.Model): __tablename__ = "roles" id = db.Column(db.String(36), primary_key=True, default=lambda: str(uuid.uuid4())) name = db.Column(db.String(64), unique=True, nullable=False) description = db.Column(db.String(256)) permissions = db.Column(db.JSON, default=list) # list of permission strings created_at = db.Column(db.DateTime, default=datetime.utcnow) users = db.relationship("User", backref="role", lazy="dynamic") class User(db.Model): __tablename__ = "users" id = db.Column(db.String(36), primary_key=True, default=lambda: str(uuid.uuid4())) email = db.Column(db.String(255), unique=True, nullable=False, index=True) username = db.Column(db.String(64), unique=True, nullable=False, index=True) password_hash = db.Column(db.String(256), nullable=False) display_name = db.Column(db.String(128)) avatar_url = db.Column(db.String(512)) role_id = db.Column(db.String(36), db.ForeignKey("roles.id"), nullable=True) is_active = db.Column(db.Boolean, default=True) is_verified = db.Column(db.Boolean, default=False) last_login_at = db.Column(db.DateTime) created_at = db.Column(db.DateTime, default=datetime.utcnow) updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) conversations = db.relationship("Conversation", backref="user", lazy="dynamic", foreign_keys="Conversation.user_id") def to_dict(self): return { "id": self.id, "email": self.email, "username": self.username, "display_name": self.display_name or self.username, "avatar_url": self.avatar_url, "is_active": self.is_active, "created_at": self.created_at.isoformat() if self.created_at else None, }