fix: make compliance router imports resilient to individual module failures
All checks were successful
CI/CD / go-lint (push) Has been skipped
CI/CD / python-lint (push) Has been skipped
CI/CD / nodejs-lint (push) Has been skipped
CI/CD / test-go-ai-compliance (push) Successful in 33s
CI/CD / test-python-backend-compliance (push) Successful in 33s
CI/CD / test-python-document-crawler (push) Successful in 23s
CI/CD / test-python-dsms-gateway (push) Successful in 19s
CI/CD / validate-canonical-controls (push) Successful in 13s
CI/CD / deploy-hetzner (push) Successful in 17s

Replaced bare imports with safe_import_router pattern — if one sub-router
fails to import (e.g. missing dependency), other routers still load.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-13 09:46:52 +01:00
parent c530898963
commit f738ca8c52

View File

@@ -1,110 +1,67 @@
"""API routes for Compliance module.""" """API routes for Compliance module."""
import logging
from .routes import router from .routes import router
from .audit_routes import router as audit_router
from .ai_routes import router as ai_router
from .evidence_routes import router as evidence_router
from .risk_routes import router as risk_router
from .dashboard_routes import router as dashboard_router
from .scraper_routes import router as scraper_router
from .module_routes import router as module_router
from .isms_routes import router as isms_router
from .vvt_routes import router as vvt_router
from .legal_document_routes import router as legal_document_router
from .einwilligungen_routes import router as einwilligungen_router
from .escalation_routes import router as escalation_router
from .consent_template_routes import router as consent_template_router
from .notfallplan_routes import router as notfallplan_router
from .obligation_routes import router as obligation_router
from .security_backlog_routes import router as security_backlog_router
from .quality_routes import router as quality_router
from .loeschfristen_routes import router as loeschfristen_router
from .legal_template_routes import router as legal_template_router
from .compliance_scope_routes import router as compliance_scope_router
from .dsfa_routes import router as dsfa_router
from .dsr_routes import router as dsr_router
from .email_template_routes import router as email_template_router
from .banner_routes import router as banner_router
from .extraction_routes import router as extraction_router
from .tom_routes import router as tom_router
from .vendor_compliance_routes import router as vendor_compliance_router
from .incident_routes import router as incident_router
from .change_request_routes import router as change_request_router
from .generation_routes import router as generation_router
from .project_routes import router as project_router
from .wiki_routes import router as wiki_router
from .canonical_control_routes import router as canonical_control_router
from .control_generator_routes import router as control_generator_router
# Include sub-routers logger = logging.getLogger(__name__)
router.include_router(audit_router)
router.include_router(ai_router)
router.include_router(evidence_router)
router.include_router(risk_router)
router.include_router(dashboard_router)
router.include_router(scraper_router)
router.include_router(module_router)
router.include_router(isms_router)
router.include_router(vvt_router)
router.include_router(legal_document_router)
router.include_router(einwilligungen_router)
router.include_router(escalation_router)
router.include_router(consent_template_router)
router.include_router(notfallplan_router)
router.include_router(obligation_router)
router.include_router(security_backlog_router)
router.include_router(quality_router)
router.include_router(loeschfristen_router)
router.include_router(legal_template_router)
router.include_router(compliance_scope_router)
router.include_router(dsfa_router)
router.include_router(dsr_router)
router.include_router(email_template_router)
router.include_router(banner_router)
router.include_router(extraction_router)
router.include_router(tom_router)
router.include_router(vendor_compliance_router)
router.include_router(incident_router)
router.include_router(change_request_router)
router.include_router(generation_router)
router.include_router(project_router)
router.include_router(wiki_router)
router.include_router(canonical_control_router)
router.include_router(control_generator_router)
__all__ = [
"router", def _safe_import_router(module_name: str, attr: str = "router"):
"audit_router", """Import a router module safely — log error but don't crash the whole app."""
"ai_router", try:
"evidence_router", mod = __import__(f"compliance.api.{module_name}", fromlist=[attr])
"risk_router", return getattr(mod, attr)
"dashboard_router", except Exception as e:
"scraper_router", logger.error("Failed to import %s: %s", module_name, e)
"module_router", return None
"isms_router",
"vvt_router",
"legal_document_router", # Import all sub-routers (safe — failure of one doesn't block others)
"einwilligungen_router", _ROUTER_MODULES = [
"escalation_router", "audit_routes",
"consent_template_router", "ai_routes",
"notfallplan_router", "evidence_routes",
"obligation_router", "risk_routes",
"security_backlog_router", "dashboard_routes",
"quality_router", "scraper_routes",
"loeschfristen_router", "module_routes",
"legal_template_router", "isms_routes",
"compliance_scope_router", "vvt_routes",
"dsfa_router", "legal_document_routes",
"dsr_router", "einwilligungen_routes",
"email_template_router", "escalation_routes",
"banner_router", "consent_template_routes",
"tom_router", "notfallplan_routes",
"vendor_compliance_router", "obligation_routes",
"incident_router", "security_backlog_routes",
"change_request_router", "quality_routes",
"generation_router", "loeschfristen_routes",
"project_router", "legal_template_routes",
"wiki_router", "compliance_scope_routes",
"canonical_control_router", "dsfa_routes",
"control_generator_router", "dsr_routes",
"email_template_routes",
"banner_routes",
"extraction_routes",
"tom_routes",
"vendor_compliance_routes",
"incident_routes",
"change_request_routes",
"generation_routes",
"project_routes",
"wiki_routes",
"canonical_control_routes",
"control_generator_routes",
] ]
_loaded_count = 0
for _mod_name in _ROUTER_MODULES:
_sub_router = _safe_import_router(_mod_name)
if _sub_router is not None:
router.include_router(_sub_router)
_loaded_count += 1
logger.info("Loaded %d/%d compliance sub-routers", _loaded_count, len(_ROUTER_MODULES))
__all__ = ["router"]