Syntax Saga: neues Spiel (server-autoritativ) + 34 Seed-Missionen

Drittes Mindflux-Spiel: interaktive IT-Geschichten, in denen man den
fehlenden Code (Schlüsselwörter, Operatoren, ganze Zeilen) in eine kleine
Story tippt. Freitext-Eingabe, drei wählbare Stufen (Junior/Professional/
Senior), mehrere Lücken je Codeblock und mehrere gültige Antworten je Lücke
(optional case-insensitive). Prüfung und Score ausschließlich serverseitig –
die Lösungen verlassen nie das Backend (Anti-Cheat wie TechTacular/MindMatch).
Fehler-Mechanik: bis zu 3 Versuche mit Hinweis, dann Auflösung; kein Game-Over.

Inhalte DB-gestützt und im Admin pflegbar (/admin/syntaxsaga); 34 Seed-
Missionen (Java/SQL/Bash/Git/HTML/Python) aus syntaxsaga/content.json.

- Entities SyntaxSagaMission/Gap/Solution + Flyway V7__syntax_saga.sql
- SyntaxSagaService (Story ohne Lösung / serverseitige Prüfung / Score-Recompute)
- API /api/syntaxsaga (CSRF-ausgenommen) + Admin-CRUD
- Frontend syntaxsaga.html/js/css (Prefix ss-, theme.css-Tokens)
- Dashboard-Kachel aktiv (vorher "coming soon")

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
AliceDarkest
2026-06-30 12:13:37 +02:00
parent bbe24c67eb
commit 4599dd12b8
28 changed files with 2749 additions and 2 deletions
@@ -0,0 +1,38 @@
-- Syntax Saga: interaktive IT-Geschichten mit Code-Lücken (Junior/Professional/Senior).
-- Mission -> Lücken (eine oder mehrere je Codeblock) -> Lösungen (eine Lücke kann mehrere
-- gültige Antworten haben). Inhalte DB-basiert und Admin-pflegbar; gefüllt per Seeder
-- aus syntaxsaga/content.json. Server-autoritativ: Lösungen verlassen nie das Backend.
CREATE TABLE syntax_saga_missions (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
slug VARCHAR(150) NOT NULL UNIQUE,
title VARCHAR(200) NOT NULL,
difficulty VARCHAR(30) NOT NULL,
narrative VARCHAR(2000) NOT NULL,
dialog VARCHAR(1000),
code_language VARCHAR(30),
code_template VARCHAR(2000) NOT NULL,
success_text VARCHAR(2000),
sort_order INT NOT NULL DEFAULT 0,
active BOOLEAN NOT NULL DEFAULT TRUE
);
CREATE TABLE syntax_saga_gaps (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
mission_id BIGINT NOT NULL REFERENCES syntax_saga_missions (id) ON DELETE CASCADE,
gap_position INT NOT NULL,
points INT NOT NULL DEFAULT 100,
case_sensitive BOOLEAN NOT NULL DEFAULT TRUE,
hint VARCHAR(500),
placeholder VARCHAR(120)
);
CREATE TABLE syntax_saga_solutions (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
gap_id BIGINT NOT NULL REFERENCES syntax_saga_gaps (id) ON DELETE CASCADE,
solution_text VARCHAR(500) NOT NULL,
sort_order INT NOT NULL DEFAULT 0
);
CREATE INDEX idx_syntax_saga_gaps_mission ON syntax_saga_gaps (mission_id);
CREATE INDEX idx_syntax_saga_solutions_gap ON syntax_saga_solutions (gap_id);