← Zurück

🛠️ Technische Dokumentation

Turnierplaner der Fasnet Gilde Markgröningen

v2.8.0 · 2026-05-24 · Generiert: 24.05.2026 14:50

1 · Überblick

EigenschaftWert
FrontendSingle-Page-App in einer HTML-Datei, Vanilla JavaScript
BackendPHP (api.php als Router, auth.php für Authentifizierung)
DatenhaltungJSON-Dateien im Ordner Data/ (kein DBMS)
AuthentifizierungToken-basiert (sessions.json)
SMTPmxe87b.netcup.net:465
Versionv2.8.0 (2026-05-24)
HostingSynology NAS, nginx, Document-Root = web/turnierplaner

2 · Architektur

Browser index.html (SPA) JavaScript + CSS localStorage fetch() PHP-Backend api.php – Router auth.php – Token/Rechte smtp / export / notify r/w JSON Data/ turnierplaner.json users.json config.json sessions / audit Alle Turnier-Anfragen: Browser → fetch(api.php?v=...) → PHP filtert nach Rolle/Gast-Status → JSON zurück Kein DBMS · Kein Framework · Kein CDN (alles lokal) · Server-seitiger Rollen-Filter in der Turnierliste
Abb. 1 – System-Architektur

3 · Dateien auf dem Server

DateiGrößeGeändert
Turnierplaner.html586.4 KB22.05.2026 13:35
api.php44.8 KB24.05.2026 14:50
api_license.php2.5 KB23.05.2026 18:52
api_v1.php105.2 KB22.05.2026 06:58
auth.php24.2 KB24.05.2026 14:50
check_browser.html3.8 KB23.05.2026 22:05
check_permissions.php5.9 KB23.05.2026 22:05
debug_api.php6.5 KB23.05.2026 22:05
deploy.php35.5 KB24.05.2026 02:24
dev_check.php10 KB22.05.2026 13:48
doku.html26.5 KB24.05.2026 02:24
doku_generator.php62.2 KB24.05.2026 14:50
export.php33.2 KB24.05.2026 01:11
export_test.php10 KB22.05.2026 13:48
features.html21.3 KB24.05.2026 02:24
handlers_auth.php23.1 KB24.05.2026 14:50
handlers_contact.php20.4 KB23.05.2026 17:26
handlers_system.php21.3 KB24.05.2026 02:24
handlers_turnier.php5.5 KB23.05.2026 17:26
handlers_users.php18.7 KB24.05.2026 14:50
hilfe.html14.9 KB24.05.2026 14:50
import_vorlage.php19.9 KB24.05.2026 01:11
index.html691.7 KB24.05.2026 14:50
index.php1.7 KB22.05.2026 13:48
index_v1.html613.6 KB22.05.2026 13:48
maintenance.php14.2 KB23.05.2026 22:05
notify.php13.7 KB22.05.2026 13:48
reset_admin.php4 KB22.05.2026 13:48
reset_emergency.php4.4 KB22.05.2026 13:48
smtp.php12.1 KB22.05.2026 13:48
test_backup.html4 KB23.05.2026 22:05
test_suite.php75.7 KB24.05.2026 14:50
test_suite_V1.php26.3 KB22.05.2026 13:35
test_suite_V3.php56.4 KB22.05.2026 06:58
test_suite_v2.php53 KB22.05.2026 13:35
test_update_marker.php0 KB23.05.2026 18:52
test_version.php1 KB22.05.2026 13:35
test_version_1.php1.7 KB22.05.2026 13:35
tools.php7.5 KB23.05.2026 22:05
tpl_head.php1.1 KB23.05.2026 22:05
tpl_toolnav.php3.6 KB23.05.2026 22:05
xlsx.full.min.js861.1 KB22.05.2026 13:35

Daten-Ordner: /home/claude/prod_check/TurnierplanerZip/Data

4 · Datenmodell

⚠️ Ordner heißt Data mit großem D. Alle PHP-Dateien nutzen DATA_DIR = __DIR__ . '/Data'.
DateiInhalt
users.jsonBenutzer (users[]) + Rollen (roles[]). Benutzer referenzieren Rollen via roleIds[]. Rollen enthalten visibleAnmeldestatus für Turniersichtbarkeit.
config.jsonSMTP, Absender, Kontakt-Themen/Empfänger (contactTopics, contactTopicConfig), Gast-Sichtbarkeit (guestTurnierStatus).
turnierplaner.jsonAlle Turniere (turniere[]), App-Einstellungen, Archiv. Wird beim Laden nach Rollen-/Gast-Filter serverseitig gefiltert.
sessions.jsonAktive Token mit Ablaufzeit.
audit.jsonÄnderungsprotokoll (wer, wann, was).
doku_backups/Backups generierter Dokumentationen.
system_backups/App-Sicherungen (je Backup ein Ordner + _manifest.json mit Versions-Tag).

5 · API-Endpunkte

Alle Requests an api.php. GET via ?action=…, POST via Header X-Action. Antwort immer JSON {ok:true|false,…}.

⚠️ Jeder Endpunkt-Block muss mit } geschlossen sein. Ein offener if-Block ohne } verschluckt alle nachfolgenden Endpunkte (→ nginx 404). Test-Suite prüft diesen Fall.
ℹ️ Serverseitiger Turnier-Filter: api.php?v=... filtert Turniere anhand von guestTurnierStatus (Gäste) oder visibleAnmeldestatus der Benutzer-Rollen vor dem Zurückgeben.
MethodeAktion
GETstatus
GETping
GETgetLegal
GETgetLogo
GETupdateBackups
GETloadConfig
GETdiagnose
GETusers
GETaudit
GETgetRoles
GETgetContactData
GETgetFunktionen
GETgetMailTemplates
GETgetBackupLog
GETupdate
GETrollback
GETdeleteUpdateBackup

6 · Authentifizierung

au_verifyToken() prüft das Token in dieser Reihenfolge:

  1. PHP-Session ($_SESSION['tpl_token'])
  2. Header X-Token
  3. Header Authorization: Bearer …
  4. Cookie tpl_token
  5. POST-Body-Feld _token

Token werden in sessions.json gespeichert. Frontend legt Token in localStorage + Cookie ab (beide mit try/catch für Safari Private Mode).

ℹ️ api.php sendet Cache-Control: no-cache, no-store, must-revalidate — verhindert Browser-Caching bei status- und Daten-Requests.

7 · Berechtigungen

Definiert als PERMISSIONS-Konstante in auth.php. au_hasPermission() prüft alle Rollen des Users; role-admin mit isAdmin=true hat Vollzugriff.

SchlüsselBezeichnung
turniere.viewTurniere anzeigen (Übersicht)
turniere.createTurnier anlegen
turniere.edit.basisBasisinformationen bearbeiten
turniere.edit.ortVeranstaltungsort bearbeiten
turniere.edit.katKategorie & Anmeldung bearbeiten
turniere.edit.fristenTermine & Fristen bearbeiten
turniere.edit.gardeGarde & Solisten bearbeiten
turniere.edit.zusatzZusatzinformationen bearbeiten
turniere.edit.ergebnisseErgebnisse & Platzierungen bearbeiten
turniere.deleteTurnier löschen
ergebnisse.erfassenErgebnisse & Platzierungen erfassen
saison.abschliessenSaison / Kampagne abschließen
importExcel-Import durchführen
einstellungenEinstellungen verwalten (alle — Rückwärtskompatibilität)
einstellungen.designDesign & Erscheinungsbild ändern
einstellungen.gastGast-Sichtbarkeit konfigurieren
einstellungen.turnierTurnier-Einstellungen (Kategorien, Garde, Typen, Solisten)
kampagne.editKampagne-Name ändern
verein.name.addVereinsname anlegen
verein.name.changeVereinsname ändern
verein.name.deleteVereinsname löschen / zurücksetzen
verein.name.editVereinsname ändern (Sammelrecht)
verein.logo.addVereinslogo hochladen
verein.logo.changeVereinslogo austauschen
verein.logo.deleteVereinslogo löschen / zurücksetzen
verein.logo.uploadVereinslogo hochladen / austauschen (Sammelrecht)
verein.logo.resetVereinslogo zurücksetzen auf Standard
system.logoVereinslogo verwalten (Rückwärtskompatibilität)
system.licenseLizenz verwalten & aktivieren
users.manageBenutzer & Rollen verwalten (Sammelrecht)
users.createBenutzer anlegen
users.editBenutzer bearbeiten
users.deleteBenutzer löschen
users.resetpwPasswort-Reset-Link an Benutzer senden
users.forcepasswordBenutzer zum Passwort-Wechsel beim nächsten Login zwingen
roles.createRollen anlegen
roles.editRollen bearbeiten
roles.deleteRollen löschen
users.reportBenutzer-Auswertung anzeigen & exportieren
bezeichnung.editBezeichnung (Kampagne/Saison) bearbeiten
bezeichnung.changeBezeichnung umbenennen (Label ändern)
bezeichnung.deleteBezeichnung zurücksetzen
users.exportBenutzerdaten exportieren (JSON)
users.importBenutzerdaten importieren (JSON)
passwortrichtliniePasswort-Richtlinie verwalten
funktionen.manageFunktionen verwalten (hinzufügen / löschen)
funktionen.approveNeue Funktionen von Registrierungen genehmigen
audit.viewÄnderungsprotokoll anzeigen
audit.deleteÄnderungsprotokoll löschen
audit.exportÄnderungsprotokoll exportieren
audit.archiveÄnderungsprotokoll archivieren
backup.createSicherung erstellen / herunterladen
backup.restoreSicherung einspielen / wiederherstellen
backup.scheduleAutomatisches Backup konfigurieren
mails.smtpE-Mail / SMTP-Einstellungen ändern
mails.editE-Mail-Vorlagen bearbeiten
mails.sendE-Mails manuell versenden (Test & Benachrichtigung)
kontakt.viewKontaktformular-Einsendungen einsehen
kontakt.manageKontaktformular Themen & Empfänger verwalten
themen.addKontakt-Themen hinzufügen (Rückwärtskompatibilität)
themen.editKontakt-Themen bearbeiten (Rückwärtskompatibilität)
themen.deleteKontakt-Themen löschen (Rückwärtskompatibilität)
system.updateSystem-Update einspielen
system.diagnoseDiagnose- & Test-Werkzeuge benutzen
system.wartungWartung & Speicher-Bereinigung ausführen
cleanup.executeDaten-Aufräum-Tool benutzen (Rückwärtskompatibilität)
berichte.viewBerichte & Statistiken anzeigen
berichte.exportBerichte & Statistiken exportieren
doku.hilfe.viewAnwender-Hilfe anzeigen / öffnen
doku.hilfe.createAnwender-Hilfe neu generieren
doku.hilfe.backupAnwender-Hilfe Backup erstellen / einspielen
doku.hilfe.deleteAnwender-Hilfe Backup löschen
doku.technisch.viewTechnische Dokumentation anzeigen / öffnen
doku.technisch.createTechnische Dokumentation neu generieren
doku.technisch.backupTechnische Dokumentation Backup erstellen / einspielen
doku.technisch.deleteTechnische Dokumentation Backup löschen
doku.features.viewFeature-Übersicht anzeigen / öffnen
doku.features.createFeature-Übersicht neu generieren
doku.features.backupFeature-Übersicht Backup erstellen / einspielen
doku.features.deleteFeature-Übersicht Backup löschen

8 · Kontaktformular

sendContact liegt vor dem Auth-Gate → öffentlich für Gäste. Einstellungen erfordern einstellungen-Berechtigung.

Themenspezifische Empfänger in config.json unter contactTopicConfig: {"Thema":{"roles":[...],"emails":"a;b"}}. Fallback: globale contactNotifyRoles/contactExtraEmails.

9 · Datensicherung

Manifest (_manifest.json) enthält seit v2.0.0 auch appVersion und appBuild — sichtbar im Backup-Protokoll als blaues Badge.

10 · Deployment

  • Server: Synology NAS, nginx, Document-Root = web/turnierplaner
  • Dateien direkt per File Station hochladen
  • Nach Upload: Strg+Umschalt+R
  • Update-ZIP: genau eine Ordnerebene als Prefix (TurnierplanerZip/datei)