edbf6d2be5
Build + Deploy / build-admin-compliance (push) Successful in 1m58s
Build + Deploy / build-backend-compliance (push) Successful in 12s
Build + Deploy / build-ai-sdk (push) Successful in 11s
Build + Deploy / build-developer-portal (push) Successful in 11s
Build + Deploy / build-tts (push) Successful in 21s
Build + Deploy / build-document-crawler (push) Successful in 11s
Build + Deploy / build-dsms-gateway (push) Successful in 14s
Build + Deploy / build-dsms-node (push) Successful in 14s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / loc-budget (push) Failing after 15s
CI / secret-scan (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m40s
CI / dep-audit (push) Has been skipped
CI / sbom-scan (push) Has been skipped
CI / test-go (push) Successful in 40s
CI / test-python-backend (push) Successful in 37s
CI / test-python-document-crawler (push) Successful in 26s
CI / test-python-dsms-gateway (push) Successful in 22s
CI / validate-canonical-controls (push) Successful in 14s
Build + Deploy / trigger-orca (push) Successful in 2m26s
Stufe 2A: Evidence Upload → automatische DSMS-Archivierung
- Nach SHA-256 Hash → archive_to_dsms(), CID im Audit-Trail
- Evidence mit CID wird automatisch zu E2 (hash-verifiziert) hochgestuft
Stufe 2B: IACE Tech-File Export → DSMS
- PDF/Excel/DOCX/Markdown Exporte werden nach DSMS archiviert
- archiveTechFile() Helper fuer alle 4 Formate
Stufe 3A: DSMS Gateway — parent_cid + History Endpoint
- parent_cid + tenant_id Felder in DocumentMetadata
- GET /documents/{cid}/history — folgt parent_cid-Chain (max 50 deep)
Stufe 3C: Audit Timeline UI
- Neue Seite /sdk/audit-timeline
- Vertikale Timeline mit farbigen Action-Dots
- Filter: Alle, Nachweis, DSMS-Archiv, Control, Dokument, DSFA, VVT, TOM
- CID-Badges fuer DSMS-archivierte Eintraege
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
47 lines
1.2 KiB
TypeScript
47 lines
1.2 KiB
TypeScript
'use client'
|
|
|
|
import { useState, useEffect } from 'react'
|
|
|
|
export interface AuditEntry {
|
|
id: string
|
|
entity_type: string
|
|
entity_id: string
|
|
entity_name: string
|
|
action: string
|
|
field_changed: string | null
|
|
old_value: string | null
|
|
new_value: string | null
|
|
change_summary: string | null
|
|
performed_by: string
|
|
performed_at: string
|
|
}
|
|
|
|
export function useAuditTimeline() {
|
|
const [entries, setEntries] = useState<AuditEntry[]>([])
|
|
const [loading, setLoading] = useState(true)
|
|
const [filter, setFilter] = useState<string>('all')
|
|
|
|
useEffect(() => {
|
|
loadEntries()
|
|
}, [filter]) // eslint-disable-line react-hooks/exhaustive-deps
|
|
|
|
async function loadEntries() {
|
|
setLoading(true)
|
|
try {
|
|
const params = new URLSearchParams({ limit: '100' })
|
|
if (filter !== 'all') params.set('entity_type', filter)
|
|
const res = await fetch(`/api/sdk/v1/compliance/audit-trail?${params}`)
|
|
if (res.ok) {
|
|
const json = await res.json()
|
|
setEntries(json.entries || json.audit_trail || json || [])
|
|
}
|
|
} catch (err) {
|
|
console.error('Failed to load audit trail:', err)
|
|
} finally {
|
|
setLoading(false)
|
|
}
|
|
}
|
|
|
|
return { entries, loading, filter, setFilter }
|
|
}
|