Refactor data fetching hooks, add page size lint test
- Simplify useFetchData: remove unused URL building logic - Add usePolledData initial implementation - Add router page_size param validation test - Update API reference docs - Clean up tasks doc
This commit is contained in:
@@ -190,7 +190,7 @@ Paginated list of recent bans with geo enrichment.
|
||||
| `range` | `TimeRange` | `24h` | Time window: `24h`, `7d`, `30d`, `365d` |
|
||||
| `source` | string | `fail2ban` | Data source: `fail2ban` or `archive` |
|
||||
| `page` | int | `1` | 1-based page number |
|
||||
| `page_size` | int | `25` | Items per page (max 500) |
|
||||
| `page_size` | int | `100` | Items per page (max 500) |
|
||||
| `origin` | string | null | Filter: `blocklist` or `selfblock` |
|
||||
|
||||
**Response `200`**
|
||||
@@ -209,7 +209,7 @@ Paginated list of recent bans with geo enrichment.
|
||||
],
|
||||
"total": 150,
|
||||
"page": 1,
|
||||
"page_size": 25
|
||||
"page_size": 100
|
||||
}
|
||||
```
|
||||
|
||||
@@ -384,7 +384,7 @@ Paginated historical ban records.
|
||||
| `origin` | string | null | Filter: `blocklist` or `selfblock` |
|
||||
| `source` | string | `fail2ban` | `fail2ban` or `archive` |
|
||||
| `page` | int | `1` | 1-based page number |
|
||||
| `page_size` | int | `25` | Items per page (max 500) |
|
||||
| `page_size` | int | `100` | Items per page (max 500) |
|
||||
|
||||
**Response `200`**
|
||||
```json
|
||||
@@ -401,7 +401,7 @@ Paginated historical ban records.
|
||||
],
|
||||
"total": 500,
|
||||
"page": 1,
|
||||
"page_size": 25
|
||||
"page_size": 100
|
||||
}
|
||||
```
|
||||
|
||||
@@ -629,7 +629,7 @@ Paginated currently-banned IPs for a specific jail.
|
||||
| Param | Type | Default | Description |
|
||||
|---|---|---|---|
|
||||
| `page` | int | `1` | 1-based page number |
|
||||
| `page_size` | int | `25` | Items per page (max 100) |
|
||||
| `page_size` | int | `100` | Items per page (max 100) |
|
||||
| `search` | string | null | Case-insensitive substring filter on IP |
|
||||
|
||||
**Response `200`**
|
||||
@@ -647,7 +647,7 @@ Paginated currently-banned IPs for a specific jail.
|
||||
],
|
||||
"total": 12,
|
||||
"page": 1,
|
||||
"page_size": 25
|
||||
"page_size": 100
|
||||
}
|
||||
```
|
||||
|
||||
@@ -1208,7 +1208,7 @@ Paginated import log.
|
||||
|---|---|---|---|
|
||||
| `source_id` | int | null | Filter by source |
|
||||
| `page` | int | `1` | 1-based page |
|
||||
| `page_size` | int | `25` | Items per page (max 500) |
|
||||
| `page_size` | int | `100` | Items per page (max 500) |
|
||||
|
||||
**Response `200`**
|
||||
```json
|
||||
@@ -1228,7 +1228,7 @@ Paginated import log.
|
||||
],
|
||||
"total": 50,
|
||||
"page": 1,
|
||||
"page_size": 25
|
||||
"page_size": 100
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -1,56 +1,3 @@
|
||||
### Issue #64: MEDIUM - External Logging Failure Silently Swallowed
|
||||
|
||||
**Where found**:
|
||||
- `backend/app/main.py:192-213`
|
||||
|
||||
**Why this is needed**:
|
||||
When Datadog, Papertrail, or Elasticsearch log handler initialization fails, the error is caught, logged as a warning to stdout, and the application continues. In production this means critical logs may never reach the monitoring system, and operators will not know until an incident occurs.
|
||||
|
||||
**Goal**:
|
||||
External logging failures are surfaced to operators at deployment time.
|
||||
|
||||
**What to do**:
|
||||
1. Promote the warning to an error and expose it via the health endpoint (Issue #57).
|
||||
2. Add a startup check: if `EXTERNAL_LOG_REQUIRED=true` and initialization fails, abort startup.
|
||||
3. Emit a metric/alert on initialization failure.
|
||||
|
||||
**Possible traps and issues**:
|
||||
- Making startup fail on logging issues may be too strict for some environments; make `EXTERNAL_LOG_REQUIRED` optional and default to `false`.
|
||||
|
||||
**Docs changes needed**:
|
||||
- `Docs/Deployment.md`: document `EXTERNAL_LOG_REQUIRED` and the health check for logging status.
|
||||
|
||||
**Doc references**:
|
||||
- `backend/app/main.py` logging initialization block
|
||||
|
||||
---
|
||||
|
||||
### Issue #65: MEDIUM - Abort Selector Inconsistency in useFetchData
|
||||
|
||||
**Where found**:
|
||||
- `frontend/src/hooks/useFetchData.ts:124-131`
|
||||
|
||||
**Why this is needed**:
|
||||
When a request is aborted, `refresh()` returns the raw response without running the `selector()` function. In non-aborted paths the selector runs. Callers of `refresh()` receive different types depending on the abort state, making the return type unreliable and causing subtle state shape mismatches.
|
||||
|
||||
**Goal**:
|
||||
`refresh()` returns a consistent type regardless of abort state.
|
||||
|
||||
**What to do**:
|
||||
1. On abort, return `null` (or a typed sentinel) instead of the raw response, so callers can handle the aborted case explicitly.
|
||||
2. Update the TypeScript return type of `refresh()` to reflect the nullable result.
|
||||
|
||||
**Possible traps and issues**:
|
||||
- Existing callers that ignore the return value are unaffected; callers that use it need to handle `null`.
|
||||
|
||||
**Docs changes needed**:
|
||||
- `frontend/src/hooks/README.md`: document the `null` return on abort.
|
||||
|
||||
**Doc references**:
|
||||
- `frontend/src/hooks/README.md`
|
||||
|
||||
---
|
||||
|
||||
### Issue #67: LOW - Default Page Size Inconsistently Applied Across Routers
|
||||
|
||||
**Where found**:
|
||||
|
||||
Reference in New Issue
Block a user