47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
"""
|
|
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,
|
|
}
|