Files
breakpilot-core/scripts/init-schemas.sql
Benjamin Boenisch ad111d5e69 Initial commit: breakpilot-core - Shared Infrastructure
Docker Compose with 24+ services:
- PostgreSQL (PostGIS), Valkey, MinIO, Qdrant
- Vault (PKI/TLS), Nginx (Reverse Proxy)
- Backend Core API, Consent Service, Billing Service
- RAG Service, Embedding Service
- Gitea, Woodpecker CI/CD
- Night Scheduler, Health Aggregator
- Jitsi (Web/XMPP/JVB/Jicofo), Mailpit

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-11 23:47:13 +01:00

136 lines
7.6 KiB
SQL

-- BreakPilot Schema-Separation
-- Erstellt 3 getrennte Schemas für Core, Lehrer und Compliance
-- Wird beim ersten Start von postgres ausgeführt
-- Schemas erstellen
CREATE SCHEMA IF NOT EXISTS core;
CREATE SCHEMA IF NOT EXISTS lehrer;
CREATE SCHEMA IF NOT EXISTS compliance;
-- Berechtigungen für breakpilot User
GRANT ALL ON SCHEMA core TO breakpilot;
GRANT ALL ON SCHEMA lehrer TO breakpilot;
GRANT ALL ON SCHEMA compliance TO breakpilot;
-- Default search_path für den breakpilot User
ALTER ROLE breakpilot SET search_path TO public, core, lehrer, compliance;
-- =============================================
-- TABELLEN-MIGRATION: public -> core Schema
-- =============================================
-- Hinweis: Wird nur ausgeführt wenn Tabellen in public existieren
-- Bei Neuinstallation werden Tabellen direkt im richtigen Schema erstellt
DO $$
BEGIN
-- Core-Tabellen verschieben (falls vorhanden)
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'users') THEN
ALTER TABLE public.users SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'sessions') THEN
ALTER TABLE public.sessions SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'consent_records') THEN
ALTER TABLE public.consent_records SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'notifications') THEN
ALTER TABLE public.notifications SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'email_templates') THEN
ALTER TABLE public.email_templates SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'billing_customers') THEN
ALTER TABLE public.billing_customers SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'billing_subscriptions') THEN
ALTER TABLE public.billing_subscriptions SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'billing_invoices') THEN
ALTER TABLE public.billing_invoices SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'rbac_roles') THEN
ALTER TABLE public.rbac_roles SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'rbac_permissions') THEN
ALTER TABLE public.rbac_permissions SET SCHEMA core;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'rbac_role_permissions') THEN
ALTER TABLE public.rbac_role_permissions SET SCHEMA core;
END IF;
-- Lehrer-Tabellen verschieben (falls vorhanden)
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'classrooms') THEN
ALTER TABLE public.classrooms SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'learning_units') THEN
ALTER TABLE public.learning_units SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'klausuren') THEN
ALTER TABLE public.klausuren SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'corrections') THEN
ALTER TABLE public.corrections SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'worksheets') THEN
ALTER TABLE public.worksheets SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'certificates') THEN
ALTER TABLE public.certificates SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'letters') THEN
ALTER TABLE public.letters SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'meetings') THEN
ALTER TABLE public.meetings SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'messenger_contacts') THEN
ALTER TABLE public.messenger_contacts SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'messenger_conversations') THEN
ALTER TABLE public.messenger_conversations SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'messenger_messages') THEN
ALTER TABLE public.messenger_messages SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'vocab_sessions') THEN
ALTER TABLE public.vocab_sessions SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'game_sessions') THEN
ALTER TABLE public.game_sessions SET SCHEMA lehrer;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'game_scores') THEN
ALTER TABLE public.game_scores SET SCHEMA lehrer;
END IF;
-- Compliance-Tabellen verschieben (falls vorhanden)
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_risks') THEN
ALTER TABLE public.compliance_risks SET SCHEMA compliance;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_controls') THEN
ALTER TABLE public.compliance_controls SET SCHEMA compliance;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_requirements') THEN
ALTER TABLE public.compliance_requirements SET SCHEMA compliance;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'compliance_evidence') THEN
ALTER TABLE public.compliance_evidence SET SCHEMA compliance;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'dsr_requests') THEN
ALTER TABLE public.dsr_requests SET SCHEMA compliance;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'sdk_tenants') THEN
ALTER TABLE public.sdk_tenants SET SCHEMA compliance;
END IF;
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'sdk_audit_logs') THEN
ALTER TABLE public.sdk_audit_logs SET SCHEMA compliance;
END IF;
RAISE NOTICE 'Schema migration complete.';
END $$;
-- Cross-Schema Views für häufige Lookups
CREATE OR REPLACE VIEW compliance.v_users AS SELECT * FROM core.users;
CREATE OR REPLACE VIEW lehrer.v_users AS SELECT * FROM core.users;
CREATE OR REPLACE VIEW lehrer.v_consent_records AS SELECT * FROM core.consent_records;
CREATE OR REPLACE VIEW compliance.v_consent_records AS SELECT * FROM core.consent_records;