PDF-Assit_RAG / backend /app /models.py
Param20h's picture
Changes Pro max
26a0c00 unverified
"""
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")