You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

75 lines
3.0 KiB

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),
replica_ready_count=item.replica_ready_count,
replica_desired_count=item.replica_desired_count,
replica_missing_count=item.replica_missing_count,
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))