Weiter am Ingame Chastity Game gearbeitet
Some checks failed
Host-Based Deploy (Java 21 Fix) / build-and-run (push) Has been cancelled

This commit is contained in:
2026-04-26 22:53:05 +02:00
parent 4f2048bdc8
commit 0aa794600e
44 changed files with 2156 additions and 1419 deletions

View File

@@ -0,0 +1,215 @@
-- 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;