V1.0
This commit is contained in:
@@ -0,0 +1,177 @@
|
||||
---
|
||||
name: MySQL-Integration mit Admin-Konfiguration
|
||||
overview: 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).
|
||||
todos: []
|
||||
---
|
||||
|
||||
# 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`
|
||||
|
||||
```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 AUTOINCREMENT` → `INT AUTO_INCREMENT PRIMARY KEY`
|
||||
- `TEXT` → `VARCHAR(255)` oder `TEXT`
|
||||
- `REAL` → `DOUBLE` oder `DECIMAL`
|
||||
- `TEXT` (unbegrenzt) → `TEXT` oder `LONGTEXT`
|
||||
- `DATETIME DEFAULT CURRENT_TIMESTAMP` → `DATETIME DEFAULT CURRENT_TIMESTAMP` (gleich)
|
||||
- `INSERT OR IGNORE` → `INSERT IGNORE`
|
||||
- `COLLATE NOCASE` → `COLLATE 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.js` → `database/` Ordner mit mehreren Dateien
|
||||
- `routes/admin.js` - Datenbank-Konfiguration
|
||||
- `views/admin.ejs` - Konfigurations-UI
|
||||
- `package.json` - mysql2 Dependency
|
||||
- `server.js` - Konfigurationspr
|
||||
Reference in New Issue
Block a user