Praxissofttware/routes/setup.routes.js
2026-03-27 16:39:28 +00:00

182 lines
4.8 KiB
JavaScript
Raw Blame History

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.

const express = require("express");
const router = express.Router();
const mysql = require("mysql2/promise");
// ✅ nutzt deinen bestehenden config-manager (NICHT utils/config!)
const { configExists, loadConfig, saveConfig } = require("../config-manager");
// ✅ DB + Session Reset (wie in deiner app.js)
const db = require("../db");
const { resetSessionStore } = require("../config/session");
/**
* Setup ist immer erreichbar auch wenn config.enc schon existiert.
* So kann die DB-Verbindung jederzeit korrigiert werden.
* Schutz: Nur wenn DB bereits erreichbar ist UND User eingeloggt ist → blockieren.
*/
function blockIfInstalled(req, res, next) {
// Immer durchlassen Setup muss auch zur Korrektur nutzbar sein
next();
}
/**
* Setup Form anzeigen vorhandene Werte aus config.enc als Defaults laden
*/
router.get("/", blockIfInstalled, (req, res) => {
// Bestehende Config als Vorausfüllung laden (Passwort bleibt leer)
let existing = {};
try {
if (configExists()) {
const cfg = loadConfig();
existing = cfg?.db || {};
}
} catch (e) {
existing = {};
}
return res.render("setup/index", {
title: configExists() ? "DB-Verbindung ändern" : "Erstinstallation",
isUpdate: configExists(),
defaults: {
host: existing.host || "85.215.63.122",
port: existing.port || 3306,
user: existing.user || "",
password: "", // Passwort aus Sicherheitsgründen nie vorausfüllen
name: existing.name || "",
},
});
});
/**
* Passwort auflösen: wenn leer → altes Passwort aus config.enc nehmen
*/
function resolvePassword(inputPassword) {
if (inputPassword && inputPassword.trim() !== "") {
return inputPassword;
}
// Passwort-Feld leer → altes Passwort aus bestehender Config beibehalten
try {
if (configExists()) {
const old = loadConfig();
return old?.db?.password || "";
}
} catch (e) {
/* ignore */
}
return "";
}
/**
* ✅ Verbindung testen (AJAX)
*/
router.post("/test", blockIfInstalled, async (req, res) => {
try {
const { host, port, user, name } = req.body;
const password = resolvePassword(req.body.password);
if (!host || !user || !name) {
return res.status(400).json({
ok: false,
message: "Bitte Host, Benutzer und Datenbankname ausfüllen.",
});
}
const connection = await mysql.createConnection({
host: host.trim(),
port: Number(port || 3306),
user: user.trim(),
password,
database: name.trim(),
connectTimeout: 6000,
});
await connection.query("SELECT 1");
await connection.end();
return res.json({ ok: true, message: "✅ Verbindung erfolgreich!" });
} catch (err) {
return res.status(500).json({
ok: false,
message: "❌ Verbindung fehlgeschlagen: " + err.message,
});
}
});
/**
* ✅ Setup speichern (DB Daten in config.enc)
*/
router.post("/", blockIfInstalled, async (req, res) => {
try {
const { host, port, user, name } = req.body;
// Passwort: leer = altes Passwort beibehalten
const password = resolvePassword(req.body.password);
if (!host || !user || !name) {
req.session.flash = req.session.flash || [];
req.session.flash.push({
type: "danger",
message: "❌ Bitte Host, Benutzer und Datenbankname ausfüllen.",
});
return res.redirect("/setup");
}
// ✅ Verbindung testen bevor speichern
let connection;
try {
connection = await mysql.createConnection({
host: host.trim(),
port: Number(port || 3306),
user: user.trim(),
password,
database: name.trim(),
connectTimeout: 6000,
});
await connection.query("SELECT 1");
await connection.end();
} catch (connErr) {
req.session.flash = req.session.flash || [];
req.session.flash.push({
type: "danger",
message: "❌ DB-Verbindung fehlgeschlagen: " + connErr.message,
});
return res.redirect("/setup");
}
// ✅ In config.enc speichern
saveConfig({
db: {
host: host.trim(),
port: Number(port || 3306),
user: user.trim(),
password,
name: name.trim(),
},
});
// ✅ DB Pool neu initialisieren (neue Config sofort aktiv)
if (typeof db.resetPool === "function") {
db.resetPool();
}
// ✅ Session Store neu initialisieren
resetSessionStore();
req.session.flash = req.session.flash || [];
req.session.flash.push({
type: "success",
message: "✅ DB-Verbindung gespeichert. Du kannst dich jetzt einloggen.",
});
return res.redirect("/login");
} catch (err) {
req.session.flash = req.session.flash || [];
req.session.flash.push({
type: "danger",
message: "❌ Setup fehlgeschlagen: " + err.message,
});
return res.redirect("/setup");
}
});
module.exports = router;