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

171 lines
4.1 KiB
Python
Raw Normal View History

2025-12-30 23:18:13 +01:00
"""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),
):
"""
List folders in a specific parent folder.
Args:
current_user: Current authenticated user
session: Database session
parent_folder_id: Parent folder ID (None for root folders)
Returns:
List of folders
"""
folder_service = FolderService(session)
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)