d467190eb1
Refactor geo caching and service layer tests
...
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-25 18:15:31 +02:00
654dbdb000
T-04: Encapsulate geo_service module-level mutable state in GeoCache class
...
Create GeoCache class with all mutable state as instance attributes:
- _cache, _neg_cache, _dirty, _geoip_reader, _geoip_initialized, _cache_lock
- All public methods: lookup(), lookup_batch(), lookup_cached_only(), flush_dirty(), load_from_db(), clear(), etc.
Initialization & Dependency Injection:
- Instantiate GeoCache in startup.py and store on app.state.geo_cache
- Add get_geo_cache() dependency function in dependencies.py
- Inject into routes and tasks via FastAPI's dependency system
Backward Compatibility:
- Maintain module-level functions in geo_service.py as deprecated wrappers
- All old callers continue to work through _default_geo_cache instance
- Remove test-escape-hatch functions (clear_cache, clear_neg_cache moved to methods)
Background Tasks:
- Update geo_cache_flush.py and geo_re_resolve.py to receive GeoCache instance
- Tasks now operate on injected instance rather than module globals
Tests:
- Refactor test_geo_service.py with geo_cache fixture providing fresh instances
- Update patch paths to target GeoCache methods correctly
- Fix internal state assertions to access instance attributes
Documentation:
- Update Architekture.md to document GeoCache as managed stateful service
- Describe cache lifecycle (load on startup, flush periodically, re-resolve stale)
- Note process-local limitations for multi-worker deployments
Fixes violation of Single Responsibility Principle: module no longer owns both
lookup logic and cache lifecycle management. Cache is now a first-class
injectable service with transparent lifecycle.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com >
2026-04-23 16:18:09 +02:00
e593498de5
Strengthen setup password validation
...
- Add backend Pydantic password complexity validation for setup
- Update frontend setup page with password rule feedback and strength indicator
- Add/adjust setup API tests for password validation
- Document setup password requirements
- Fix frontend test type annotation issue
2026-04-20 19:23:12 +02:00
01f2e07921
Extract shared raw config file helpers and simplify raw_config_io_service
2026-04-18 20:18:54 +02:00
c1f188643c
Move geo cache commit handling into repository layer
2026-04-18 20:10:05 +02:00
52e08e17a4
Guard geo_service.init_geoip against repeated initialization
2026-04-18 19:54:05 +02:00
db5b4cb77e
Add settings and history archive repository protocols and DI support
2026-04-17 20:54:08 +02:00
7055971163
Harden preview_log path validation and add regression test
2026-04-17 20:37:14 +02:00
5e5d7c34b2
Document task DB access and unify background task DB handling
2026-04-17 17:18:49 +02:00
4754f1407e
Mark task 19 done and centralize map-color thresholds in settings_service
2026-04-17 17:04:09 +02:00
7a1cb0c46c
Extract health-check crash-detection logic into runtime state helper
2026-04-17 16:58:24 +02:00
1e2850a34e
Add async lock protection to geo service cache and mark Task 16 done
2026-04-17 16:51:05 +02:00
04b2e2f700
Add global domain exception handlers in main.py
...
Register consistent HTTP error mappings for common domain exceptions and add regression tests for 404/400/500 handler behavior.
2026-04-17 16:42:18 +02:00
900d111a5d
Refactor geo enrichment into jail_service and mark Task 14 done
2026-04-17 16:36:22 +02:00
487f252a4d
Move history geo enrichment into history service
2026-04-17 16:28:53 +02:00
8c6950afc1
Task 13: move ban_ip, unban_ip, and get_active_bans from jail_service to ban_service and update routers/tests
2026-04-17 16:22:20 +02:00
58112fb191
Move auth session signing into auth_service.login
2026-04-17 15:33:09 +02:00
33643880ed
Extract fail2ban restart orchestration into jail_service
2026-04-17 15:23:54 +02:00
c21cf82e9e
Refactor map color threshold storage into dedicated settings service
2026-04-17 15:13:07 +02:00
13b3fde274
Fix stale activation record on failed jail activation
...
Record activation only after a successful jail activate request and add regression coverage to prevent stale last_activation state.
2026-04-17 14:53:57 +02:00
73cc212e28
Invert blocklist scheduler dependency to task callback
2026-04-15 21:31:08 +02:00
56f03f39c7
Move history archive max timestamp query into repository
2026-04-15 21:18:44 +02:00
cdb0c3681e
Task 3: remove config_file_service facade, update direct imports and tests
2026-04-15 21:16:00 +02:00
0e22d1c425
Move config file exceptions into app.exceptions
...
Move ConfigDirError, ConfigFileNotFoundError, ConfigFileExistsError, ConfigFileWriteError, and ConfigFileNameError from raw_config_io_service into the shared domain exception module. Update router and tests to import the exceptions from app.exceptions.
2026-04-15 10:28:27 +02:00
328f3575e2
Move Fail2Ban exceptions into central app.exceptions module
2026-04-15 10:22:48 +02:00
a79f5339bc
Refactor fail2ban DB path lookup and simplify geo router response
2026-04-15 09:15:50 +02:00
56c511d905
Fix module-level asyncio locks in jail_service
...
Initialize jail_service locks lazily to avoid import-time event loop binding and add regression tests for lock creation.
2026-04-15 09:10:38 +02:00
a8f2d2d7b9
Refactor geo re-resolve endpoint into geo_service and add typed response
2026-04-15 08:56:37 +02:00
b70dc6fa7a
Refactor blocklist schedule management into service
2026-04-14 15:25:36 +02:00
58bb769a35
Refactor history sync into history_service and update docs/tests
2026-04-14 15:09:58 +02:00
86fa271c40
Remove FastAPI dependency from jail config service signatures
2026-04-14 15:01:05 +02:00
6b436dc354
Fix undefined names and config router imports / task status update
2026-04-14 13:53:39 +02:00
0e5e08374f
Use shared SESSION_COOKIE_NAME in auth router tests
2026-04-14 10:33:32 +02:00
5e4d3fcf12
Remove Mock fallback from runtime_state and add runtime settings regression tests
2026-04-14 10:30:25 +02:00
cee5372690
Add backend capability cache reset helper for jail service tests
2026-04-14 10:24:14 +02:00
a564830abb
Fix blocklist service injection and centralize session cookie name
2026-04-14 09:21:38 +02:00
8e43ef9ad2
Fix setup_service to mark setup_complete only after successful runtime DB init
2026-04-12 20:30:22 +02:00
e6df045e5e
Fix startup runtime settings ordering and use effective database path for request DB connections
2026-04-12 20:02:40 +02:00
ee880e6296
Introduce explicit ApplicationContext and remove raw request.app.state usage
2026-04-12 19:56:01 +02:00
72488b14b2
Centralize fail2ban metadata resolution and cache DB path discovery
2026-04-12 19:48:33 +02:00
e271207795
Refactor fail2ban client to use vendored adapter
2026-04-12 19:25:56 +02:00
21b38365c4
Add runtime DB schema migration and version tracking
2026-04-12 19:13:36 +02:00
ffe7ada469
Consolidate setup persistence into bootstrap metadata and runtime DB
2026-04-11 20:57:55 +02:00
cd69550053
Standardize async offloading behind shared executor helper
2026-04-11 20:40:08 +02:00
ae81a8f5be
Refactor periodic tasks to use injected scheduler resources
2026-04-11 20:32:36 +02:00
9cba5a9fcb
Refactor blocklist import registration to async startup flow
2026-04-11 20:07:00 +02:00
952469e667
Task 7 complete: move config operational orchestration from routers into service/task layer
2026-04-10 21:24:54 +02:00
91e5792caf
Mark startup runtime configuration task complete and update startup resource resolution
2026-04-10 21:13:51 +02:00
3371ff8324
Introduce service/repository dependency protocols and tests
2026-04-10 19:51:19 +02:00
3b6e39ddad
Separate bootstrap settings from runtime overrides with a dedicated runtime settings manager
2026-04-10 19:31:51 +02:00