180 lines
4.5 KiB
Python
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)
|