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.
72 lines
2.8 KiB
72 lines
2.8 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),
|
|
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))
|
|
|