Closes #114. The frontend had been calling four endpoints that were never registered server-side, so every notification settings save / test / digest / webhook delivery fetch returned 404 in the browser. Backend logic (Notifier, WeeklyDigest) was already complete — this is pure wiring.
New routes (admin role)
| Method | Route | Backed by |
|---|---|---|
| GET / POST | /api/notifications/config
| Notifier._get_config() / SettingsManager.update('notifications')
|
| POST | /api/notifications/test
| Notifier.test_channel(channel_type, config)
|
| POST | /api/digest/send
| WeeklyDigest.send()
|
| GET | /api/webhooks/deliveries?limit=N
| Notifier.get_deliveries(limit) (clamped 1..500, default 50)
|
Reported by @CYHFREDA with a clean expected-vs-actual table that made this triage trivial.
Test coverage
tests/test_notifications_routes.py — 9 e2e tests covering:
- GET shape + POST round-trip persistence
- Body-shape validation (rejects non-dict bodies, missing
channel_type, unknown channel types) - Transport-failure normalization (unreachable SMTP host returns
{success:false, error:...}instead of 500, so the UI can show a toast) - Digest envelope contract (
success/skipped/error) - Deliveries list shape +
?limit=param
All 9 pass against the Docker test container. 143 unit tests still pass.
Full diff: v2.4.3...v2.4.4