fix(plugin): add GET and PATCH /api/v1/plugins/{name}/config endpoints

Bug 4: Plugin config field existed but had no API endpoints. Added
GET /api/v1/plugins/{name}/config to retrieve config as JSON and
PATCH /api/v1/plugins/{name}/config to update it. Uses PluginConfigUpdate
Pydantic model for request validation.
This commit is contained in:
2026-07-03 16:49:57 +00:00
parent cbeed4b26d
commit f9508d17de
+56 -1
View File
@@ -1,8 +1,9 @@
"""Plugin routes — list, install, activate, deactivate, uninstall, manifest schema.""" """Plugin routes — list, install, activate, deactivate, uninstall, manifest schema, config."""
from __future__ import annotations from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, Query from fastapi import APIRouter, Depends, HTTPException, Query
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from app.core.db import get_db from app.core.db import get_db
@@ -13,6 +14,11 @@ from app.services.plugin_service import get_plugin_service
router = APIRouter(prefix="/api/v1/plugins", tags=["plugins"]) router = APIRouter(prefix="/api/v1/plugins", tags=["plugins"])
class PluginConfigUpdate(BaseModel):
"""Request body for updating plugin configuration."""
config: dict
@router.get("") @router.get("")
async def list_plugins( async def list_plugins(
db: AsyncSession = Depends(get_db), db: AsyncSession = Depends(get_db),
@@ -33,6 +39,55 @@ async def get_manifest_schema(
return service.get_manifest_schema() return service.get_manifest_schema()
@router.get("/{name}/config")
async def get_plugin_config(
name: str,
db: AsyncSession = Depends(get_db),
current_user: dict = Depends(require_admin),
):
"""Get the configuration for a specific plugin.
Returns the plugin's config field as a JSON object.
"""
service = get_plugin_service()
try:
config = await service.get_plugin_config(db, name)
return {"name": name, "config": config}
except ValueError as exc:
raise HTTPException(
404, detail={"detail": str(exc), "code": "plugin_not_found"}
) from None
@router.patch("/{name}/config")
async def update_plugin_config(
name: str,
body: PluginConfigUpdate,
db: AsyncSession = Depends(get_db),
current_user: dict = Depends(require_admin),
):
"""Update the configuration for a specific plugin.
Stores the config as a JSON string in the plugin's config field.
"""
import uuid as uuid_mod
service = get_plugin_service()
try:
result = await service.update_plugin_config(
db,
name,
config=body.config,
tenant_id=uuid_mod.UUID(current_user["tenant_id"]),
user_id=uuid_mod.UUID(current_user["user_id"]),
)
return result
except ValueError as exc:
raise HTTPException(
404, detail={"detail": str(exc), "code": "plugin_not_found"}
) from None
@router.post("/{name}/install") @router.post("/{name}/install")
async def install_plugin( async def install_plugin(
name: str, name: str,