""" SQLAlchemy ORM models for users, documents, and chat messages. """ import uuid from datetime import datetime, timezone from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Text, Boolean from sqlalchemy.orm import relationship from app.database import Base def generate_uuid(): return str(uuid.uuid4()) class User(Base): __tablename__ = "users" id = Column(String, primary_key=True, default=generate_uuid) username = Column(String(80), unique=True, nullable=False, index=True) email = Column(String(120), unique=True, nullable=False, index=True) hashed_password = Column(String(255), nullable=False) is_admin = Column(Boolean, default=False) created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) # Relationships documents = relationship("Document", back_populates="owner", cascade="all, delete-orphan") messages = relationship("ChatMessage", back_populates="user", cascade="all, delete-orphan") class Document(Base): __tablename__ = "documents" id = Column(String, primary_key=True, default=generate_uuid) user_id = Column(String, ForeignKey("users.id"), nullable=False, index=True) filename = Column(String(255), nullable=False) # Stored filename (UUID-based) original_name = Column(String(255), nullable=False) # User's original filename file_size = Column(Integer, default=0) # Size in bytes page_count = Column(Integer, default=0) chunk_count = Column(Integer, default=0) status = Column(String(20), default="pending") # pending | processing | ready | failed error_message = Column(Text, nullable=True) uploaded_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) # Relationships owner = relationship("User", back_populates="documents") messages = relationship("ChatMessage", back_populates="document", cascade="all, delete-orphan") class ChatMessage(Base): __tablename__ = "chat_messages" id = Column(String, primary_key=True, default=generate_uuid) user_id = Column(String, ForeignKey("users.id"), nullable=False, index=True) document_id = Column(String, ForeignKey("documents.id"), nullable=True, index=True) role = Column(String(20), nullable=False) # "user" | "assistant" content = Column(Text, nullable=False) sources_json = Column(Text, nullable=True) # JSON string of source citations created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc)) # Relationships user = relationship("User", back_populates="messages") document = relationship("Document", back_populates="messages")