Remove standalone services (ai-compliance-sdk root, developer-portal, dsms-gateway, dsms-node, night-scheduler) and legacy compliance/dsgvo pages. Add new SDK pipeline modules (academy, document-crawler, dsb-portal, incidents, whistleblower, reporting, sso, multi-tenant, industry-templates). Add drafting engine, legal corpus files (AT/CH/DE), pitch-deck, blog and Förderantrag pages. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
614 lines
20 KiB
TypeScript
614 lines
20 KiB
TypeScript
/**
|
|
* Module Registry - Track all backend modules and their frontend connections
|
|
*
|
|
* This registry ensures no backend modules get lost during migration.
|
|
* Each module entry defines:
|
|
* - Backend service and endpoints
|
|
* - Frontend pages that use it
|
|
* - Connection status (connected, partial, not connected)
|
|
*/
|
|
|
|
export interface BackendModule {
|
|
id: string
|
|
name: string
|
|
description: string
|
|
category: 'compliance' | 'ai' | 'infrastructure' | 'education' | 'communication' | 'development'
|
|
backend: {
|
|
service: string // e.g. 'consent-service', 'python-backend', 'klausur-service'
|
|
port: number
|
|
basePath: string
|
|
endpoints: {
|
|
path: string
|
|
method: string
|
|
description: string
|
|
}[]
|
|
}
|
|
frontend: {
|
|
adminV2Page?: string // New admin-v2 page path
|
|
oldAdminPage?: string // Old admin page path (for reference)
|
|
status: 'connected' | 'partial' | 'not-connected' | 'deprecated'
|
|
}
|
|
dependencies?: string[] // IDs of other modules this depends on
|
|
priority: 'critical' | 'high' | 'medium' | 'low'
|
|
notes?: string
|
|
}
|
|
|
|
export const MODULE_REGISTRY: BackendModule[] = [
|
|
// ===========================================
|
|
// COMPLIANCE MODULES
|
|
// ===========================================
|
|
{
|
|
id: 'consent-documents',
|
|
name: 'Consent Dokumente',
|
|
description: 'Verwaltung rechtlicher Dokumente (AGB, Datenschutz, etc.)',
|
|
category: 'compliance',
|
|
backend: {
|
|
service: 'consent-service',
|
|
port: 8081,
|
|
basePath: '/api/consent/admin',
|
|
endpoints: [
|
|
{ path: '/documents', method: 'GET', description: 'Liste aller Dokumente' },
|
|
{ path: '/documents', method: 'POST', description: 'Dokument erstellen' },
|
|
{ path: '/documents/{id}', method: 'GET', description: 'Dokument Details' },
|
|
{ path: '/documents/{id}', method: 'PUT', description: 'Dokument aktualisieren' },
|
|
{ path: '/documents/{id}', method: 'DELETE', description: 'Dokument loeschen' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/sdk/consent-management',
|
|
oldAdminPage: '/admin/consent',
|
|
status: 'connected'
|
|
},
|
|
priority: 'critical'
|
|
},
|
|
{
|
|
id: 'consent-versions',
|
|
name: 'Dokument-Versionierung',
|
|
description: 'Versionsverwaltung und Freigabe-Workflow fuer rechtliche Dokumente',
|
|
category: 'compliance',
|
|
backend: {
|
|
service: 'consent-service',
|
|
port: 8081,
|
|
basePath: '/api/consent/admin',
|
|
endpoints: [
|
|
{ path: '/documents/{id}/versions', method: 'GET', description: 'Versionen eines Dokuments' },
|
|
{ path: '/versions', method: 'POST', description: 'Neue Version erstellen' },
|
|
{ path: '/versions/{id}', method: 'PUT', description: 'Version aktualisieren' },
|
|
{ path: '/versions/{id}', method: 'DELETE', description: 'Version loeschen' },
|
|
{ path: '/versions/{id}/submit-review', method: 'POST', description: 'Zur Pruefung einreichen' },
|
|
{ path: '/versions/{id}/approve', method: 'POST', description: 'Version genehmigen' },
|
|
{ path: '/versions/{id}/reject', method: 'POST', description: 'Version ablehnen' },
|
|
{ path: '/versions/{id}/publish', method: 'POST', description: 'Version veroeffentlichen' },
|
|
{ path: '/versions/{id}/approval-history', method: 'GET', description: 'Genehmigungsverlauf' },
|
|
{ path: '/versions/upload-word', method: 'POST', description: 'Word-Dokument importieren' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/sdk/workflow',
|
|
oldAdminPage: '/admin/consent (Versions Tab)',
|
|
status: 'connected'
|
|
},
|
|
dependencies: ['consent-documents'],
|
|
priority: 'critical'
|
|
},
|
|
{
|
|
id: 'consent-user',
|
|
name: 'Nutzer-Einwilligungen',
|
|
description: 'Tracking von Nutzer-Einwilligungen fuer DSGVO-Compliance',
|
|
category: 'compliance',
|
|
backend: {
|
|
service: 'consent-service',
|
|
port: 8081,
|
|
basePath: '/api/consent',
|
|
endpoints: [
|
|
{ path: '/status', method: 'GET', description: 'Einwilligungsstatus pruefen' },
|
|
{ path: '/give', method: 'POST', description: 'Einwilligung erteilen' },
|
|
{ path: '/withdraw', method: 'POST', description: 'Einwilligung widerrufen' },
|
|
{ path: '/history', method: 'GET', description: 'Einwilligungshistorie' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/sdk/einwilligungen',
|
|
oldAdminPage: '/admin/consent (Users Tab)',
|
|
status: 'connected',
|
|
},
|
|
priority: 'critical',
|
|
},
|
|
{
|
|
id: 'dsr-requests',
|
|
name: 'Datenschutzanfragen (DSR)',
|
|
description: 'DSGVO Art. 15-21 Anfragen verwalten',
|
|
category: 'compliance',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/dsr',
|
|
endpoints: [
|
|
{ path: '/requests', method: 'GET', description: 'Alle DSR-Anfragen' },
|
|
{ path: '/requests', method: 'POST', description: 'Neue Anfrage erstellen' },
|
|
{ path: '/requests/{id}', method: 'GET', description: 'Anfrage-Details' },
|
|
{ path: '/requests/{id}/process', method: 'POST', description: 'Anfrage bearbeiten' },
|
|
{ path: '/requests/{id}/export', method: 'GET', description: 'Daten exportieren' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/sdk/dsr',
|
|
oldAdminPage: '/admin/dsr',
|
|
status: 'connected'
|
|
},
|
|
priority: 'high',
|
|
},
|
|
{
|
|
id: 'dsms',
|
|
name: 'Datenschutz-Management-System',
|
|
description: 'Zentrales DSMS fuer Dokumentation und Compliance',
|
|
category: 'compliance',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/dsms',
|
|
endpoints: [
|
|
{ path: '/documents', method: 'GET', description: 'DSMS-Dokumente' },
|
|
{ path: '/processes', method: 'GET', description: 'Verarbeitungsverzeichnis' },
|
|
{ path: '/toms', method: 'GET', description: 'TOM-Katalog' },
|
|
{ path: '/audits', method: 'GET', description: 'Audit-Historie' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/sdk/dsms',
|
|
oldAdminPage: '/admin/dsms',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
{
|
|
id: 'cookie-categories',
|
|
name: 'Cookie-Kategorien',
|
|
description: 'Verwaltung von Cookie-Kategorien fuer Consent Banner',
|
|
category: 'compliance',
|
|
backend: {
|
|
service: 'consent-service',
|
|
port: 8081,
|
|
basePath: '/api/consent/admin',
|
|
endpoints: [
|
|
{ path: '/cookies/categories', method: 'GET', description: 'Alle Cookie-Kategorien' },
|
|
{ path: '/cookies/categories', method: 'POST', description: 'Kategorie erstellen' },
|
|
{ path: '/cookies/categories/{id}', method: 'PUT', description: 'Kategorie aktualisieren' },
|
|
{ path: '/cookies/categories/{id}', method: 'DELETE', description: 'Kategorie loeschen' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: undefined,
|
|
oldAdminPage: '/admin/consent (Cookies Tab)',
|
|
status: 'not-connected'
|
|
},
|
|
priority: 'medium',
|
|
notes: 'Cookie-Kategorien Tab im alten Admin vorhanden'
|
|
},
|
|
|
|
// ===========================================
|
|
// AI MODULES
|
|
// ===========================================
|
|
{
|
|
id: 'ai-agents',
|
|
name: 'AI Agents',
|
|
description: 'Multi-Agent System Verwaltung und Monitoring',
|
|
category: 'ai',
|
|
backend: {
|
|
service: 'voice-service',
|
|
port: 8088,
|
|
basePath: '/api/v1/agents',
|
|
endpoints: [
|
|
{ path: '/sessions', method: 'GET', description: 'Agent-Sessions' },
|
|
{ path: '/statistics', method: 'GET', description: 'Agent-Statistiken' },
|
|
{ path: '/{agentId}', method: 'GET', description: 'Agent-Details' },
|
|
{ path: '/{agentId}/soul', method: 'GET', description: 'SOUL-Konfiguration' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/ai/agents',
|
|
oldAdminPage: undefined,
|
|
status: 'connected'
|
|
},
|
|
priority: 'high',
|
|
notes: 'Neues Multi-Agent System'
|
|
},
|
|
{
|
|
id: 'ai-quality',
|
|
name: 'AI Quality (BQAS)',
|
|
description: 'KI-Qualitaetssicherung und Evaluierung',
|
|
category: 'ai',
|
|
backend: {
|
|
service: 'voice-service',
|
|
port: 8088,
|
|
basePath: '/api/bqas',
|
|
endpoints: [
|
|
{ path: '/evaluate', method: 'POST', description: 'Antwort evaluieren' },
|
|
{ path: '/metrics', method: 'GET', description: 'Qualitaetsmetriken' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/ai/quality',
|
|
oldAdminPage: '/admin/quality',
|
|
status: 'connected'
|
|
},
|
|
priority: 'high'
|
|
},
|
|
{
|
|
id: 'llm-compare',
|
|
name: 'LLM Vergleich',
|
|
description: 'Vergleich verschiedener KI-Modelle und Provider',
|
|
category: 'ai',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/llm',
|
|
endpoints: [
|
|
{ path: '/providers', method: 'GET', description: 'Verfuegbare Provider' },
|
|
{ path: '/compare', method: 'POST', description: 'Modelle vergleichen' },
|
|
{ path: '/benchmark', method: 'POST', description: 'Benchmark ausfuehren' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/ai/llm-compare',
|
|
oldAdminPage: '/admin/llm-compare',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
{
|
|
id: 'magic-help',
|
|
name: 'Magic Help (TrOCR)',
|
|
description: 'Handschrifterkennung mit TrOCR und LoRA Fine-Tuning',
|
|
category: 'ai',
|
|
backend: {
|
|
service: 'klausur-service',
|
|
port: 8086,
|
|
basePath: '/api/klausur/trocr',
|
|
endpoints: [
|
|
{ path: '/status', method: 'GET', description: 'TrOCR Status' },
|
|
{ path: '/extract', method: 'POST', description: 'Text aus Bild extrahieren' },
|
|
{ path: '/training/examples', method: 'GET', description: 'Trainingsbeispiele' },
|
|
{ path: '/training/add', method: 'POST', description: 'Trainingsbeispiel hinzufuegen' },
|
|
{ path: '/training/fine-tune', method: 'POST', description: 'Fine-Tuning starten' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/ai/magic-help',
|
|
oldAdminPage: '/admin/magic-help',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium',
|
|
notes: 'Lokale Handschrifterkennung mit Privacy-by-Design'
|
|
},
|
|
{
|
|
id: 'klausur-korrektur',
|
|
name: 'Klausur-Korrektur',
|
|
description: 'KI-gestuetzte Abitur-Korrektur mit EH-Vorschlaegen',
|
|
category: 'ai',
|
|
backend: {
|
|
service: 'klausur-service',
|
|
port: 8086,
|
|
basePath: '/api/v1',
|
|
endpoints: [
|
|
{ path: '/klausuren', method: 'GET', description: 'Alle Klausuren' },
|
|
{ path: '/klausuren', method: 'POST', description: 'Klausur erstellen' },
|
|
{ path: '/klausuren/{id}/students', method: 'GET', description: 'Studentenarbeiten' },
|
|
{ path: '/students/{id}/annotations', method: 'GET', description: 'Anmerkungen' },
|
|
{ path: '/students/{id}/gutachten/generate', method: 'POST', description: 'Gutachten generieren' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/ai/klausur-korrektur',
|
|
oldAdminPage: '/admin/klausur-korrektur',
|
|
status: 'not-connected'
|
|
},
|
|
priority: 'high',
|
|
notes: 'Komplexes Modul mit eigenem Backend-Service'
|
|
},
|
|
{
|
|
id: 'ocr-labeling',
|
|
name: 'OCR-Labeling',
|
|
description: 'Handschrift-Training und Label-Verwaltung',
|
|
category: 'ai',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/ocr',
|
|
endpoints: [
|
|
{ path: '/samples', method: 'GET', description: 'Training-Samples' },
|
|
{ path: '/labels', method: 'GET', description: 'Label-Kategorien' },
|
|
{ path: '/train', method: 'POST', description: 'Training starten' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/ai/ocr-labeling',
|
|
oldAdminPage: '/admin/ocr-labeling',
|
|
status: 'not-connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
{
|
|
id: 'rag-management',
|
|
name: 'RAG & Daten',
|
|
description: 'Retrieval Augmented Generation und Training Data',
|
|
category: 'ai',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/rag',
|
|
endpoints: [
|
|
{ path: '/documents', method: 'GET', description: 'RAG-Dokumente' },
|
|
{ path: '/collections', method: 'GET', description: 'Vector-Collections' },
|
|
{ path: '/query', method: 'POST', description: 'RAG-Abfrage' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/ai/rag',
|
|
oldAdminPage: '/admin/rag',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
|
|
// ===========================================
|
|
// INFRASTRUCTURE MODULES
|
|
// ===========================================
|
|
{
|
|
id: 'gpu-infrastructure',
|
|
name: 'GPU Infrastruktur',
|
|
description: 'vast.ai GPU-Management und Monitoring',
|
|
category: 'infrastructure',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/gpu',
|
|
endpoints: [
|
|
{ path: '/instances', method: 'GET', description: 'GPU-Instanzen' },
|
|
{ path: '/instances', method: 'POST', description: 'Instanz erstellen' },
|
|
{ path: '/usage', method: 'GET', description: 'Nutzungsstatistiken' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/infrastructure/gpu',
|
|
oldAdminPage: '/admin/gpu',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
{
|
|
id: 'security-dashboard',
|
|
name: 'Security Dashboard',
|
|
description: 'DevSecOps Dashboard und Vulnerability Scans',
|
|
category: 'infrastructure',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/security',
|
|
endpoints: [
|
|
{ path: '/scans', method: 'GET', description: 'Security-Scans' },
|
|
{ path: '/vulnerabilities', method: 'GET', description: 'Schwachstellen' },
|
|
{ path: '/compliance', method: 'GET', description: 'Compliance-Status' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/infrastructure/security',
|
|
oldAdminPage: '/admin/security',
|
|
status: 'connected'
|
|
},
|
|
priority: 'high'
|
|
},
|
|
{
|
|
id: 'sbom',
|
|
name: 'SBOM',
|
|
description: 'Software Bill of Materials',
|
|
category: 'infrastructure',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/sbom',
|
|
endpoints: [
|
|
{ path: '/components', method: 'GET', description: 'Komponenten-Liste' },
|
|
{ path: '/licenses', method: 'GET', description: 'Lizenz-Uebersicht' },
|
|
{ path: '/export', method: 'GET', description: 'SBOM exportieren' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/infrastructure/sbom',
|
|
oldAdminPage: '/admin/sbom',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
|
|
{
|
|
id: 'middleware',
|
|
name: 'Middleware Manager',
|
|
description: 'Verwaltung und Monitoring der Backend-Middleware',
|
|
category: 'infrastructure',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/middleware',
|
|
endpoints: [
|
|
{ path: '/status', method: 'GET', description: 'Middleware-Status' },
|
|
{ path: '/config', method: 'GET', description: 'Konfiguration' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/infrastructure/middleware',
|
|
oldAdminPage: '/admin/middleware',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
{
|
|
id: 'ci-cd',
|
|
name: 'CI/CD Pipeline',
|
|
description: 'Build-Pipeline und Deployment-Management',
|
|
category: 'infrastructure',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/builds',
|
|
endpoints: [
|
|
{ path: '/pipelines', method: 'GET', description: 'Pipeline-Status' },
|
|
{ path: '/builds', method: 'GET', description: 'Build-Historie' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/infrastructure/ci-cd',
|
|
oldAdminPage: '/admin/builds',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
|
|
// ===========================================
|
|
// EDUCATION MODULES
|
|
// ===========================================
|
|
{
|
|
id: 'edu-search',
|
|
name: 'Bildungssuche',
|
|
description: 'Suche nach Bildungsinhalten und Ressourcen',
|
|
category: 'education',
|
|
backend: {
|
|
service: 'edu-search-service',
|
|
port: 8089,
|
|
basePath: '/api/edu',
|
|
endpoints: [
|
|
{ path: '/search', method: 'GET', description: 'Bildungssuche' },
|
|
{ path: '/resources', method: 'GET', description: 'Ressourcen' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/education/edu-search',
|
|
oldAdminPage: '/admin/edu-search',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
|
|
// ===========================================
|
|
// COMMUNICATION MODULES
|
|
// ===========================================
|
|
{
|
|
id: 'alerts',
|
|
name: 'Alerts & Benachrichtigungen',
|
|
description: 'System-Benachrichtigungen und Alerts',
|
|
category: 'communication',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/alerts',
|
|
endpoints: [
|
|
{ path: '/notifications', method: 'GET', description: 'Benachrichtigungen' },
|
|
{ path: '/alerts', method: 'GET', description: 'Aktive Alerts' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/communication/alerts',
|
|
oldAdminPage: '/admin/alerts',
|
|
status: 'connected'
|
|
},
|
|
priority: 'medium'
|
|
},
|
|
{
|
|
id: 'unified-inbox',
|
|
name: 'Unified Inbox',
|
|
description: 'E-Mail-Konten und KI-Analyse',
|
|
category: 'communication',
|
|
backend: {
|
|
service: 'python-backend',
|
|
port: 8000,
|
|
basePath: '/api/mail',
|
|
endpoints: [
|
|
{ path: '/accounts', method: 'GET', description: 'E-Mail-Konten' },
|
|
{ path: '/messages', method: 'GET', description: 'Nachrichten' },
|
|
{ path: '/analyze', method: 'POST', description: 'KI-Analyse' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/communication/mail',
|
|
oldAdminPage: '/admin/mail',
|
|
status: 'connected'
|
|
},
|
|
priority: 'low'
|
|
},
|
|
|
|
// ===========================================
|
|
// DEVELOPMENT MODULES
|
|
// ===========================================
|
|
{
|
|
id: 'voice-service',
|
|
name: 'Voice Service',
|
|
description: 'Voice-First Interface',
|
|
category: 'development',
|
|
backend: {
|
|
service: 'voice-service',
|
|
port: 8088,
|
|
basePath: '/api/voice',
|
|
endpoints: [
|
|
{ path: '/transcribe', method: 'POST', description: 'Sprache transkribieren' },
|
|
{ path: '/synthesize', method: 'POST', description: 'Text zu Sprache' },
|
|
]
|
|
},
|
|
frontend: {
|
|
adminV2Page: '/development/voice',
|
|
oldAdminPage: '/admin/voice',
|
|
status: 'not-connected'
|
|
},
|
|
priority: 'low'
|
|
},
|
|
]
|
|
|
|
// Helper functions
|
|
export function getModulesByCategory(category: BackendModule['category']): BackendModule[] {
|
|
return MODULE_REGISTRY.filter(m => m.category === category)
|
|
}
|
|
|
|
export function getConnectedModules(): BackendModule[] {
|
|
return MODULE_REGISTRY.filter(m => m.frontend.status === 'connected')
|
|
}
|
|
|
|
export function getNotConnectedModules(): BackendModule[] {
|
|
return MODULE_REGISTRY.filter(m => m.frontend.status === 'not-connected')
|
|
}
|
|
|
|
export function getPartialModules(): BackendModule[] {
|
|
return MODULE_REGISTRY.filter(m => m.frontend.status === 'partial')
|
|
}
|
|
|
|
export function getModuleStats() {
|
|
const total = MODULE_REGISTRY.length
|
|
const connected = MODULE_REGISTRY.filter(m => m.frontend.status === 'connected').length
|
|
const partial = MODULE_REGISTRY.filter(m => m.frontend.status === 'partial').length
|
|
const notConnected = MODULE_REGISTRY.filter(m => m.frontend.status === 'not-connected').length
|
|
const deprecated = MODULE_REGISTRY.filter(m => m.frontend.status === 'deprecated').length
|
|
|
|
return {
|
|
total,
|
|
connected,
|
|
partial,
|
|
notConnected,
|
|
deprecated,
|
|
percentComplete: Math.round((connected / total) * 100)
|
|
}
|
|
}
|
|
|
|
export function getCategoryStats(category: BackendModule['category']) {
|
|
const modules = getModulesByCategory(category)
|
|
const total = modules.length
|
|
const connected = modules.filter(m => m.frontend.status === 'connected').length
|
|
const partial = modules.filter(m => m.frontend.status === 'partial').length
|
|
const notConnected = modules.filter(m => m.frontend.status === 'not-connected').length
|
|
|
|
return {
|
|
total,
|
|
connected,
|
|
partial,
|
|
notConnected,
|
|
percentComplete: total > 0 ? Math.round((connected / total) * 100) : 0
|
|
}
|
|
}
|