feat: conditional route mounting for standalone vs integrated mode
Description
Refactor public.rs and partner.rs handlers from State<AppState> to Extension<ReportSink>. Refactor api_key_auth.rs middleware from Extension<ApiKeyState> to Extension<Arc<ApiKeyLookup>>. Split main.rs into boot_integrated() (current behavior) and boot_standalone() (no DB/MQ/JWT, only public+partner routes).
Standalone mode mounts only /public/v1, /partner/v1, /healthz, and UI routes. Internal routes (/v1/intake) are only available in integrated mode.
Acceptance Criteria
-
public.rshandlers extractExtension<ReportSink>instead ofState<AppState> -
partner.rshandlers extractExtension<ReportSink>instead ofState<AppState> -
api_key_auth.rsextractsExtension<Arc<ApiKeyLookup>>instead ofExtension<ApiKeyState> -
main.rssplit intoboot_integrated()andboot_standalone() - Standalone mode: no DB, no MQ, no JWT, no internal routes
- Health check includes
modefield (integrated/standalone) - All 42+ existing integration tests pass (integrated mode unchanged)
Context & References
- Plan:
docs/modules/ROOT/pages/plans/intake-standalone-mode.adoc(Steps 3-7) - Epic: &9 (closed)
- Service: craig-intake
- Branch:
feature/intake-conditional-routes
Key Files
services/craig-intake/src/api/public.rs— change handler signaturesservices/craig-intake/src/api/partner.rs— change handler signaturesservices/craig-intake/src/api/api_key_auth.rs— change middlewareservices/craig-intake/src/api/mod.rs— fix return typesservices/craig-intake/src/main.rs— split boot functions
Edited by Ghost User