Add transactional file storage workflows, typed API contracts, recursive category handling, frontend component separation, and Files API coverage.
70 lines
1.7 KiB
Python
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
|