velxio/backend/app/api/routes/libraries.py

62 lines
2.1 KiB
Python

from fastapi import APIRouter, HTTPException, Query
from pydantic import BaseModel
from app.api.routes.compile import arduino_cli
router = APIRouter()
class InstallLibraryRequest(BaseModel):
name: str
class SearchResponse(BaseModel):
success: bool
libraries: list = []
error: str | None = None
class InstallResponse(BaseModel):
success: bool
stdout: str | None = None
error: str | None = None
@router.get("/search", response_model=SearchResponse)
async def search_libraries(q: str = Query(..., description="Search query for library")):
"""
Search for Arduino libraries by name or topic.
"""
try:
result = await arduino_cli.search_libraries(q)
if not result["success"]:
raise HTTPException(status_code=500, detail=result.get("error", "Failed to search libraries"))
return SearchResponse(success=True, libraries=result.get("libraries", []))
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.post("/install", response_model=InstallResponse)
async def install_library(request: InstallLibraryRequest):
"""
Install a specific Arduino library by name.
"""
try:
result = await arduino_cli.install_library(request.name)
if not result["success"]:
return InstallResponse(success=False, error=result.get("error"), stdout=result.get("stdout"))
return InstallResponse(success=True, stdout=result.get("stdout"))
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/list", response_model=SearchResponse)
async def list_libraries():
"""
List all installed Arduino libraries.
"""
try:
result = await arduino_cli.list_installed_libraries()
if not result["success"]:
raise HTTPException(status_code=500, detail=result.get("error", "Failed to list libraries"))
return SearchResponse(success=True, libraries=result.get("libraries", []))
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))