import { pool } from './db.js'; /* * Allgemeine CRM-Einstellungen (Tabelle crm_settings) als Schluessel/Wert. * * Absichtlich getrennt von den Scanner-Einstellungen: der Scanner hat seine * eigene Datenbank und sein eigenes Setting-Modell. Und absichtlich ohne * Geheimnisse - Zugangsdaten fuer Microsoft 365 stehen ausschliesslich in der * .env, damit ein Datenbank-Dump keine Secrets enthaelt. * * Alle Werte liegen als Text in der Datenbank, auch Zahlen und Schalter. Die * Helfer unten wandeln beim Lesen. */ /** Einzelnen Wert lesen; `fallback`, wenn der Schluessel fehlt. */ export async function getSetting(key, fallback = null) { const [rows] = await pool.query('SELECT value FROM crm_settings WHERE key_name = ? LIMIT 1', [key]); return rows[0] ? rows[0].value : fallback; } /** * Mehrere Werte auf einmal, aufgefuellt mit den Vorgaben. `defaults` ist * gleichzeitig die Liste der erlaubten Schluessel. */ export async function getSettings(defaults) { const keys = Object.keys(defaults); if (keys.length === 0) return {}; const [rows] = await pool.query( `SELECT key_name, value FROM crm_settings WHERE key_name IN (${keys.map(() => '?').join(', ')})`, keys ); const result = { ...defaults }; for (const row of rows) { // Ein leerer Eintrag soll nicht die Vorgabe ueberschreiben. if (row.value !== null && row.value !== '') result[row.key_name] = row.value; } return result; } /** Wert setzen (anlegen oder ueberschreiben). */ export async function setSetting(key, value) { await pool.query( `INSERT INTO crm_settings (key_name, value) VALUES (?, ?) ON DUPLICATE KEY UPDATE value = VALUES(value)`, [key, value === null || value === undefined ? null : String(value)] ); } /** `'true'` gilt als an, alles andere als aus. */ export function asBool(value, fallback = false) { if (value === undefined || value === null || value === '') return fallback; return String(value) === 'true' || String(value) === '1'; } /** Zahl mit Grenzen; ausserhalb oder unlesbar heisst Vorgabe. */ export function asInt(value, fallback, { min = -Infinity, max = Infinity } = {}) { const parsed = Number.parseInt(String(value ?? ''), 10); if (!Number.isFinite(parsed)) return fallback; return Math.min(max, Math.max(min, parsed)); }