From 1a9fb99411f10fd9daa6752387eb9c825733b2fd Mon Sep 17 00:00:00 2001 From: Lars Date: Thu, 9 Apr 2026 16:19:46 +0200 Subject: [PATCH] fix: FastAPI routing conflict for /placeholders endpoint Backend: - Moved /placeholders endpoint BEFORE /{prompt_id} catch-all - Prevents "placeholders" being parsed as UUID parameter - Fixes 500 Internal Server Error preventing placeholder loading Frontend: - PlaceholderPicker can now load ~120+ system placeholders Root Cause: - FastAPI matches routes in order - Generic /{prompt_id} was catching /placeholders first - psycopg2 error: invalid input syntax for type uuid: "placeholders" Version: 0.9p (workflow module) Part 3: End Node Template Engine Co-Authored-By: Claude Opus 4.6 --- backend/routers/prompts.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/backend/routers/prompts.py b/backend/routers/prompts.py index a52ebe4..732bfea 100644 --- a/backend/routers/prompts.py +++ b/backend/routers/prompts.py @@ -53,6 +53,20 @@ def list_prompts(session: dict=Depends(require_auth)): return [r2d(r) for r in cur.fetchall()] +@router.get("/placeholders") +def list_placeholders_endpoint(session: dict=Depends(require_auth)): + """ + Get grouped catalog of available placeholders with descriptions and examples. + + Returns: + Dict mapping category to list of {key, description, example} + + IMPORTANT: This endpoint MUST be defined BEFORE /{prompt_id} to avoid routing conflict. + """ + profile_id = session['profile_id'] + return get_placeholder_catalog(profile_id) + + @router.get("/{prompt_id}") def get_prompt(prompt_id: str, session: dict=Depends(require_auth)): """Get single AI prompt by ID (UUID)."""