Phase 1 — Python (klausur-service): 5 monoliths → 36 files - dsfa_corpus_ingestion.py (1,828 LOC → 5 files) - cv_ocr_engines.py (2,102 LOC → 7 files) - cv_layout.py (3,653 LOC → 10 files) - vocab_worksheet_api.py (2,783 LOC → 8 files) - grid_build_core.py (1,958 LOC → 6 files) Phase 2 — Go (edu-search-service, school-service): 8 monoliths → 19 files - staff_crawler.go (1,402 → 4), policy/store.go (1,168 → 3) - policy_handlers.go (700 → 2), repository.go (684 → 2) - search.go (592 → 2), ai_extraction_handlers.go (554 → 2) - seed_data.go (591 → 2), grade_service.go (646 → 2) Phase 3 — TypeScript (admin-lehrer): 45 monoliths → 220+ files - sdk/types.ts (2,108 → 16 domain files) - ai/rag/page.tsx (2,686 → 14 files) - 22 page.tsx files split into _components/ + _hooks/ - 11 component files split into sub-components - 10 SDK data catalogs added to loc-exceptions - Deleted dead backup index_original.ts (4,899 LOC) All original public APIs preserved via re-export facades. Zero new errors: Python imports verified, Go builds clean, TypeScript tsc --noEmit shows only pre-existing errors. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
104 lines
5.8 KiB
TypeScript
104 lines
5.8 KiB
TypeScript
'use client'
|
|
|
|
export function AuditTab() {
|
|
return (
|
|
<div className="space-y-6">
|
|
<h3 className="text-sm font-semibold text-slate-700 uppercase tracking-wide">Audit-relevante Informationen</h3>
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
{/* Database Info */}
|
|
<div className="bg-white rounded-xl border border-slate-200 p-4">
|
|
<h4 className="font-semibold text-slate-900 mb-3 flex items-center gap-2">
|
|
<svg className="w-5 h-5 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4" />
|
|
</svg>
|
|
Datenbank
|
|
</h4>
|
|
<div className="space-y-2">
|
|
<div className="flex items-center justify-between py-2 border-b border-slate-100">
|
|
<span className="text-sm text-slate-600">Tabellen</span>
|
|
<span className="text-sm font-medium bg-green-100 text-green-800 px-2 py-0.5 rounded">4 (topics, items, rules, profiles)</span>
|
|
</div>
|
|
<div className="flex items-center justify-between py-2 border-b border-slate-100">
|
|
<span className="text-sm text-slate-600">Indizes</span>
|
|
<span className="text-sm font-medium bg-green-100 text-green-800 px-2 py-0.5 rounded">URL-Hash, Topic-ID, Status</span>
|
|
</div>
|
|
<div className="flex items-center justify-between py-2">
|
|
<span className="text-sm text-slate-600">Backups</span>
|
|
<span className="text-sm font-medium bg-green-100 text-green-800 px-2 py-0.5 rounded">PostgreSQL pg_dump</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* API Security */}
|
|
<div className="bg-white rounded-xl border border-slate-200 p-4">
|
|
<h4 className="font-semibold text-slate-900 mb-3 flex items-center gap-2">
|
|
<svg className="w-5 h-5 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />
|
|
</svg>
|
|
API Sicherheit
|
|
</h4>
|
|
<div className="space-y-2">
|
|
<div className="flex items-center justify-between py-2 border-b border-slate-100">
|
|
<span className="text-sm text-slate-600">Authentifizierung</span>
|
|
<span className="text-sm font-medium bg-amber-100 text-amber-800 px-2 py-0.5 rounded">Bearer Token (geplant)</span>
|
|
</div>
|
|
<div className="flex items-center justify-between py-2 border-b border-slate-100">
|
|
<span className="text-sm text-slate-600">Rate Limiting</span>
|
|
<span className="text-sm font-medium bg-amber-100 text-amber-800 px-2 py-0.5 rounded">Nicht implementiert</span>
|
|
</div>
|
|
<div className="flex items-center justify-between py-2">
|
|
<span className="text-sm text-slate-600">Input Validation</span>
|
|
<span className="text-sm font-medium bg-green-100 text-green-800 px-2 py-0.5 rounded">Pydantic Models</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Logging */}
|
|
<div className="bg-white rounded-xl border border-slate-200 p-4">
|
|
<h4 className="font-semibold text-slate-900 mb-3 flex items-center gap-2">
|
|
<svg className="w-5 h-5 text-green-600" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z" />
|
|
</svg>
|
|
Logging & Monitoring
|
|
</h4>
|
|
<div className="space-y-2">
|
|
<div className="flex items-center justify-between py-2 border-b border-slate-100">
|
|
<span className="text-sm text-slate-600">Structured Logging</span>
|
|
<span className="text-sm font-medium bg-green-100 text-green-800 px-2 py-0.5 rounded">Python logging</span>
|
|
</div>
|
|
<div className="flex items-center justify-between py-2 border-b border-slate-100">
|
|
<span className="text-sm text-slate-600">Metriken</span>
|
|
<span className="text-sm font-medium bg-green-100 text-green-800 px-2 py-0.5 rounded">Stats Endpoint</span>
|
|
</div>
|
|
<div className="flex items-center justify-between py-2">
|
|
<span className="text-sm text-slate-600">Health Checks</span>
|
|
<span className="text-sm font-medium bg-green-100 text-green-800 px-2 py-0.5 rounded">/api/alerts/health</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{/* Privacy Notes */}
|
|
<div className="bg-blue-50 border border-blue-200 rounded-lg p-4">
|
|
<h4 className="text-sm font-semibold text-blue-800 mb-2">Datenschutz-Hinweise</h4>
|
|
<ul className="space-y-1">
|
|
{[
|
|
'Alle Daten werden in Deutschland gespeichert (PostgreSQL)',
|
|
'Keine personenbezogenen Daten in Alerts (nur URLs und Snippets)',
|
|
'LLM-Verarbeitung kann on-premise mit Ollama/vLLM erfolgen',
|
|
'DSGVO-konforme Datenverarbeitung',
|
|
].map((text, i) => (
|
|
<li key={i} className="text-sm text-blue-700 flex items-start gap-2">
|
|
<svg className="w-4 h-4 mt-0.5 text-blue-500 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
|
</svg>
|
|
{text}
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|