"""File management tables (category tree + records).""" from datetime import datetime from typing import Optional from sqlmodel import Field, Relationship, SQLModel from agenteval.storage.db.core import new_uuid, utc_now class FileCategoryDB(SQLModel, table=True): """Database table for file categories (tree structure via parent_id).""" __tablename__ = "file_categories" id: Optional[str] = Field(default_factory=new_uuid, primary_key=True) name: str parent_id: Optional[str] = Field( default=None, foreign_key="file_categories.id", ) created_at: Optional[datetime] = Field(default_factory=utc_now) updated_at: Optional[datetime] = Field(default_factory=utc_now) parent: Optional["FileCategoryDB"] = Relationship( back_populates="children", sa_relationship_kwargs={"remote_side": "FileCategoryDB.id"}, ) children: list["FileCategoryDB"] = Relationship( back_populates="parent", sa_relationship_kwargs={"cascade": "all, delete-orphan"}, ) files: list["FileRecordDB"] = Relationship( back_populates="category", sa_relationship_kwargs={"cascade": "all, delete-orphan"}, ) class FileRecordDB(SQLModel, table=True): """Database table for uploaded file records.""" __tablename__ = "file_records" id: Optional[str] = Field(default_factory=new_uuid, primary_key=True) original_name: str storage_name: str category_id: Optional[str] = Field( default=None, foreign_key="file_categories.id", ) file_size: int = 0 mime_type: str = "" file_ext: str = "" created_at: Optional[datetime] = Field(default_factory=utc_now) category: Optional[FileCategoryDB] = Relationship(back_populates="files")