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
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:
@@ -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"]
|
||||||
|
|||||||
Reference in New Issue
Block a user