itcloud/backend/src/app/api/v1/folders.py

180 lines
4.5 KiB
Python

"""Folders API routes."""
from typing import Optional
from fastapi import APIRouter, Query, status
from app.api.dependencies import CurrentUser, DatabaseSession, S3ClientDep
from app.api.schemas import (
BreadcrumbsResponse,
FolderCreateRequest,
FolderListResponse,
FolderResponse,
FolderUpdateRequest,
)
from app.services.folder_service import FolderService
router = APIRouter(prefix="/folders", tags=["folders"])
@router.post("", response_model=FolderResponse, status_code=status.HTTP_201_CREATED)
async def create_folder(
request: FolderCreateRequest,
current_user: CurrentUser,
session: DatabaseSession,
):
"""
Create a new folder.
Args:
request: Folder creation request
current_user: Current authenticated user
session: Database session
Returns:
Created folder
"""
folder_service = FolderService(session)
folder = await folder_service.create_folder(
user_id=current_user.id,
name=request.name,
parent_folder_id=request.parent_folder_id,
)
return folder
@router.get("", response_model=FolderListResponse)
async def list_folders(
current_user: CurrentUser,
session: DatabaseSession,
parent_folder_id: Optional[str] = Query(None),
all: bool = Query(False, description="Return all folders (ignore parent_folder_id)"),
):
"""
List folders in a specific parent folder or all folders.
Args:
current_user: Current authenticated user
session: Database session
parent_folder_id: Parent folder ID (None for root folders)
all: If True, return all user's folders (for building tree)
Returns:
List of folders
"""
folder_service = FolderService(session)
if all:
folders = await folder_service.list_all_folders(user_id=current_user.id)
else:
folders = await folder_service.list_folders(
user_id=current_user.id,
parent_folder_id=parent_folder_id,
)
return FolderListResponse(items=folders)
@router.get("/{folder_id}", response_model=FolderResponse)
async def get_folder(
folder_id: str,
current_user: CurrentUser,
session: DatabaseSession,
):
"""
Get folder by ID.
Args:
folder_id: Folder ID
current_user: Current authenticated user
session: Database session
Returns:
Folder information
"""
folder_service = FolderService(session)
folder = await folder_service.get_folder(
user_id=current_user.id,
folder_id=folder_id,
)
return folder
@router.patch("/{folder_id}", response_model=FolderResponse)
async def update_folder(
folder_id: str,
request: FolderUpdateRequest,
current_user: CurrentUser,
session: DatabaseSession,
):
"""
Update folder name.
Args:
folder_id: Folder ID
request: Update request
current_user: Current authenticated user
session: Database session
Returns:
Updated folder
"""
folder_service = FolderService(session)
folder = await folder_service.rename_folder(
user_id=current_user.id,
folder_id=folder_id,
new_name=request.name,
)
return folder
@router.delete("/{folder_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_folder(
folder_id: str,
current_user: CurrentUser,
session: DatabaseSession,
s3_client: S3ClientDep,
recursive: bool = Query(False),
):
"""
Delete a folder.
Args:
folder_id: Folder ID
current_user: Current authenticated user
session: Database session
s3_client: S3 client (required for recursive deletion with assets)
recursive: If True, recursively delete folder with all subfolders and assets
"""
folder_service = FolderService(session, s3_client)
await folder_service.delete_folder(
user_id=current_user.id,
folder_id=folder_id,
recursive=recursive,
)
@router.get("/{folder_id}/breadcrumbs", response_model=BreadcrumbsResponse)
async def get_breadcrumbs(
folder_id: str,
current_user: CurrentUser,
session: DatabaseSession,
):
"""
Get breadcrumb path for a folder.
Args:
folder_id: Folder ID
current_user: Current authenticated user
session: Database session
Returns:
Breadcrumbs path from root to folder
"""
folder_service = FolderService(session)
breadcrumbs = await folder_service.get_breadcrumbs(
user_id=current_user.id,
folder_id=folder_id,
)
return BreadcrumbsResponse(items=breadcrumbs)