from fastapi import APIRouter, Depends, Query, status from app.api.dependencies import get_directory_service from app.schemas.directory import ( CreateDirectoryRequest, CreateDirectoryResponse, DirectoryChildrenResponse, DirectoryItem, DirectorySummary, MoveDirectoryRequest, RenameDirectoryRequest, ) from app.services.directory_service import DirectoryService router = APIRouter() @router.get("/{directory_id}/children", response_model=DirectoryChildrenResponse) async def list_directory_children( directory_id: str, _cursor: str | None = Query(default=None, alias="cursor"), _limit: int = Query(default=100, ge=1, le=500, alias="limit"), service: DirectoryService = Depends(get_directory_service), ) -> DirectoryChildrenResponse: result = await service.list_children(directory_id) return DirectoryChildrenResponse( directory=DirectorySummary.model_validate(result.directory, from_attributes=True), items=[ DirectoryItem( kind=item.kind, id=item.item.id, name=item.item.name, mime_type=getattr(item.item, "mime_type", None), size_bytes=getattr(item.item, "size_bytes", None), created_at=item.item.created_at, updated_at=item.item.updated_at, ) for item in result.children ], next_cursor=None, ) @router.post("", response_model=CreateDirectoryResponse, status_code=status.HTTP_201_CREATED) async def create_directory( payload: CreateDirectoryRequest, service: DirectoryService = Depends(get_directory_service), ) -> CreateDirectoryResponse: directory = await service.create_directory(parent_id=payload.parent_id, name=payload.name) return CreateDirectoryResponse( directory=DirectorySummary.model_validate(directory, from_attributes=True) ) @router.post("/{directory_id}/rename", response_model=CreateDirectoryResponse) async def rename_directory( directory_id: str, payload: RenameDirectoryRequest, service: DirectoryService = Depends(get_directory_service), ) -> CreateDirectoryResponse: directory = await service.rename_directory(directory_id=directory_id, name=payload.name) return CreateDirectoryResponse(directory=DirectorySummary.model_validate(directory, from_attributes=True)) @router.post("/{directory_id}/move", response_model=CreateDirectoryResponse) async def move_directory( directory_id: str, payload: MoveDirectoryRequest, service: DirectoryService = Depends(get_directory_service), ) -> CreateDirectoryResponse: directory = await service.move_directory(directory_id=directory_id, target_parent_id=payload.target_parent_id) return CreateDirectoryResponse(directory=DirectorySummary.model_validate(directory, from_attributes=True))