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 34s
CI / test-python-backend-compliance (push) Successful in 32s
CI / test-python-document-crawler (push) Successful in 23s
CI / test-python-dsms-gateway (push) Successful in 18s
Part 1 — RAG Corpus Versioning: - New DB table compliance_corpus_versions (migration 017) - Go CorpusVersionStore with CRUD operations - Assessment struct extended with corpus_version_id - API endpoints: GET /rag/corpus-status, /rag/corpus-versions/:collection - RAG routes (search, regulations) now registered in main.go - Ingestion script registers corpus versions after each run - Frontend staleness badge in SDK sidebar Part 3 — Source Policy Backend: - New FastAPI router with CRUD for allowed sources, PII rules, operations matrix, audit trail, stats, and compliance report - SQLAlchemy models for all source policy tables (migration 001) - Frontend API base corrected from edu-search:8088/8089 to backend-compliance:8002/api Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
74 lines
3.1 KiB
SQL
74 lines
3.1 KiB
SQL
-- =============================================================================
|
|
-- Migration 001: Source Policy Tables
|
|
--
|
|
-- Tables for managing allowed compliance data sources, operations matrix,
|
|
-- PII rules, and audit trail.
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE IF NOT EXISTS compliance_allowed_sources (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
domain VARCHAR(255) UNIQUE NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
license VARCHAR(100),
|
|
legal_basis VARCHAR(200),
|
|
trust_boost FLOAT DEFAULT 0.5,
|
|
source_type VARCHAR(50) DEFAULT 'legal',
|
|
active BOOLEAN DEFAULT true,
|
|
metadata JSON,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_allowed_sources_domain ON compliance_allowed_sources(domain);
|
|
CREATE INDEX IF NOT EXISTS idx_allowed_sources_active ON compliance_allowed_sources(active);
|
|
|
|
CREATE TABLE IF NOT EXISTS compliance_source_operations (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
source_id UUID NOT NULL REFERENCES compliance_allowed_sources(id) ON DELETE CASCADE,
|
|
operation VARCHAR(50) NOT NULL,
|
|
allowed BOOLEAN DEFAULT true,
|
|
conditions TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_source_operations_source ON compliance_source_operations(source_id);
|
|
|
|
CREATE TABLE IF NOT EXISTS compliance_pii_rules (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
pattern TEXT,
|
|
category VARCHAR(50) NOT NULL,
|
|
action VARCHAR(20) DEFAULT 'mask',
|
|
active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_pii_rules_category ON compliance_pii_rules(category);
|
|
CREATE INDEX IF NOT EXISTS idx_pii_rules_active ON compliance_pii_rules(active);
|
|
|
|
CREATE TABLE IF NOT EXISTS compliance_source_policy_audit (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
action VARCHAR(20) NOT NULL,
|
|
entity_type VARCHAR(50) NOT NULL,
|
|
entity_id UUID,
|
|
old_values JSON,
|
|
new_values JSON,
|
|
user_id VARCHAR(100),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_source_audit_entity ON compliance_source_policy_audit(entity_type, entity_id);
|
|
CREATE INDEX IF NOT EXISTS idx_source_audit_created ON compliance_source_policy_audit(created_at);
|
|
|
|
-- Seed default PII rules
|
|
INSERT INTO compliance_pii_rules (name, category, pattern, action, description) VALUES
|
|
('E-Mail-Adresse', 'email', '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', 'mask', 'E-Mail-Adressen erkennen und maskieren'),
|
|
('Telefonnummer', 'phone', '(\+49|0)[0-9\s/-]{8,15}', 'mask', 'Deutsche Telefonnummern erkennen'),
|
|
('IBAN', 'financial', 'DE[0-9]{2}\s?[0-9]{4}\s?[0-9]{4}\s?[0-9]{4}\s?[0-9]{4}\s?[0-9]{2}', 'redact', 'Deutsche IBAN-Nummern erkennen und entfernen'),
|
|
('Postadresse', 'address', '[0-9]{5}\s+[A-Z][a-z]', 'flag', 'Postleitzahlen mit Ortsnamen markieren')
|
|
ON CONFLICT DO NOTHING;
|