feat: 7 Vorbereitungs-Module auf 100% — Frontend, Proxy-Routen, Backend-Fixes
All checks were successful
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / test-go-ai-compliance (push) Successful in 35s
CI / test-python-backend-compliance (push) Successful in 30s
CI / test-python-document-crawler (push) Successful in 22s
CI / test-python-dsms-gateway (push) Successful in 19s

Profil: machineBuilder-Felder im POST-Body, PATCH-Handler
Scope: API-Route (GET/POST), ScopeDecisionTab Props + Buttons, Export-Druckansicht HTML
Anwendung: PUT-Handler, Bearbeiten-Button, Pagination/Search
Import: Verlauf laden, DELETE-Route, Offline-Badge, ObjectURL Memory-Leak fix
Screening: Security-Backlog Button verdrahtet, Scan-Verlauf
Module: Detail-Seite, GET-Proxy, Konfigurieren-Button, Modul-erstellen-Modal, Error-Toast
Quellen: 10 Proxy-Routen, Tab-Komponenten umgestellt, Dashboard-Tab, blocked_today Bug fix, Datum-Filter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-03-02 15:08:13 +01:00
parent fc83ebfd82
commit d079886819
32 changed files with 1734 additions and 76 deletions

View File

@@ -87,7 +87,7 @@ export function AuditTab({ apiBase }: AuditTabProps) {
if (entityFilter) params.append('entity_type', entityFilter)
params.append('limit', '100')
const res = await fetch(`${apiBase}/v1/admin/policy-audit?${params}`)
const res = await fetch(`${apiBase}/policy-audit?${params}`)
if (!res.ok) throw new Error('Fehler beim Laden')
const data = await res.json()
@@ -108,7 +108,7 @@ export function AuditTab({ apiBase }: AuditTabProps) {
if (dateTo) params.append('to', dateTo)
params.append('limit', '100')
const res = await fetch(`${apiBase}/v1/admin/blocked-content?${params}`)
const res = await fetch(`${apiBase}/blocked-content?${params}`)
if (!res.ok) {
// Endpoint may not exist yet — show empty state
setBlockedContent([])
@@ -136,7 +136,7 @@ export function AuditTab({ apiBase }: AuditTabProps) {
if (dateTo) params.append('to', dateTo)
params.append('format', 'download')
const res = await fetch(`${apiBase}/v1/admin/compliance-report?${params}`)
const res = await fetch(`${apiBase}/compliance-report?${params}`)
if (!res.ok) throw new Error('Fehler beim Export')
const blob = await res.blob()

View File

@@ -44,8 +44,8 @@ export function OperationsMatrixTab({ apiBase }: OperationsMatrixTabProps) {
try {
setLoading(true)
const [sourcesRes, opsRes] = await Promise.all([
fetch(`${apiBase}/v1/admin/sources`),
fetch(`${apiBase}/v1/admin/operations-matrix`),
fetch(`${apiBase}/sources`),
fetch(`${apiBase}/operations-matrix`),
])
if (!sourcesRes.ok || !opsRes.ok) throw new Error('Fehler beim Laden')
@@ -95,7 +95,7 @@ export function OperationsMatrixTab({ apiBase }: OperationsMatrixTabProps) {
setUpdating(updateId)
try {
const res = await fetch(`${apiBase}/v1/admin/operations/${permission.id}`, {
const res = await fetch(`${apiBase}/operations/${permission.id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ allowed: !permission.allowed }),

View File

@@ -82,7 +82,7 @@ export function PIIRulesTab({ apiBase, onUpdate }: PIIRulesTabProps) {
const fetchRules = async () => {
try {
setLoading(true)
const res = await fetch(`${apiBase}/v1/admin/pii-rules`)
const res = await fetch(`${apiBase}/pii-rules`)
if (!res.ok) throw new Error('Fehler beim Laden')
const data = await res.json()
@@ -97,7 +97,7 @@ export function PIIRulesTab({ apiBase, onUpdate }: PIIRulesTabProps) {
const createRule = async () => {
try {
setSaving(true)
const res = await fetch(`${apiBase}/v1/admin/pii-rules`, {
const res = await fetch(`${apiBase}/pii-rules`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newRule),
@@ -127,7 +127,7 @@ export function PIIRulesTab({ apiBase, onUpdate }: PIIRulesTabProps) {
try {
setSaving(true)
const res = await fetch(`${apiBase}/v1/admin/pii-rules/${editingRule.id}`, {
const res = await fetch(`${apiBase}/pii-rules/${editingRule.id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(editingRule),
@@ -149,7 +149,7 @@ export function PIIRulesTab({ apiBase, onUpdate }: PIIRulesTabProps) {
if (!confirm('Regel wirklich loeschen? Diese Aktion wird im Audit-Log protokolliert.')) return
try {
const res = await fetch(`${apiBase}/v1/admin/pii-rules/${id}`, {
const res = await fetch(`${apiBase}/pii-rules/${id}`, {
method: 'DELETE',
})
@@ -164,7 +164,7 @@ export function PIIRulesTab({ apiBase, onUpdate }: PIIRulesTabProps) {
const toggleRuleStatus = async (rule: PIIRule) => {
try {
const res = await fetch(`${apiBase}/v1/admin/pii-rules/${rule.id}`, {
const res = await fetch(`${apiBase}/pii-rules/${rule.id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ active: !rule.active }),

View File

@@ -78,7 +78,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) {
if (licenseFilter) params.append('license', licenseFilter)
if (statusFilter !== 'all') params.append('active_only', statusFilter === 'active' ? 'true' : 'false')
const res = await fetch(`${apiBase}/v1/admin/sources?${params}`)
const res = await fetch(`${apiBase}/sources?${params}`)
if (!res.ok) throw new Error('Fehler beim Laden')
const data = await res.json()
@@ -93,7 +93,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) {
const createSource = async () => {
try {
setSaving(true)
const res = await fetch(`${apiBase}/v1/admin/sources`, {
const res = await fetch(`${apiBase}/sources`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(newSource),
@@ -124,7 +124,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) {
try {
setSaving(true)
const res = await fetch(`${apiBase}/v1/admin/sources/${editingSource.id}`, {
const res = await fetch(`${apiBase}/sources/${editingSource.id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(editingSource),
@@ -146,7 +146,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) {
if (!confirm('Quelle wirklich loeschen? Diese Aktion wird im Audit-Log protokolliert.')) return
try {
const res = await fetch(`${apiBase}/v1/admin/sources/${id}`, {
const res = await fetch(`${apiBase}/sources/${id}`, {
method: 'DELETE',
})
@@ -161,7 +161,7 @@ export function SourcesTab({ apiBase, onUpdate }: SourcesTabProps) {
const toggleSourceStatus = async (source: AllowedSource) => {
try {
const res = await fetch(`${apiBase}/v1/admin/sources/${source.id}`, {
const res = await fetch(`${apiBase}/sources/${source.id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ active: !source.active }),