T-10: Fix get_geo_batch_lookup for proper injection with GeoCache instance
Instead of returning a bound method (geo_cache.lookup_batch), now inject the GeoCache instance directly into routers and services. This provides proper runtime isolation since T-04 made GeoCache a proper object. Changes: - Remove get_geo_batch_lookup() dependency provider - Add GeoCacheDep type alias for injecting GeoCache instances - Update all routers (bans, blocklist, dashboard, jails) to use GeoCacheDep - Update ban_service, blocklist_service, jail_service to accept GeoCache - Update service protocols to match new signatures - Update docstrings to reference GeoCache methods instead of module functions All callers now call geo_cache.lookup_batch(...) directly instead of geo_batch_lookup(...), providing real dependency injection with proper testing isolation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -1,50 +1,3 @@
|
||||
### T-08 · `_SOCKET_TIMEOUT` defined 6× — `constants.py` constant unused
|
||||
|
||||
**Where found:** `backend/app/utils/constants.py:16` (defines `FAIL2BAN_SOCKET_TIMEOUT_SECONDS = 5.0` but is never imported); `ban_service.py` (5.0), `jail_service.py` (10.0), `config_service.py` (10.0), `server_service.py` (10.0), `log_service.py` (10.0), `jail_config_service.py` (10.0), `config_file_utils.py` (10.0)
|
||||
|
||||
**Why this is needed:** `constants.py` has a module docstring saying "import from this module rather than hard-coding values" — and then nothing imports the socket timeout. The values also disagree: `ban_service` uses `5.0` while all others use `10.0`, creating silent inconsistency in timeout behaviour across endpoints.
|
||||
|
||||
**Goal:** One constant in `constants.py`, imported everywhere. Decide on a single default (or two named constants for fast/slow operations).
|
||||
|
||||
**What to do:**
|
||||
1. In `constants.py`, define `FAIL2BAN_SOCKET_TIMEOUT_FAST: Final[float] = 5.0` (for health/metadata probes) and `FAIL2BAN_SOCKET_TIMEOUT: Final[float] = 10.0` (for command operations) — or a single value if appropriate.
|
||||
2. Replace all local `_SOCKET_TIMEOUT` float literals with imports from `constants`.
|
||||
3. Confirm `ban_service` should actually be `5.0` or `10.0` (intentional vs accidental discrepancy).
|
||||
|
||||
**Possible traps and issues:**
|
||||
- Changing `ban_service` from 5.0 to 10.0 (or vice versa) changes observable timeout behaviour. Decide deliberately.
|
||||
- `fail2ban_metadata_service.py` also has `socket_timeout: float = 5.0` hardcoded inline — include this in the sweep.
|
||||
|
||||
**Docs changes needed:** None.
|
||||
|
||||
**Doc references:** `backend/app/utils/constants.py`
|
||||
|
||||
---
|
||||
|
||||
### T-09 · `_since_unix` has two divergent implementations — latent window-boundary bug
|
||||
|
||||
**Where found:** `backend/app/services/ban_service.py:393` (uses `time.time()`, applies `_TIME_RANGE_SLACK_SECONDS = 60`); `backend/app/services/history_service.py:53` (uses `datetime.now(UTC).timestamp()`, no slack)
|
||||
|
||||
**Why this is needed:** The `ban_service` docstring explicitly explains why `time.time()` is used and why the 60-second slack is needed for consistency with fail2ban's timestamp storage. `history_service` quietly omits both, so history queries return a slightly different window boundary than ban queries for the same `TimeRange` parameter. Inconsistent windows cause "same data, different count" bugs in the UI.
|
||||
|
||||
**Goal:** Single `_since_unix` function in a shared utility module, with documented rationale, used by both services.
|
||||
|
||||
**What to do:**
|
||||
1. Move `_since_unix` (with the `time.time()` + slack approach) to `app/utils/time_utils.py` (which already exists).
|
||||
2. Delete both local implementations.
|
||||
3. Import from `time_utils` in both services.
|
||||
4. Decide consciously whether history queries should also use the slack (probably yes for consistency).
|
||||
|
||||
**Possible traps and issues:**
|
||||
- Adding the 60-second slack to history queries may change row counts in tests that assert exact counts against seeded timestamps.
|
||||
- Confirm `_TIME_RANGE_SLACK_SECONDS` belongs in `constants.py`.
|
||||
|
||||
**Docs changes needed:** `Docs/Backend-Development.md` — document the timestamp handling rationale.
|
||||
|
||||
**Doc references:** `backend/app/utils/time_utils.py`, `backend/app/utils/constants.py`
|
||||
|
||||
---
|
||||
|
||||
### T-10 · `get_geo_batch_lookup` is false injectability — module function pointer injection
|
||||
|
||||
**Where found:** `backend/app/dependencies.py` — `get_geo_batch_lookup()` returns `geo_service.lookup_batch` (a module-level function)
|
||||
|
||||
Reference in New Issue
Block a user