Просмотр исходного кода

Fix dashboard route ordering: static paths before {person_id} catch-all

- Reorder routes so /dashboard/persons/new and POST /dashboard/persons
  are registered before /dashboard/persons/{person_id}
- Add safety redirect if person_id == 'new' reaches the detail handler
- All 102 tests pass
Lukas Goldschmidt 1 месяц назад
Родитель
Сommit
1eee240242
1 измененных файлов с 33 добавлено и 28 удалено
  1. 33 28
      src/astro_mcp/dashboard.py

+ 33 - 28
src/astro_mcp/dashboard.py

@@ -54,30 +54,8 @@ async def person_list(request: Request):
     )
     )
 
 
 
 
-# ── person detail ────────────────────────────────────────────────────
-
-@router.get("/dashboard/persons/{person_id}", response_class=HTMLResponse)
-async def person_detail(request: Request, person_id: str):
-    person = await _get_one_person(person_id)
-    if not person:
-        return RedirectResponse("/dashboard/persons", status_code=303)
-    return templates.TemplateResponse(
-        request, "person-detail.html",
-        {"person": person},
-    )
-
-
-# ── add person (form) ────────────────────────────────────────────────
-
-@router.get("/dashboard/persons/new", response_class=HTMLResponse)
-async def person_add_form(request: Request):
-    return templates.TemplateResponse(
-        request, "person-form.html",
-        {"person": None, "action": "add"},
-    )
-
-
 # ── add person (submit) ──────────────────────────────────────────────
 # ── add person (submit) ──────────────────────────────────────────────
+# Must be BEFORE /dashboard/persons/{person_id}
 
 
 @router.post("/dashboard/persons", response_class=HTMLResponse)
 @router.post("/dashboard/persons", response_class=HTMLResponse)
 async def person_add_submit(
 async def person_add_submit(
@@ -116,20 +94,34 @@ async def person_add_submit(
     return RedirectResponse("/dashboard/persons", status_code=303)
     return RedirectResponse("/dashboard/persons", status_code=303)
 
 
 
 
-# ── edit person (form) ───────────────────────────────────────────────
+# ── add person (form) ────────────────────────────────────────────────
+# Must be BEFORE /dashboard/persons/{person_id} so "new" is not captured
 
 
-@router.get("/dashboard/persons/{person_id}/edit", response_class=HTMLResponse)
-async def person_edit_form(request: Request, person_id: str):
+@router.get("/dashboard/persons/new", response_class=HTMLResponse)
+async def person_add_form(request: Request):
+    return templates.TemplateResponse(
+        request, "person-form.html",
+        {"person": None, "action": "add"},
+    )
+
+
+# ── person detail ────────────────────────────────────────────────────
+
+@router.get("/dashboard/persons/{person_id:str}", response_class=HTMLResponse)
+async def person_detail(request: Request, person_id: str):
+    if person_id == "new":
+        return RedirectResponse("/dashboard/persons/new", status_code=307)
     person = await _get_one_person(person_id)
     person = await _get_one_person(person_id)
     if not person:
     if not person:
         return RedirectResponse("/dashboard/persons", status_code=303)
         return RedirectResponse("/dashboard/persons", status_code=303)
     return templates.TemplateResponse(
     return templates.TemplateResponse(
-        request, "person-form.html",
-        {"person": person, "action": "edit"},
+        request, "person-detail.html",
+        {"person": person},
     )
     )
 
 
 
 
 # ── edit person (submit) ─────────────────────────────────────────────
 # ── edit person (submit) ─────────────────────────────────────────────
+# Must be BEFORE /dashboard/persons/{person_id}
 
 
 @router.post("/dashboard/persons/{person_id}", response_class=HTMLResponse)
 @router.post("/dashboard/persons/{person_id}", response_class=HTMLResponse)
 async def person_edit_submit(
 async def person_edit_submit(
@@ -170,6 +162,19 @@ async def person_edit_submit(
     return RedirectResponse(f"/dashboard/persons/{person_id}", status_code=303)
     return RedirectResponse(f"/dashboard/persons/{person_id}", status_code=303)
 
 
 
 
+# ── edit person (form) ───────────────────────────────────────────────
+
+@router.get("/dashboard/persons/{person_id}/edit", response_class=HTMLResponse)
+async def person_edit_form(request: Request, person_id: str):
+    person = await _get_one_person(person_id)
+    if not person:
+        return RedirectResponse("/dashboard/persons", status_code=303)
+    return templates.TemplateResponse(
+        request, "person-form.html",
+        {"person": person, "action": "edit"},
+    )
+
+
 # ── delete person ────────────────────────────────────────────────────
 # ── delete person ────────────────────────────────────────────────────
 
 
 @router.post("/dashboard/persons/{person_id}/delete", response_class=HTMLResponse)
 @router.post("/dashboard/persons/{person_id}/delete", response_class=HTMLResponse)