diff --git a/migrations/0052_bestandsmigration_workspaces_je_distro.sql b/migrations/0052_bestandsmigration_workspaces_je_distro.sql new file mode 100644 index 0000000..5039d94 --- /dev/null +++ b/migrations/0052_bestandsmigration_workspaces_je_distro.sql @@ -0,0 +1,134 @@ +BEGIN; + +-- Bestandsmigration zu Schritt C (Nutzer-Entscheidungen 07.10.2026, siehe +-- platform-docs/roadmap/workspace-creator-neu.md und ADR-0038): +-- jeder Workspace bekommt genau eine Distro. +-- +-- 1. Liebherrs gepflegter Stand "Schulcomputer (eigene Kopie)" wird Inhalt +-- der neuen Vorlagen "Schulcomputer (Mint/Debian/Ubuntu)" (Kundengruppe +-- Schule). Liebherrs Profile und das Profil von MS Gaißach zeigen auf die +-- Mint-Variante; die Kopie selbst entfällt. +-- 2. Der bisherige globale "Schulcomputer" (3 Merkmale) wird zu +-- "Schulcomputer Basis" je Distro, ohne Vorlagen-Kennzeichen - nur noch für +-- die Bestandsprofile (Default Lab, WLAN-Test), deren Soll-Zustand gleich +-- bleibt. +-- 3. "Gast" und "fjmfm" (Liebherr, unbenutzt) werden gelöscht. +-- 4. "Entwickler" bleibt bis nach dem 01.11.2026 als "Entwickler (Mint)" +-- stehen (gültiger Aktivierungszugang am Profil +-- "Tuxflotte-Mint-Entwicklung-v0.1"), danach samt Profilen löschen. + +DO $$ +DECLARE + b_mint UUID := (SELECT id FROM backends WHERE key = 'mint-image'); + b_debian UUID := (SELECT id FROM backends WHERE key = 'debian-image'); + b_ubuntu UUID := (SELECT id FROM backends WHERE key = 'ubuntu-image'); + kg_schule UUID := (SELECT id FROM kundengruppen WHERE key = 'schule'); + alt_basis UUID := '44444444-4444-4444-8444-444444444444'; + liebherr_kopie UUID := '842459c3-572a-4389-8ffc-8b598b623bf1'; + liebherr_kopie_v UUID; + alt_basis_v UUID; + ziel RECORD; + neu_ws UUID; + neu_v UUID; + schulcomputer_mint UUID; +BEGIN + IF b_mint IS NULL OR b_debian IS NULL OR b_ubuntu IS NULL OR kg_schule IS NULL THEN + RAISE EXCEPTION 'Distros oder Kundengruppe fehlen'; + END IF; + + SELECT id INTO liebherr_kopie_v FROM workspace_versionen + WHERE workspace_id = liebherr_kopie AND status = 'veroeffentlicht' ORDER BY nummer DESC LIMIT 1; + SELECT id INTO alt_basis_v FROM workspace_versionen + WHERE workspace_id = alt_basis AND status = 'veroeffentlicht' ORDER BY nummer DESC LIMIT 1; + IF liebherr_kopie_v IS NULL OR alt_basis_v IS NULL THEN + RAISE EXCEPTION 'Quell-Workspaces nicht gefunden'; + END IF; + + -- 1. Neue Vorlagen je Distro aus Liebherrs Stand + FOR ziel IN SELECT * FROM (VALUES + ('schulcomputer-mint', 'Schulcomputer (Mint)', b_mint), + ('schulcomputer-debian', 'Schulcomputer (Debian)', b_debian), + ('schulcomputer-ubuntu', 'Schulcomputer (Ubuntu)', b_ubuntu) + ) AS t(key, name, backend_id) + LOOP + neu_ws := gen_random_uuid(); + neu_v := gen_random_uuid(); + INSERT INTO workspaces (id, organization_id, key, name, description, backend_id, ist_vorlage, sichtbarkeit) + SELECT neu_ws, NULL, ziel.key, ziel.name, w.description, ziel.backend_id, TRUE, 'kundengruppe' + FROM workspaces w WHERE w.id = liebherr_kopie; + INSERT INTO workspace_freigabe_kundengruppen (workspace_id, kundengruppe_id) VALUES (neu_ws, kg_schule); + INSERT INTO workspace_versionen (id, workspace_id, nummer, status, notiz, veroeffentlicht_am) + VALUES (neu_v, neu_ws, 1, 'veroeffentlicht', + 'Übernommen aus Liebherr „Schulcomputer (eigene Kopie)“ (Migration 0052)', now()); + INSERT INTO workspace_version_merkmale (workspace_version_id, merkmal_id) + SELECT neu_v, merkmal_id FROM workspace_version_merkmale WHERE workspace_version_id = liebherr_kopie_v; + -- Webapps kopieren, Icon-Datei wird geteilt (siehe delete_webapp()). + INSERT INTO workspace_webapps (id, workspace_id, workspace_version_id, name, url, icon_filename, + icon_content_type, sort_order, template_id, kategorie_id, kiosk_modus) + SELECT gen_random_uuid(), neu_ws, neu_v, name, url, icon_filename, icon_content_type, sort_order, + template_id, kategorie_id, kiosk_modus + FROM workspace_webapps WHERE workspace_version_id = liebherr_kopie_v; + IF ziel.backend_id = b_mint THEN + schulcomputer_mint := neu_ws; + END IF; + END LOOP; + + -- Liebherr-Profile und MS Gaißach auf die neue Mint-Vorlage + UPDATE bereitstellungsvorlagen SET workspace_id = schulcomputer_mint, updated_at = now() + WHERE workspace_id = liebherr_kopie; + UPDATE bereitstellungsvorlagen SET workspace_id = schulcomputer_mint, updated_at = now() + WHERE organization_id = (SELECT id FROM organizations WHERE name = 'MS Gaißach') + AND workspace_id = alt_basis; + + DELETE FROM workspaces WHERE id = liebherr_kopie; + + -- 2. Alter globaler Schulcomputer -> "Schulcomputer Basis" je Distro + UPDATE workspaces + SET name = 'Schulcomputer Basis (Mint)', key = 'schulcomputer-basis-mint', backend_id = b_mint, + ist_vorlage = FALSE, updated_at = now() + WHERE id = alt_basis; + + FOR ziel IN SELECT * FROM (VALUES + ('schulcomputer-basis-debian', 'Schulcomputer Basis (Debian)', b_debian), + ('schulcomputer-basis-ubuntu', 'Schulcomputer Basis (Ubuntu)', b_ubuntu) + ) AS t(key, name, backend_id) + LOOP + neu_ws := gen_random_uuid(); + neu_v := gen_random_uuid(); + INSERT INTO workspaces (id, organization_id, key, name, description, backend_id, ist_vorlage, sichtbarkeit) + SELECT neu_ws, NULL, ziel.key, ziel.name, w.description, ziel.backend_id, FALSE, 'global' + FROM workspaces w WHERE w.id = alt_basis; + INSERT INTO workspace_versionen (id, workspace_id, nummer, status, notiz, veroeffentlicht_am) + VALUES (neu_v, neu_ws, 1, 'veroeffentlicht', 'Aufgeteilt aus „Schulcomputer“ (Migration 0052)', now()); + INSERT INTO workspace_version_merkmale (workspace_version_id, merkmal_id) + SELECT neu_v, merkmal_id FROM workspace_version_merkmale WHERE workspace_version_id = alt_basis_v; + INSERT INTO workspace_webapps (id, workspace_id, workspace_version_id, name, url, icon_filename, + icon_content_type, sort_order, template_id, kategorie_id, kiosk_modus) + SELECT gen_random_uuid(), neu_ws, neu_v, name, url, icon_filename, icon_content_type, sort_order, + template_id, kategorie_id, kiosk_modus + FROM workspace_webapps WHERE workspace_version_id = alt_basis_v; + UPDATE bereitstellungsvorlagen SET workspace_id = neu_ws, updated_at = now() + WHERE workspace_id = alt_basis AND backend_id = ziel.backend_id; + END LOOP; + + -- 3. Unbenutzte Liebherr-Reste + DELETE FROM workspaces WHERE id IN ('5ac88c5f-2917-4956-a9a4-65b516631a40', 'c13c1991-b00b-45ce-8337-449050110065'); + + -- 4. Entwickler bis zum Löschen nach dem 01.11.2026 + UPDATE workspaces + SET name = 'Entwickler (Mint)', backend_id = b_mint, ist_vorlage = FALSE, updated_at = now() + WHERE id = '55555555-5555-4555-8555-555555555555'; + + -- Kontrolle: jedes Profil zeigt auf einen Workspace seiner Distro + -- (Ausnahme: die abgelaufenen Debian-/Ubuntu-Entwicklungs-Profile bis zur + -- Löschung von "Entwickler"). + IF EXISTS ( + SELECT 1 FROM bereitstellungsvorlagen bv JOIN workspaces w ON w.id = bv.workspace_id + WHERE w.backend_id IS DISTINCT FROM bv.backend_id + AND w.id <> '55555555-5555-4555-8555-555555555555' + ) THEN + RAISE EXCEPTION 'Profil zeigt auf Workspace einer anderen Distro'; + END IF; +END $$; + +COMMIT;