Migration 0052: Bestandsmigration, jeder Workspace genau eine Distro

Liebherrs gepflegter Schulcomputer wird Vorlage je Distro (Kundengruppe
Schule), Liebherr- und Gaissach-Profile zeigen auf die Mint-Variante.
Alter globaler Schulcomputer wird Schulcomputer Basis je Distro fuer die
Bestandsprofile. Gast/fjmfm geloescht, Entwickler bleibt als Entwickler
(Mint) bis nach dem 01.11.2026 (gueltiger Aktivierungszugang).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-07 12:00:58 +02:00
1 parent 08ecec3c80
commit b361579cc6
1 file changed
+134
@@ -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;