from datetime import datetime
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Boolean, JSON
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
from sqlalchemy.orm import relationship
import uuid
# Assuming Base is imported from your database.py
from .database import Base
class FileRetrievalRequest(Base):
"""
SQLAlchemy model for the 'file_retrieval_requests' table.
Each entry represents a single user request to process a directory
for the AI coding assistant.
"""
__tablename__ = 'file_retrieval_requests'
# Primary key, a UUID for unique and secure identification.
id = Column(PG_UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, index=True)
# The client's main question or instruction for the AI.
question = Column(Text, nullable=False)
# The path or name of the directory provided by the client.
directory_path = Column(String, nullable=False)
# Foreign key to link this request to a specific chat session.
session_id = Column(Integer, ForeignKey('sessions.id'), nullable=False)
# Timestamp for when the request was made.
created_at = Column(DateTime, default=datetime.now, nullable=False)
# Defines a one-to-many relationship with the RetrievedFile table.
# 'cascade' ensures that all associated files are deleted when the request is deleted.
retrieved_files = relationship(
"RetrievedFile",
back_populates="retrieval_request",
cascade="all, delete-orphan"
)
def __repr__(self):
return f"<FileRetrievalRequest(id={self.id}, directory_path='{self.directory_path}')>"
class RetrievedFile(Base):
"""
SQLAlchemy model for the 'retrieved_files' table.
This table stores the content and metadata for each file retrieved
during a file processing request.
"""
__tablename__ = 'retrieved_files'
# Primary key for the file entry.
id = Column(Integer, primary_key=True, index=True)
# Foreign key linking this file back to its parent retrieval request.
request_id = Column(PG_UUID(as_uuid=True), ForeignKey('file_retrieval_requests.id'), nullable=False)
# The full path to the file.
file_path = Column(String, nullable=False)
# The name of the file.
file_name = Column(String, nullable=False)
# The actual content of the file.
content = Column(Text, nullable=False)
# The type of the file content (e.g., 'original', 'updated').
type = Column(String, nullable=False, default='original')
# Timestamp for when the file was last modified.
last_updated = Column(DateTime, default=datetime.now)
# Timestamp for when this entry was created in the database.
created_at = Column(DateTime, default=datetime.now, nullable=False)
# Defines a many-to-one relationship back to the FileRetrievalRequest.
retrieval_request = relationship(
"FileRetrievalRequest",
back_populates="retrieved_files"
)
def __repr__(self):
return f"<RetrievedFile(id={self.id}, file_path='{self.file_path}', type='{self.type}')>"