Files
xxx-sphere-web/bin/main/db/migration/V3__migrate_chastity_game_set.sql
Mario 0aa794600e
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled
Weiter am Ingame Chastity Game gearbeitet
2026-04-26 22:53:05 +02:00

216 lines
10 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- Migration: Inhalte aus chastity_game_set in die normalen Aufgabengruppen-Tabellen übernehmen.
--
-- Jedes chastity_game_set eines Users wird zu einer privaten CHASTITY_ONLY-Aufgabengruppe:
-- aufgaben (JSON) → aufgabe + aufgabe_benoetigt_passiv
-- zeitstrafen (JSON) → sperre + sperre_sperre_fuer
-- finisher (JSON) → finisher
--
-- Die Prozedur prüft zuerst, ob chastity_game_set existiert auf leeren Datenbanken
-- ist sie dadurch ein No-op.
DROP PROCEDURE IF EXISTS proc_migrate_chastity_game_set;
CREATE PROCEDURE proc_migrate_chastity_game_set()
BEGIN
DECLARE v_set_id VARCHAR(36);
DECLARE v_owner_id VARCHAR(36);
DECLARE v_set_name VARCHAR(255);
DECLARE v_user_name VARCHAR(255);
DECLARE v_aufgaben_json TEXT;
DECLARE v_zeitstr_json TEXT;
DECLARE v_finisher_json TEXT;
DECLARE v_gruppe_id VARCHAR(36);
DECLARE v_aufgabe_id VARCHAR(36);
DECLARE v_sperre_id VARCHAR(36);
DECLARE v_finisher_id VARCHAR(36);
DECLARE v_outer_count INT;
DECLARE v_inner_count INT;
DECLARE i INT;
DECLARE j INT;
DECLARE tbl_exists INT DEFAULT 0;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR
SELECT id, owner_id, name, aufgaben, zeitstrafen, finisher
FROM chastity_game_set;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
-- Add columns that may not yet exist (Hibernate ddl-auto runs after Flyway)
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'aufgabe' AND COLUMN_NAME = 'level') THEN
ALTER TABLE aufgabe ADD COLUMN level INT NULL;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sperre' AND COLUMN_NAME = 'level') THEN
ALTER TABLE sperre ADD COLUMN level INT NULL;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sperre' AND COLUMN_NAME = 'temp_unlock_before_required') THEN
ALTER TABLE sperre ADD COLUMN temp_unlock_before_required TINYINT(1) NULL;
END IF;
IF NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sperre' AND COLUMN_NAME = 'temp_unlock_after_required') THEN
ALTER TABLE sperre ADD COLUMN temp_unlock_after_required TINYINT(1) NULL;
END IF;
SELECT COUNT(*) INTO tbl_exists
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'chastity_game_set';
IF tbl_exists > 0 THEN
OPEN cur;
set_loop: LOOP
FETCH cur INTO v_set_id, v_owner_id, v_set_name,
v_aufgaben_json, v_zeitstr_json, v_finisher_json;
IF done THEN LEAVE set_loop; END IF;
SELECT name INTO v_user_name
FROM user
WHERE user_id = v_owner_id
LIMIT 1;
SET v_gruppe_id = UUID();
-- ── Aufgabengruppe anlegen ───────────────────────────────────────
INSERT INTO aufgaben_gruppe
(gruppen_id, name, beschreibung, user_id, private_gruppe, bild, von, available_in)
VALUES
(v_gruppe_id,
v_set_name,
'Importiert aus Chastity Game Set',
v_owner_id,
TRUE,
NULL,
v_user_name,
'CHASTITY_ONLY');
-- ── Aufgaben ────────────────────────────────────────────────────
-- GameSetAufgabe.minutes → sekunden_von / sekunden_bis (× 60)
-- GameSetAufgabe.benoetigt → aufgabe_benoetigt_passiv
SET v_outer_count = IFNULL(JSON_LENGTH(v_aufgaben_json), 0);
SET i = 0;
WHILE i < v_outer_count DO
SET v_aufgabe_id = UUID();
INSERT INTO aufgabe
(aufgabe_id, kurz_text, text, level, sekunden_von, sekunden_bis, gruppe_id)
VALUES (
v_aufgabe_id,
JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].title'))),
JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].description'))),
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].level'))), 'null') AS SIGNED),
CASE
WHEN JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes')) IS NOT NULL
THEN CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes'))), 'null') AS SIGNED) * 60
ELSE NULL
END,
CASE
WHEN JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes')) IS NOT NULL
THEN CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].minutes'))), 'null') AS SIGNED) * 60
ELSE NULL
END,
v_gruppe_id
);
SET v_inner_count = IFNULL(
JSON_LENGTH(JSON_EXTRACT(v_aufgaben_json, CONCAT('$[', i, '].benoetigt'))),
0);
SET j = 0;
WHILE j < v_inner_count DO
SET @wz = NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_aufgaben_json,
CONCAT('$[', i, '].benoetigt[', j, ']'))), 'null');
IF @wz IS NOT NULL AND @wz != '' THEN
INSERT IGNORE INTO aufgabe_benoetigt_passiv (aufgabe_id, werkzeug)
VALUES (v_aufgabe_id, @wz);
END IF;
SET j = j + 1;
END WHILE;
SET i = i + 1;
END WHILE;
-- ── Zeitstrafen → Sperren ────────────────────────────────────────
-- GameSetZeitstrafe.minMinutes / maxMinutes → minuten_von / minuten_bis
-- GameSetZeitstrafe.level / tempUnlock* → level / temp_unlock_before/after_required
-- GameSetZeitstrafe.sperrt → sperre_sperre_fuer
SET v_outer_count = IFNULL(JSON_LENGTH(v_zeitstr_json), 0);
SET i = 0;
WHILE i < v_outer_count DO
SET v_sperre_id = UUID();
INSERT INTO sperre
(sperre_id, kurz_text, text, release_text, minuten_von, minuten_bis,
level, temp_unlock_before_required, temp_unlock_after_required, gruppe_id)
VALUES (
v_sperre_id,
JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].title'))),
JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].description'))),
IF(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].releaseText')) IS NOT NULL,
JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].releaseText'))),
NULL),
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].minMinutes'))), 'null') AS SIGNED),
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].maxMinutes'))), 'null') AS SIGNED),
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].level'))), 'null') AS SIGNED),
CASE JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].tempUnlockBeforeRequired')))
WHEN 'true' THEN 1 WHEN 'false' THEN 0 ELSE NULL END,
CASE JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].tempUnlockAfterRequired')))
WHEN 'true' THEN 1 WHEN 'false' THEN 0 ELSE NULL END,
v_gruppe_id
);
SET v_inner_count = IFNULL(
JSON_LENGTH(JSON_EXTRACT(v_zeitstr_json, CONCAT('$[', i, '].sperrt'))),
0);
SET j = 0;
WHILE j < v_inner_count DO
SET @wz = NULLIF(JSON_UNQUOTE(JSON_EXTRACT(v_zeitstr_json,
CONCAT('$[', i, '].sperrt[', j, ']'))), 'null');
IF @wz IS NOT NULL AND @wz != '' THEN
INSERT IGNORE INTO sperre_sperre_fuer (sperre_id, werkzeug)
VALUES (v_sperre_id, @wz);
END IF;
SET j = j + 1;
END WHILE;
SET i = i + 1;
END WHILE;
-- ── Finisher ─────────────────────────────────────────────────────
-- GameSetFinisher hat kein geschlecht und keine benoetigt-Listen
-- tempUnlockBeforeRequired / tempUnlockAfterRequired haben kein Gegenstück in finisher
SET v_outer_count = IFNULL(JSON_LENGTH(v_finisher_json), 0);
SET i = 0;
WHILE i < v_outer_count DO
SET v_finisher_id = UUID();
INSERT INTO finisher
(finisher_id, kurz_text, text, geschlecht, gruppe_id)
VALUES (
v_finisher_id,
JSON_UNQUOTE(JSON_EXTRACT(v_finisher_json, CONCAT('$[', i, '].title'))),
JSON_UNQUOTE(JSON_EXTRACT(v_finisher_json, CONCAT('$[', i, '].description'))),
NULL,
v_gruppe_id
);
SET i = i + 1;
END WHILE;
END LOOP;
CLOSE cur;
END IF;
END;
CALL proc_migrate_chastity_game_set();
DROP PROCEDURE IF EXISTS proc_migrate_chastity_game_set;