Files
SDSStundenerfassung/.cursor/plans/mysql-integration_mit_admin-konfiguration_20cdec3c.plan.md
2026-02-02 19:12:40 +01:00

5.2 KiB

name, overview, todos
name overview todos
MySQL-Integration mit Admin-Konfiguration Erweitere das System um MySQL-Unterstützung mit einer Admin-Oberfläche zur Konfiguration. Die Datenbank wird in einer Konfigurationsdatei gespeichert und kann im Admin-Bereich geändert werden (erfordert Server-Neustart).

MySQL/MariaDB-Integration mit Admin-Konfiguration

Übersicht

Erweitere das System um MySQL/MariaDB-Unterstützung neben SQLite3. Die Datenbank-Konfiguration wird in einer Konfigurationsdatei gespeichert und kann im Admin-Bereich verwaltet werden. Ein Wechsel erfordert einen Server-Neustart.

Hinweis: MariaDB ist vollständig MySQL-kompatibel und funktioniert mit derselben Schnittstelle (mysql2 Package).

Architektur

Datenbank-Abstraktionsschicht

Erstelle eine Abstraktionsschicht, die sowohl SQLite als auch MySQL unterstützt:

  1. Neue Datei: database/db-adapter.js

    • Abstrahiert db.get(), db.run(), db.all() für beide Datenbanken
    • Promise-basierte API (für bessere Kompatibilität)
    • Automatische Fehlerbehandlung
    • SQL-Dialekt-Anpassung (z.B. AUTOINCREMENT vs AUTO_INCREMENT)
  2. Neue Datei: database/sqlite-adapter.js

    • SQLite-spezifische Implementierung
    • Wrapper um sqlite3
  3. Neue Datei: database/mysql-adapter.js

    • MySQL/MariaDB-spezifische Implementierung
    • Verwendet mysql2 Package (funktioniert mit MySQL und MariaDB)
  4. Anpassung: database.js

    • Lädt Konfiguration aus config/database.json
    • Initialisiert entsprechenden Adapter
    • Behält initDatabase() Funktion bei

Konfigurationsdatei

Neue Datei: config/database.json

{
  "type": "sqlite",
  "sqlite": {
    "path": "./stundenerfassung.db"
  },
  "mysql": {
    "host": "localhost",
    "port": 3306,
    "user": "root",
    "password": "",
    "database": "stundenerfassung",
    "charset": "utf8mb4"
  }
}

Admin-Interface

Anpassung: routes/admin.js

  • Neue Route /admin/database/config (GET/PUT)
  • Zeigt aktuelle Datenbank-Konfiguration
  • Formular zum Ändern der Datenbank-Einstellungen
  • Warnung bei Wechsel (Server-Neustart erforderlich)

Anpassung: views/admin.ejs

  • Neuer Abschnitt "Datenbank-Konfiguration"
  • Formular für SQLite/MySQL/MariaDB-Auswahl
  • Eingabefelder für MySQL/MariaDB-Verbindungsdaten
  • Test-Verbindung Button
  • Warnung bei Änderungen
  • Hinweis: MariaDB funktioniert mit MySQL-Konfiguration

SQL-Anpassungen

Unterschiede zwischen SQLite und MySQL:

  • INTEGER PRIMARY KEY AUTOINCREMENTINT AUTO_INCREMENT PRIMARY KEY
  • TEXTVARCHAR(255) oder TEXT
  • REALDOUBLE oder DECIMAL
  • TEXT (unbegrenzt) → TEXT oder LONGTEXT
  • DATETIME DEFAULT CURRENT_TIMESTAMPDATETIME DEFAULT CURRENT_TIMESTAMP (gleich)
  • INSERT OR IGNOREINSERT IGNORE
  • COLLATE NOCASECOLLATE utf8mb4_general_ci (für case-insensitive)
  • Foreign Keys müssen in MySQL explizit aktiviert werden

Anpassung: database.js - initDatabase()

  • SQL-Generierung basierend auf Datenbanktyp
  • Separate CREATE TABLE Statements für SQLite und MySQL
  • Migrationen anpassen (ALTER TABLE Syntax)

Package-Abhängigkeiten

Anpassung: package.json

  • mysql2 hinzufügen (bessere Promise-Unterstützung als mysql, funktioniert mit MySQL und MariaDB)

Services und Routes

Alle Dateien, die db verwenden, müssen angepasst werden:

  • routes/*.js (7 Dateien)
  • services/*.js (5 Dateien)
  • checkin-server.js

Änderungen:

  • Promise-basierte Queries verwenden (statt Callbacks)
  • Oder: Callback-Wrapper in Adapter

Initialisierung

Anpassung: server.js

  • Prüft ob config/database.json existiert
  • Erstellt Standard-Konfiguration falls nicht vorhanden
  • Initialisiert Datenbank entsprechend Konfiguration

Implementierungsschritte

  1. Datenbank-Abstraktionsschicht erstellen

    • database/db-adapter.js - Interface
    • database/sqlite-adapter.js - SQLite-Implementierung
    • database/mysql-adapter.js - MySQL-Implementierung
  2. Konfigurationssystem

    • config/database.json Template
    • Konfigurations-Loader in database.js
  3. SQL-Anpassungen

    • initDatabase() für beide Datenbanken anpassen
    • SQL-Dialekt-Unterschiede behandeln
  4. Admin-Interface

    • Route für Datenbank-Konfiguration
    • View mit Konfigurationsformular
    • Test-Verbindung Funktion
  5. Alle Queries anpassen

    • Callbacks zu Promises oder Callback-Wrapper
    • SQLite-spezifische Syntax entfernen (z.B. COLLATE NOCASE)
  6. Dokumentation

    • README.md aktualisieren
    • Konfigurationsanleitung

Technische Details

  • MySQL/MariaDB-Package: mysql2 (bessere Promise-Unterstützung, funktioniert mit beiden)
  • Kompatibilität: MariaDB ist vollständig MySQL-kompatibel, verwendet dieselbe Konfiguration
  • Fallback: Bei Fehler in MySQL/MariaDB-Verbindung auf SQLite zurückfallen
  • Validierung: Test-Verbindung vor Speichern der Konfiguration
  • Sicherheit: MySQL/MariaDB-Passwörter verschlüsselt in Config speichern (optional)

Dateien die angepasst werden müssen

  • database.jsdatabase/ Ordner mit mehreren Dateien
  • routes/admin.js - Datenbank-Konfiguration
  • views/admin.ejs - Konfigurations-UI
  • package.json - mysql2 Dependency
  • server.js - Konfigurationspr