3 Entscheidungen und Historie
Ralf Warmuth edited this page 2026-01-09 22:32:38 +01:00
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.

Entscheidungen & Historie (langlebiges Wissen)

Ziel dieser Seite: die wichtigen, dauerhaften Änderungen/Entscheidungen festhalten (Warum? Wo im Code?). Keine Tasklisten nur Dinge, die man in 6 Monaten noch wissen will.

1) Build-Output als deploybares public/

  • Entscheidung: Deployt wird ausschließlich der Build-Output public/.
  • Warum: Saubere Trennung zwischen Quellstruktur (content/static/zgb-backend) und Laufzeitstruktur.
  • Wo: zgb_www/scripts/build.mjs (kopiert Content/Assets/PHP/Backend/Data).
  • Detail: Das Build-Script stellt außerdem sicher, dass public/data/.htaccess existiert, um direkten HTTP-Zugriff auf DB/Logs zu blocken.

2) Anmeldung: Nummernvergabe atomar erst beim POST

  • Problem: Nummern “reservieren” beim Formular-Rendern ist race-anfällig (GET→POST Zeitfenster).
  • Entscheidung: Nummer wird erst beim POST vergeben, und zwar atomar in einer SQLite-Schreib-Transaktion (BEGIN IMMEDIATE).
  • Warum: Parallelitätssicherheit unter Last; verhindert doppelte Nummern ohne fragile Hidden-Field-Reservierung.
  • Wo: zgb_www/static/registration/index.php (Nummernvergabe + Duplicate-Check im TX-Kontext).

3) Mailversand: asynchrone Mail-Queue + Rate-Limit

  • Problem: Provider-Limits (z.B. 60 Mails/Stunde) → synchroner Versand blockiert/fehlschlägt bei Last.
  • Entscheidung: Registrierung enqueued Mails; Versand läuft asynchron über Cron-Worker mit Rate-Limit.
  • Warum:
    • Registrierung darf nicht am Mailversand scheitern
    • kontrollierter Durchsatz, Retry/Backoff, weniger Lastspitzen
  • Wo:
    • Enqueue nach erfolgreichem Save: zgb_www/static/registration/index.php
    • Worker: zgb_www/zgb-backend/Service/MailQueueWorker.php
    • Cron entry (CLI-only): zgb_www/zgb-backend/cron/send_mail_queue.php
    • Queue-DB: zgb_www/zgb-backend/Repository/MailQueueRepository.php + Schema .../Schema/MailQueue/initMailQueueSchema.sql
  • Konfig-Keys:
    • mailQueueEnabled, mailMaxPerHour, mailRedirectToSchumbi
    • intern: mailTokens, mailLastRefill
  • Retention: Erfolgreich gesendete Jobs werden gelöscht (“Option A”).

4) CSRF-Fixes: Rotation/Checks korrekt im Admin

  • Entscheidung: CSRF-Token werden nur dann rotiert, wenn der Browser anschließend eine neue Seite/Redirect bekommt; Downloads rotieren nicht.
  • Warum: Token-Rotation bei Downloads führt zu “stale token” ohne Reload.
  • Wo:
    • CSRF-Basis: zgb_www/zgb-backend/Service/CSRFService.php
    • Export: zgb_www/zgb-backend/web/export_registrations.php (keine Rotation beim CSV-Download)
    • Logout: zgb_www/zgb-backend/web/admin_logout.php (CSRF-Check)
    • Analyse: zgb_www/docs/CSRF-ANALYSIS.md

5) SQLite-Performance: Connection-Pooling + PRAGMAs + SQL/Config-Caches

  • Entscheidung: Eine wiederverwendbare PDO-Verbindung pro DB-Pfad + Performance-PRAGMAs; SQL-Dateien und Config werden gecacht.
  • Warum: SQLite profitiert stark von weniger Connection-Overhead; PRAGMAs verbessern Durchsatz; Caches reduzieren I/O/Queries.
  • Wo:
    • PDO Pool + PRAGMAs + SQL-Cache: zgb_www/zgb-backend/Repository/Repository.php
    • Config Cache (TTL): zgb_www/zgb-backend/Repository/ConfigRepository.php

6) Admin-UI: Tabs + Live-Status für Mail-Queue

  • Entscheidung: Admin-Seite als Tab-UI (Konfig / Admin&Export / Mail-Queue) mit Live-Polling.
  • Warum: Einfache Bedienung + schneller Überblick (pending/sending/failed).
  • Wo:
    • UI + Polling: zgb_www/zgb-backend/web/admin.php
    • JSON Endpoint: zgb_www/zgb-backend/web/admin_queue_status.php