'use client' import { useState } from 'react' import type { ServiceNode } from '../types' import { ARCHITECTURE_SERVICES, LAYERS, DATAFLOW_DIAGRAM } from '../data' import { getArchTypeColor, getArchTypeLabel } from '../helpers' import ServiceDetailPanel from './ServiceDetailPanel' export default function OverviewTab() { const [selectedArchService, setSelectedArchService] = useState(null) const [activeLayer, setActiveLayer] = useState('all') const getServicesForLayer = (layer: typeof LAYERS[0]) => { return ARCHITECTURE_SERVICES.filter(s => layer.types.includes(s.type)) } const archStats = { total: ARCHITECTURE_SERVICES.length, frontends: ARCHITECTURE_SERVICES.filter(s => s.type === 'frontend').length, backends: ARCHITECTURE_SERVICES.filter(s => s.type === 'backend').length, databases: ARCHITECTURE_SERVICES.filter(s => s.type === 'database').length, infrastructure: ARCHITECTURE_SERVICES.filter(s => ['cache', 'search', 'storage', 'security', 'communication', 'ai', 'erp'].includes(s.type)).length, } return (
{/* Stats */}
{archStats.total}
Services Total
{archStats.frontends}
Frontends
{archStats.backends}
Backends
{archStats.databases}
Datenbanken
{archStats.infrastructure}
Infrastruktur
{/* ASCII Architecture Diagram with Arrows */}

Datenfluss-Diagramm

{DATAFLOW_DIAGRAM}
{/* Layer Filter */}
{LAYERS.map((layer) => ( ))}
{/* Architecture Diagram - Layered View */}

System-Architektur Diagramm

{LAYERS.map((layer) => { const layerServices = getServicesForLayer(layer) if (activeLayer !== 'all' && activeLayer !== layer.id) return null return (

{layer.name}

- {layer.description}
{layerServices.map((service) => { const colors = getArchTypeColor(service.type) const isSelected = selectedArchService?.id === service.id return (
setSelectedArchService(isSelected ? null : service)} className={`cursor-pointer rounded-lg border-2 p-3 transition-all ${ isSelected ? `${colors.border} ${colors.light} shadow-lg scale-105` : 'border-slate-200 bg-white hover:border-slate-300 hover:shadow' }`} >
{service.port && service.port !== '-' && ( :{service.port} )}

{service.name}

{service.technology}

{service.description}

{service.connections && service.connections.length > 0 && (
{service.connections.length} Verbindung{service.connections.length > 1 ? 'en' : ''}
)}
) })}
) })}
{/* Service Detail Panel */} {selectedArchService && ( setSelectedArchService(null)} onSelectService={setSelectedArchService} /> )} {/* Legend */}

Legende

{(['frontend', 'backend', 'database', 'cache', 'search', 'storage', 'security', 'communication', 'ai', 'erp'] as const).map((type) => { const colors = getArchTypeColor(type) return (
{getArchTypeLabel(type)}
) })}
{/* Technical Details Section */}

Technische Details

{/* Data Flow */}

Datenfluss

1. Request: Browser → Next.js/FastAPI Frontend

2. API: Frontend → Python Backend / Go Microservices

3. Auth: Keycloak/Vault fuer SSO & Secrets

4. Data: PostgreSQL (ACID) / Redis (Cache)

5. Search: Qdrant (Vector) / Meilisearch (Fulltext)

6. Storage: MinIO (Files) / IPFS (Dezentral)

{/* Security */}

Sicherheit

Auth: JWT + Keycloak OIDC

Secrets: HashiCorp Vault (encrypted)

Communication: Matrix E2EE, TLS everywhere

DSGVO: Consent Service fuer Einwilligungen

DevSecOps: Trivy, Gitleaks, Semgrep, Bandit

SBOM: CycloneDX fuer alle Komponenten

{/* Languages */}

Programmiersprachen

Python 3.12 Go 1.21 TypeScript 5.x JavaScript ES2022
{/* Frameworks */}

Frameworks

Next.js 15 FastAPI Gin (Go) Vue 3 Angular 17 NestJS
) }