fix: reorder notification DELETE routes so bulk clear matches first

FastAPI matches routes in declaration order. The DELETE /notifications
endpoint (bulk clear) was registered AFTER DELETE /notifications/{id},
so the path parameter route intercepted all requests to the bulk route,
causing a 422 UUID validation error instead of hitting clear_all.

Moved clear_all_notifications above dismiss_notification in the router.
Added regression test to verify route order.

Quality gates: pytest (22 passed)
This commit is contained in:
Alex Blank
2026-05-29 16:54:01 +02:00
parent 5f499ec1b0
commit 3d1f8d9cf7
4 changed files with 51 additions and 17 deletions
+10 -10
View File
@@ -135,6 +135,16 @@ async def mark_all_read(
return MarkAllReadResponse(marked_count=marked)
@router.delete("", status_code=status.HTTP_200_OK)
async def clear_all_notifications(
user: User = Depends(get_current_user),
session: AsyncSession = Depends(get_db_session),
) -> ClearAllResponse:
"""Dismiss all notifications for the authenticated user."""
cleared = await notification_service.dismiss_all(session, user.id)
return ClearAllResponse(cleared_count=cleared)
@router.delete("/{notification_id}", status_code=status.HTTP_204_NO_CONTENT)
async def dismiss_notification(
notification_id: uuid.UUID,
@@ -149,13 +159,3 @@ async def dismiss_notification(
status_code=status.HTTP_404_NOT_FOUND,
detail="Notification not found",
) from exc
@router.delete("", status_code=status.HTTP_200_OK)
async def clear_all_notifications(
user: User = Depends(get_current_user),
session: AsyncSession = Depends(get_db_session),
) -> ClearAllResponse:
"""Dismiss all notifications for the authenticated user."""
cleared = await notification_service.dismiss_all(session, user.id)
return ClearAllResponse(cleared_count=cleared)
+1 -5
View File
@@ -139,11 +139,7 @@ async def publish_lifecycle_event(
if not _should_notify(event_type, effective_status):
return
severity = (
"error"
if event_type == "instance.error"
else "success"
)
severity = "error" if event_type == "instance.error" else "success"
title = _derive_title(event_type)
try: