const fs = require('fs'); const path = require('path'); const CONFIG_DIR = path.join(__dirname, '..', 'config'); const SETTINGS_FILE = path.join(CONFIG_DIR, 'admin-settings.json'); const DEFAULT_SETTINGS = { scheduleCron: '*/10 7-22 * * *', randomDelayMinSeconds: 10, randomDelayMaxSeconds: 120, initialDelayMinSeconds: 5, initialDelayMaxSeconds: 30, ignoredSlots: [ { storeId: '51450', description: 'TVS' } ] }; function ensureDir() { if (!fs.existsSync(CONFIG_DIR)) { fs.mkdirSync(CONFIG_DIR, { recursive: true }); } } function sanitizeNumber(value, fallback) { const num = Number(value); if (Number.isFinite(num) && num >= 0) { return num; } return fallback; } function sanitizeIgnoredSlots(slots = []) { if (!Array.isArray(slots)) { return DEFAULT_SETTINGS.ignoredSlots; } return slots .map((slot) => ({ storeId: slot?.storeId ? String(slot.storeId) : '', description: slot?.description ? String(slot.description) : '' })) .filter((slot) => slot.storeId); } function readSettings() { ensureDir(); if (!fs.existsSync(SETTINGS_FILE)) { fs.writeFileSync(SETTINGS_FILE, JSON.stringify(DEFAULT_SETTINGS, null, 2)); return { ...DEFAULT_SETTINGS }; } try { const raw = fs.readFileSync(SETTINGS_FILE, 'utf8'); const parsed = JSON.parse(raw); return { scheduleCron: parsed.scheduleCron || DEFAULT_SETTINGS.scheduleCron, randomDelayMinSeconds: sanitizeNumber(parsed.randomDelayMinSeconds, DEFAULT_SETTINGS.randomDelayMinSeconds), randomDelayMaxSeconds: sanitizeNumber(parsed.randomDelayMaxSeconds, DEFAULT_SETTINGS.randomDelayMaxSeconds), initialDelayMinSeconds: sanitizeNumber(parsed.initialDelayMinSeconds, DEFAULT_SETTINGS.initialDelayMinSeconds), initialDelayMaxSeconds: sanitizeNumber(parsed.initialDelayMaxSeconds, DEFAULT_SETTINGS.initialDelayMaxSeconds), ignoredSlots: sanitizeIgnoredSlots(parsed.ignoredSlots) }; } catch (error) { console.error('Konnte Admin-Einstellungen nicht lesen:', error.message); return { ...DEFAULT_SETTINGS }; } } function writeSettings(patch = {}) { const current = readSettings(); const next = { scheduleCron: patch.scheduleCron || current.scheduleCron, randomDelayMinSeconds: sanitizeNumber(patch.randomDelayMinSeconds, current.randomDelayMinSeconds), randomDelayMaxSeconds: sanitizeNumber(patch.randomDelayMaxSeconds, current.randomDelayMaxSeconds), initialDelayMinSeconds: sanitizeNumber(patch.initialDelayMinSeconds, current.initialDelayMinSeconds), initialDelayMaxSeconds: sanitizeNumber(patch.initialDelayMaxSeconds, current.initialDelayMaxSeconds), ignoredSlots: patch.ignoredSlots !== undefined ? sanitizeIgnoredSlots(patch.ignoredSlots) : current.ignoredSlots }; ensureDir(); fs.writeFileSync(SETTINGS_FILE, JSON.stringify(next, null, 2)); return next; } module.exports = { DEFAULT_SETTINGS, readSettings, writeSettings };