Add GET /api/dashboard/bans/trend endpoint
Implement time-bucketed ban aggregation for dashboard trend charts: - Add BanTrendBucket / BanTrendResponse Pydantic models and BUCKET_SECONDS / BUCKET_SIZE_LABEL / bucket_count helpers to ban.py - Add ban_service.ban_trend(): queries fail2ban DB with SQL bucket grouping, fills zero-count buckets, respects origin filter - Add GET /api/dashboard/bans/trend route in dashboard.py - 20 new tests (10 service, 10 router); 480 total pass, 83% coverage - ruff + mypy --strict clean
This commit is contained in:
@@ -226,7 +226,15 @@ Add the `TopCountriesBarChart` to the dashboard alongside the pie chart.
|
||||
|
||||
### Task 4.1 — Add a backend endpoint for time-series ban aggregation
|
||||
|
||||
**Status:** `not started`
|
||||
**Status:** `done`
|
||||
|
||||
Added `GET /api/dashboard/bans/trend`. New Pydantic models `BanTrendBucket` and
|
||||
`BanTrendResponse` (plus `BUCKET_SECONDS`, `BUCKET_SIZE_LABEL`, `bucket_count`
|
||||
helpers) in `ban.py`. Service function `ban_trend()` in `ban_service.py` groups
|
||||
`bans.timeofban` into equal-width buckets via SQL and fills empty buckets with
|
||||
zero so the frontend always receives a gap-free series. Route added to
|
||||
`dashboard.py`. 20 new tests (10 service, 10 router) — all pass, total suite
|
||||
480 passed, 83% coverage.
|
||||
|
||||
The existing endpoints return flat lists or country-aggregated counts but **no time-bucketed series**. A dashboard trend chart needs data grouped into time buckets.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user