Files
SDSStundenerfassung/services/mssql-infra-service.js

92 lines
2.4 KiB
JavaScript

const { db } = require('../database');
const sql = require('mssql');
let cachedConfig = null;
let lastConfigLoad = 0;
let pool = null;
async function loadConfig() {
return new Promise((resolve, reject) => {
db.get('SELECT server, database, username, password FROM mssql_config WHERE id = 1', (err, row) => {
if (err) {
return reject(new Error('Fehler beim Lesen der MSSQL-Konfiguration: ' + err.message));
}
resolve(row || null);
});
});
}
async function getMssqlPool() {
const now = Date.now();
if (!cachedConfig || now - lastConfigLoad > 60 * 1000) {
cachedConfig = await loadConfig();
lastConfigLoad = now;
}
if (!cachedConfig || !cachedConfig.server || !cachedConfig.database || !cachedConfig.username || !cachedConfig.password) {
throw new Error('MSSQL-Konfiguration ist unvollständig. Bitte im Adminbereich konfigurieren.');
}
if (pool && pool.connected) {
return pool;
}
const config = {
server: cachedConfig.server,
database: cachedConfig.database,
user: cachedConfig.username,
password: cachedConfig.password,
options: {
encrypt: false,
trustServerCertificate: true
}
};
pool = await sql.connect(config);
return pool;
}
async function searchProjectsByDescription(searchTerm) {
const pool = await getMssqlPool();
const request = pool.request();
request.input('search', sql.NVarChar, `%${searchTerm}%`);
// Datenbankname aus Konfiguration verwenden
const dbName = cachedConfig && cachedConfig.database ? cachedConfig.database : null;
if (!dbName) {
throw new Error('MSSQL-Datenbankname ist nicht konfiguriert.');
}
const query = `
SELECT TOP 25
kk.Auftrag AS auftrag,
kk.Proj AS proj,
kk.Such AS such,
kk.Knd AS knd,
k.Bez AS bez
FROM [${dbName}].dbo.KKOPF kk
LEFT JOIN [${dbName}].dbo.KUNDE k ON kk.Knd = k.Knd
WHERE kk.Proj LIKE @search
OR kk.Auftrag LIKE @search
OR kk.Such LIKE @search
OR k.Bez LIKE @search
ORDER BY kk.ErfTerm DESC
`;
const result = await request.query(query);
return result.recordset || [];
}
async function testMssqlConnection() {
const pool = await getMssqlPool();
await pool.request().query('SELECT TOP 1 1 AS ok');
return true;
}
module.exports = {
getMssqlPool,
searchProjectsByDescription,
testMssqlConnection
};