feat(sdk): Multi-Projekt-Architektur — mehrere Projekte pro Tenant
Some checks failed
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) Failing after 33s
CI / test-python-backend-compliance (push) Successful in 34s
CI / test-python-document-crawler (push) Successful in 23s
CI / test-python-dsms-gateway (push) Successful in 19s
Some checks failed
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) Failing after 33s
CI / test-python-backend-compliance (push) Successful in 34s
CI / test-python-document-crawler (push) Successful in 23s
CI / test-python-dsms-gateway (push) Successful in 19s
Jeder Tenant kann jetzt mehrere Compliance-Projekte anlegen (z.B. verschiedene Produkte, Tochterunternehmen). CompanyProfile ist pro Projekt kopierbar und danach unabhaengig editierbar. Multi-Tab-Support via separater BroadcastChannel und localStorage Keys pro Projekt. - Migration 039: compliance_projects Tabelle, sdk_states.project_id - Backend: FastAPI CRUD-Routes fuer Projekte mit Tenant-Isolation - Frontend: ProjectSelector UI, SDKProvider mit projectId, URL ?project= - State API: UPSERT auf (tenant_id, project_id) mit Abwaertskompatibilitaet - Tests: pytest fuer Model-Validierung, Row-Konvertierung, Tenant-Isolation - Docs: MKDocs Seite, CLAUDE.md, Backend README Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
95
backend-compliance/migrations/039_compliance_projects.sql
Normal file
95
backend-compliance/migrations/039_compliance_projects.sql
Normal file
@@ -0,0 +1,95 @@
|
||||
-- Migration 039: Multi-Projekt-Architektur
|
||||
-- Enables multiple compliance projects per tenant (Cloud-Ready Multi-Tenancy)
|
||||
--
|
||||
-- Changes:
|
||||
-- 1. New table compliance_projects (project metadata)
|
||||
-- 2. sdk_states: Drop UNIQUE(tenant_id), add project_id column with FK
|
||||
-- 3. Migrate existing data: Create default project for each existing sdk_states row
|
||||
|
||||
-- =============================================================================
|
||||
-- 1. New table: compliance_projects
|
||||
-- =============================================================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS compliance_projects (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id VARCHAR(255) NOT NULL,
|
||||
name VARCHAR(500) NOT NULL,
|
||||
description TEXT DEFAULT '',
|
||||
customer_type VARCHAR(20) DEFAULT 'new', -- 'new' | 'existing'
|
||||
status VARCHAR(20) DEFAULT 'active', -- 'active' | 'archived' | 'deleted'
|
||||
project_version INTEGER DEFAULT 1,
|
||||
completion_percentage INTEGER DEFAULT 0,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
archived_at TIMESTAMPTZ
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_compliance_projects_tenant ON compliance_projects(tenant_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_compliance_projects_status ON compliance_projects(tenant_id, status);
|
||||
|
||||
-- =============================================================================
|
||||
-- 2. sdk_states: Add project_id, adjust constraints
|
||||
-- =============================================================================
|
||||
|
||||
-- Drop the old UNIQUE constraint on tenant_id (allows multiple states per tenant)
|
||||
ALTER TABLE sdk_states DROP CONSTRAINT IF EXISTS sdk_states_tenant_id_key;
|
||||
|
||||
-- Add project_id column (nullable initially for migration)
|
||||
ALTER TABLE sdk_states ADD COLUMN IF NOT EXISTS project_id UUID;
|
||||
|
||||
-- =============================================================================
|
||||
-- 3. Data migration: Create default projects for existing states
|
||||
-- =============================================================================
|
||||
|
||||
-- For each existing sdk_states row without a project, create a default project
|
||||
INSERT INTO compliance_projects (id, tenant_id, name, customer_type, status)
|
||||
SELECT
|
||||
gen_random_uuid(),
|
||||
s.tenant_id,
|
||||
COALESCE(s.state->'companyProfile'->>'companyName', 'Projekt 1'),
|
||||
COALESCE(s.state->>'customerType', 'new'),
|
||||
'active'
|
||||
FROM sdk_states s
|
||||
WHERE s.project_id IS NULL
|
||||
ON CONFLICT DO NOTHING;
|
||||
|
||||
-- Link existing states to their newly created projects
|
||||
UPDATE sdk_states s
|
||||
SET project_id = p.id
|
||||
FROM compliance_projects p
|
||||
WHERE s.tenant_id = p.tenant_id AND s.project_id IS NULL;
|
||||
|
||||
-- =============================================================================
|
||||
-- 4. Add constraints after migration
|
||||
-- =============================================================================
|
||||
|
||||
-- Make project_id NOT NULL now that all rows have a value
|
||||
-- (Only if there are no NULL values remaining — safe guard)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (SELECT 1 FROM sdk_states WHERE project_id IS NULL) THEN
|
||||
ALTER TABLE sdk_states ALTER COLUMN project_id SET NOT NULL;
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Unique constraint: one state per (tenant, project)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_constraint WHERE conname = 'uq_sdk_states_tenant_project'
|
||||
) THEN
|
||||
ALTER TABLE sdk_states ADD CONSTRAINT uq_sdk_states_tenant_project
|
||||
UNIQUE (tenant_id, project_id);
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Foreign key to compliance_projects
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_constraint WHERE conname = 'fk_sdk_states_project'
|
||||
) THEN
|
||||
ALTER TABLE sdk_states ADD CONSTRAINT fk_sdk_states_project
|
||||
FOREIGN KEY (project_id) REFERENCES compliance_projects(id) ON DELETE CASCADE;
|
||||
END IF;
|
||||
END $$;
|
||||
Reference in New Issue
Block a user