'use client' import { useState } from 'react' import AdminLayout from '@/components/admin/AdminLayout' import { WizardStepper, WizardNavigation, EducationCard, ArchitectureContext, TestRunner, TestSummary, type WizardStep, type TestCategoryResult, type FullTestResults, type EducationContent, type ArchitectureContextType, } from '@/components/wizard' // ============================================== // Types & Constants // ============================================== const BACKEND_URL = process.env.NEXT_PUBLIC_BACKEND_URL || 'http://localhost:8000' const STEPS: WizardStep[] = [ { id: 'welcome', name: 'Willkommen', icon: '👋', status: 'pending' }, { id: 'api-health', name: 'API Status', icon: '💚', status: 'pending', category: 'api-health' }, { id: 'documents', name: 'Dokumente', icon: '📄', status: 'pending', category: 'documents' }, { id: 'versions', name: 'Versionen', icon: '📋', status: 'pending', category: 'versions' }, { id: 'consent-records', name: 'Einwilligungen', icon: '✅', status: 'pending', category: 'consent-records' }, { id: 'summary', name: 'Zusammenfassung', icon: '📊', status: 'pending' }, ] const EDUCATION_CONTENT: Record = { 'welcome': { title: 'Willkommen zum Consent-Wizard', content: [ 'Die Consent-Verwaltung ist das Herzstuck der DSGVO-Konformitaet. Hier lernen Sie:', '• Wie rechtliche Dokumente verwaltet werden', '• Wie der Versions-Workflow funktioniert', '• Wie Einwilligungen erfasst und nachgewiesen werden', '• Welche Architektur-Komponenten beteiligt sind', '', 'Jede Einwilligung eines Benutzers wird rechtssicher dokumentiert.', 'Bei Behoerdenanfragen koennen Sie jeden Nachweis sofort vorlegen.', ], }, 'api-health': { title: 'API Verfuegbarkeit - Kritische Infrastruktur', content: [ 'Der Consent Service ist kritische Infrastruktur:', '• Ohne ihn koennen keine Einwilligungen erfasst werden', '• Benutzer koennen die Website nicht DSGVO-konform nutzen', '• Rechtliche Risiken bei Ausfall', '', 'Der Health-Check prueft:', '• Go Consent Service (Port 8081)', '• Python Backend API (Port 8000)', '• PostgreSQL Datenbankverbindung', ], }, 'documents': { title: 'Rechtliche Dokumente - DSGVO Art. 6 & 7', content: [ 'Jede Einwilligung muss auf einem rechtlich geprueften Dokument basieren.', 'Diese Dokumente durchlaufen einen Freigabe-Workflow:', '', 'draft → review → approved → published → archived', '', 'Nur der Datenschutzbeauftragte (DSB) kann Dokumente freigeben.', 'Dokumenttypen: terms, privacy, cookies, community_guidelines, imprint', '', '• Bussgelder bis 20 Mio. EUR bei Verstoessen', '• Rechtswirksamkeit von Einwilligungen haengt davon ab', ], }, 'versions': { title: 'Dokumentversionen - Lueckenlose Nachverfolgbarkeit', content: [ 'Jede Aenderung an einem rechtlichen Dokument erzeugt eine neue Version.', '', 'Die DSGVO verlangt lueckenlose Nachverfolgbarkeit:', '• Wann wurde welche Version erstellt?', '• Wer hat die Version freigegeben?', '• Welcher Text war zum Zeitpunkt der Einwilligung gueltig?', '', 'Versionen koennen nicht geloescht werden (Audit-Trail).', 'Archivierte Versionen bleiben fuer Nachweiszwecke erhalten.', ], }, 'consent-records': { title: 'Einwilligungsnachweise - Der rechtliche Beweis', content: [ 'Der Consent Record ist der rechtliche Nachweis, dass ein Benutzer', 'einer bestimmten Datenverarbeitung zugestimmt hat.', '', 'Jeder Record enthaelt:', '• Zeitstempel der Einwilligung', '• Exakte Version des Dokuments', '• IP-Adresse (anonymisiert)', '• Art der Einwilligung (opt-in, opt-out)', '', 'Bei Behoerdenanfragen oder Rechtsstreitigkeiten ist dieser', 'Nachweis entscheidend fuer die Rechtmaessigkeit der Verarbeitung.', ], }, 'summary': { title: 'Zusammenfassung der Tests', content: [ 'Hier sehen Sie eine Uebersicht aller durchgefuehrten Tests:', '• Anzahl bestandener Tests', '• Fehlgeschlagene Tests mit Details', '• Empfehlungen zur Behebung', ], }, } const ARCHITECTURE_CONTEXTS: Record = { 'api-health': { layer: 'service', services: ['consent-service', 'backend'], dependencies: ['PostgreSQL'], dataFlow: ['Health Check', 'Go Consent Service', 'PostgreSQL'], }, 'documents': { layer: 'service', services: ['consent-service', 'postgres'], dependencies: ['JWT Auth', 'RBAC (data_protection_officer)'], dataFlow: ['Browser', 'Next.js', 'FastAPI', 'Go Consent Service', 'PostgreSQL'], }, 'versions': { layer: 'service', services: ['consent-service', 'postgres'], dependencies: ['JWT Auth', 'Version Control'], dataFlow: ['Browser', 'Next.js', 'FastAPI', 'Go Consent Service', 'document_versions'], }, 'consent-records': { layer: 'database', services: ['consent-service', 'postgres'], dependencies: ['JWT Auth', 'PII Redaction', 'Audit Log'], dataFlow: ['User Action', 'FastAPI', 'Go Consent Service', 'consent_records'], }, } // ============================================== // Main Component // ============================================== export default function ConsentWizardPage() { const [currentStep, setCurrentStep] = useState(0) const [steps, setSteps] = useState(STEPS) const [categoryResults, setCategoryResults] = useState>({}) const [fullResults, setFullResults] = useState(null) const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const currentStepData = steps[currentStep] const isTestStep = currentStepData?.category !== undefined const isWelcome = currentStepData?.id === 'welcome' const isSummary = currentStepData?.id === 'summary' const runCategoryTest = async (category: string) => { setIsLoading(true) setError(null) try { const response = await fetch(`${BACKEND_URL}/api/admin/consent-tests/${category}`, { method: 'POST', }) if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`) } const result: TestCategoryResult = await response.json() setCategoryResults((prev) => ({ ...prev, [category]: result })) // Update step status setSteps((prev) => prev.map((step) => step.category === category ? { ...step, status: result.failed === 0 ? 'completed' : 'failed' } : step ) ) } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setIsLoading(false) } } const runAllTests = async () => { setIsLoading(true) setError(null) try { const response = await fetch(`${BACKEND_URL}/api/admin/consent-tests/run-all`, { method: 'POST', }) if (!response.ok) { throw new Error(`HTTP ${response.status}: ${response.statusText}`) } const results: FullTestResults = await response.json() setFullResults(results) // Update all step statuses setSteps((prev) => prev.map((step) => { if (step.category) { const catResult = results.categories.find((c) => c.category === step.category) if (catResult) { return { ...step, status: catResult.failed === 0 ? 'completed' : 'failed' } } } return step }) ) // Store category results const newCategoryResults: Record = {} results.categories.forEach((cat) => { newCategoryResults[cat.category] = cat }) setCategoryResults(newCategoryResults) } catch (err) { setError(err instanceof Error ? err.message : 'Unbekannter Fehler') } finally { setIsLoading(false) } } const goToNext = () => { if (currentStep < steps.length - 1) { setSteps((prev) => prev.map((step, idx) => idx === currentStep && step.status === 'pending' ? { ...step, status: 'completed' } : step ) ) setCurrentStep((prev) => prev + 1) } } const goToPrev = () => { if (currentStep > 0) { setCurrentStep((prev) => prev - 1) } } const handleStepClick = (index: number) => { if (index <= currentStep || steps[index - 1]?.status !== 'pending') { setCurrentStep(index) } } return ( {/* Header with back link */}
📋

Consent Management Test Wizard

DSGVO-konforme Einwilligungsverwaltung

← Zurueck zur Consent-Verwaltung
{/* Stepper */}
{/* Content */}
{/* Step Header */}
{currentStepData?.icon}

Schritt {currentStep + 1}: {currentStepData?.name}

{currentStep + 1} von {steps.length}

{/* Education Card */} {/* Architecture Context for test steps */} {isTestStep && currentStepData?.category && ARCHITECTURE_CONTEXTS[currentStepData.category] && ( )} {/* Error Display */} {error && (
Fehler: {error}
)} {/* Welcome Step */} {isWelcome && (
)} {/* Test Steps */} {isTestStep && currentStepData?.category && ( runCategoryTest(currentStepData.category!)} /> )} {/* Summary Step */} {isSummary && (
{!fullResults ? (

Fuehren Sie alle Tests aus um eine Zusammenfassung zu sehen.

) : ( )}
)} {/* Navigation */}
{/* Footer Info */}
Diese Tests pruefen die DSGVO-konforme Consent-Verwaltung. Bei Fragen wenden Sie sich an den Datenschutzbeauftragten.
) }