Projektsuche Implementiert mit anbindung an INFRA

This commit is contained in:
2026-03-13 16:49:38 +01:00
parent 91603f1617
commit 1d8ba6a955
10 changed files with 1965 additions and 27 deletions

View File

@@ -3,47 +3,53 @@
const bcrypt = require('bcryptjs');
const { db } = require('../database');
const { requireAdmin } = require('../middleware/auth');
const { testMssqlConnection } = require('../services/mssql-infra-service');
// Routes registrieren
function registerAdminRoutes(app) {
// Admin-Bereich
app.get('/admin', requireAdmin, (req, res) => {
db.all('SELECT id, username, firstname, lastname, role, personalnummer, wochenstunden, urlaubstage, arbeitstage, default_break_minutes, created_at FROM users ORDER BY created_at DESC',
db.all(
'SELECT id, username, firstname, lastname, role, personalnummer, wochenstunden, urlaubstage, arbeitstage, default_break_minutes, created_at FROM users ORDER BY created_at DESC',
(err, users) => {
// LDAP-Konfiguration, Sync-Log und Optionen abrufen
// LDAP-Konfiguration, Sync-Log, Optionen und MSSQL-Konfiguration abrufen
db.get('SELECT * FROM ldap_config WHERE id = 1', (err, ldapConfig) => {
db.all('SELECT * FROM ldap_sync_log ORDER BY sync_started_at DESC LIMIT 10', (err, syncLogs) => {
db.get('SELECT * FROM system_options WHERE id = 1', (err, options) => {
// Parse Rollen für jeden User
const usersWithRoles = (users || []).map(u => {
let roles = [];
try {
roles = JSON.parse(u.role);
if (!Array.isArray(roles)) {
roles = [u.role];
db.get('SELECT * FROM mssql_config WHERE id = 1', (err, mssqlConfig) => {
// Parse Rollen für jeden User
const usersWithRoles = (users || []).map(u => {
let roles = [];
try {
roles = JSON.parse(u.role);
if (!Array.isArray(roles)) {
roles = [u.role];
}
} catch (e) {
roles = [u.role || 'mitarbeiter'];
}
} catch (e) {
roles = [u.role || 'mitarbeiter'];
}
return { ...u, roles };
});
res.render('admin', {
users: usersWithRoles,
ldapConfig: ldapConfig || null,
syncLogs: syncLogs || [],
options: options || { saturday_percentage: 100, sunday_percentage: 100 },
user: {
firstname: req.session.firstname,
lastname: req.session.lastname,
roles: req.session.roles || [],
currentRole: req.session.currentRole || 'admin'
}
return { ...u, roles };
});
res.render('admin', {
users: usersWithRoles,
ldapConfig: ldapConfig || null,
syncLogs: syncLogs || [],
options: options || { saturday_percentage: 100, sunday_percentage: 100 },
mssqlConfig: mssqlConfig || null,
user: {
firstname: req.session.firstname,
lastname: req.session.lastname,
roles: req.session.roles || [],
currentRole: req.session.currentRole || 'admin'
}
});
});
});
});
});
});
}
);
});
// Benutzer erstellen
@@ -234,6 +240,88 @@ function registerAdminRoutes(app) {
}
});
});
// MSSQL-Konfiguration laden
app.get('/admin/mssql-config', requireAdmin, (req, res) => {
db.get('SELECT server, database, username FROM mssql_config WHERE id = 1', (err, config) => {
if (err) {
return res.status(500).json({ error: 'Fehler beim Laden der MSSQL-Konfiguration' });
}
if (!config) {
return res.json({
config: {
server: '',
database: '',
username: ''
}
});
}
res.json({ config });
});
});
// MSSQL-Konfiguration speichern
app.post('/admin/mssql-config', requireAdmin, (req, res) => {
const { server, database, username, password } = req.body;
const trimmedServer = server ? server.trim() : '';
const trimmedDatabase = database ? database.trim() : '';
const trimmedUsername = username ? username.trim() : '';
const trimmedPassword = password != null ? password.trim() : null;
if (!trimmedServer || !trimmedDatabase || !trimmedUsername) {
return res.status(400).json({ error: 'Server, Datenbankname und Benutzername sind erforderlich' });
}
db.get('SELECT * FROM mssql_config WHERE id = 1', (err, existing) => {
if (err) {
return res.status(500).json({ error: 'Fehler beim Lesen der bestehenden MSSQL-Konfiguration' });
}
const newPassword =
trimmedPassword === null || trimmedPassword === ''
? (existing ? existing.password : '')
: trimmedPassword;
if (existing) {
db.run(
'UPDATE mssql_config SET server = ?, database = ?, username = ?, password = ?, updated_at = CURRENT_TIMESTAMP WHERE id = 1',
[trimmedServer, trimmedDatabase, trimmedUsername, newPassword],
(updateErr) => {
if (updateErr) {
return res.status(500).json({ error: 'Fehler beim Speichern der MSSQL-Konfiguration' });
}
return res.json({ success: true });
}
);
} else {
db.run(
'INSERT INTO mssql_config (id, server, database, username, password) VALUES (1, ?, ?, ?, ?)',
[trimmedServer, trimmedDatabase, trimmedUsername, newPassword || ''],
(insertErr) => {
if (insertErr) {
return res.status(500).json({ error: 'Fehler beim Speichern der MSSQL-Konfiguration' });
}
return res.json({ success: true });
}
);
}
});
});
// MSSQL-Verbindung testen
app.post('/admin/mssql-test-connection', requireAdmin, async (req, res) => {
try {
await testMssqlConnection();
return res.json({ success: true });
} catch (err) {
console.error('MSSQL Testverbindung fehlgeschlagen:', err);
return res.status(500).json({
success: false,
error: 'Verbindung zur MSSQL-Datenbank fehlgeschlagen: ' + err.message
});
}
});
}
module.exports = registerAdminRoutes;