"""Folders API routes.""" from typing import Optional from fastapi import APIRouter, Query, status from app.api.dependencies import CurrentUser, DatabaseSession 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, recursive: bool = Query(False), ): """ Delete a folder. Args: folder_id: Folder ID current_user: Current authenticated user session: Database session recursive: If True, delete folder with all contents """ folder_service = FolderService(session) 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)