AgentEvalTool/backend/agenteval/web/file_schemas.py
sinohqb d7514f4e65 refactor(files): harden storage and split frontend
Add transactional file storage workflows, typed API contracts, recursive category handling, frontend component separation, and Files API coverage.
2026-07-17 17:41:19 +08:00

70 lines
1.7 KiB
Python

"""HTTP schemas for the file management API."""
from datetime import datetime
from pydantic import BaseModel, ConfigDict, Field, field_serializer
from agenteval.storage.db import FileCategoryDB, FileRecordDB, iso_utc
class CategoryCreate(BaseModel):
name: str
parent_id: str | None = None
class CategoryUpdate(BaseModel):
name: str
class FileCategoryResponse(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: str
name: str
parent_id: str | None
children: list["FileCategoryResponse"] = Field(default_factory=list)
@classmethod
def from_record(cls, category: FileCategoryDB) -> "FileCategoryResponse":
return cls(
id=category.id or "",
name=category.name,
parent_id=category.parent_id,
children=[],
)
class FileRecordResponse(BaseModel):
id: str
original_name: str
file_size: int
mime_type: str
file_ext: str
category_id: str | None
created_at: datetime | None
@field_serializer("created_at")
def serialize_created_at(self, value: datetime | None) -> str | None:
return iso_utc(value)
@classmethod
def from_record(cls, record: FileRecordDB) -> "FileRecordResponse":
return cls(
id=record.id or "",
original_name=record.original_name,
file_size=record.file_size,
mime_type=record.mime_type,
file_ext=record.file_ext,
category_id=record.category_id,
created_at=record.created_at,
)
class FileUploadConfigResponse(BaseModel):
allowed_extensions: list[str]
max_upload_size_mb: int
class OkResponse(BaseModel):
ok: bool = True