""" User model for storing user information from Azure AD """ from sqlalchemy import Column, String, Boolean, DateTime, JSON from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from sqlalchemy.sql import func import uuid from app.database import Base class User(Base): """ User model representing application users authenticated via Azure AD """ __tablename__ = "users" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True) azure_ad_id = Column(String(255), unique=True, nullable=False, index=True) email = Column(String(255), unique=True, nullable=False, index=True) display_name = Column(String(255)) given_name = Column(String(100)) surname = Column(String(100)) role = Column(String(50), default="user", nullable=False) # user, admin, superadmin is_active = Column(Boolean, default=True, nullable=False) # Timestamps created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) last_login_at = Column(DateTime(timezone=True)) # JSON fields for flexible data storage preferences = Column(JSON, default=dict, nullable=False) # UI preferences meta_data = Column(JSON, default=dict, nullable=False) # Additional metadata # Relationships conversations = relationship("Conversation", back_populates="user", cascade="all, delete-orphan") sessions = relationship("Session", back_populates="user", cascade="all, delete-orphan") token_usage = relationship("TokenUsage", back_populates="user") memories = relationship("UserMemory", back_populates="user", cascade="all, delete-orphan") def __repr__(self): return f""