chore: sync running docker state

Commit the app code currently running in Docker, including scheduler, store status, journal reminder, maintenance mode, and Foodsharing API check updates. Remove generated runtime logs from version control and ignore local runtime captures.
This commit is contained in:
2026-06-14 21:21:07 +02:00
parent 1e754023c3
commit bd41e8c079
46 changed files with 3010 additions and 7522 deletions

View File

@@ -1,5 +1,6 @@
const fs = require('fs');
const path = require('path');
const { readJsonFile, writeJsonFile } = require('./jsonFileStore');
const CONFIG_DIR = path.join(__dirname, '..', 'config');
const SETTINGS_FILE = path.join(CONFIG_DIR, 'admin-settings.json');
@@ -20,6 +21,16 @@ const DEFAULT_SETTINGS = {
storeWatchRequestDelayMs: 1000,
storeWatchStatusCacheMaxAgeMinutes: 120,
storePickupCheckDelayMs: 400,
messageWatcherSocketEnabled: true,
messageWatcherFallbackEnabled: true,
messageWatcherFallbackCron: '0 6-23 * * *',
messageWatcherDebugLogging: true,
maintenanceModeActive: false,
maintenanceModeAutoEnabled: true,
maintenanceModeActivatedAt: null,
maintenanceModeReason: '',
maintenanceModeErrorThreshold: 8,
maintenanceModeErrorWindowMinutes: 10,
ignoredSlots: [
{
storeId: '51450',
@@ -100,6 +111,11 @@ function sanitizeString(value) {
return String(value).trim();
}
function sanitizeNullableString(value, fallback = null) {
const sanitized = sanitizeString(value);
return sanitized || fallback;
}
function sanitizeNotifications(input = {}) {
const defaults = DEFAULT_SETTINGS.notifications;
return {
@@ -121,13 +137,16 @@ function sanitizeNotifications(input = {}) {
function readSettings() {
ensureDir();
if (!fs.existsSync(SETTINGS_FILE)) {
fs.writeFileSync(SETTINGS_FILE, JSON.stringify(DEFAULT_SETTINGS, null, 2));
writeJsonFile(SETTINGS_FILE, DEFAULT_SETTINGS, { backup: false });
return { ...DEFAULT_SETTINGS };
}
try {
const raw = fs.readFileSync(SETTINGS_FILE, 'utf8');
const parsed = JSON.parse(raw);
const parsed = readJsonFile(
SETTINGS_FILE,
DEFAULT_SETTINGS,
(value) => value && typeof value === 'object' && !Array.isArray(value)
);
return {
scheduleCron: parsed.scheduleCron || DEFAULT_SETTINGS.scheduleCron,
pickupFallbackCron: parsed.pickupFallbackCron || DEFAULT_SETTINGS.pickupFallbackCron,
@@ -162,6 +181,35 @@ function readSettings() {
parsed.storePickupCheckDelayMs,
DEFAULT_SETTINGS.storePickupCheckDelayMs
),
messageWatcherSocketEnabled:
parsed.messageWatcherSocketEnabled === undefined
? DEFAULT_SETTINGS.messageWatcherSocketEnabled
: !!parsed.messageWatcherSocketEnabled,
messageWatcherFallbackEnabled:
parsed.messageWatcherFallbackEnabled === undefined
? DEFAULT_SETTINGS.messageWatcherFallbackEnabled
: !!parsed.messageWatcherFallbackEnabled,
messageWatcherFallbackCron:
parsed.messageWatcherFallbackCron || DEFAULT_SETTINGS.messageWatcherFallbackCron,
messageWatcherDebugLogging:
parsed.messageWatcherDebugLogging === undefined
? DEFAULT_SETTINGS.messageWatcherDebugLogging
: !!parsed.messageWatcherDebugLogging,
maintenanceModeActive: !!parsed.maintenanceModeActive,
maintenanceModeAutoEnabled:
parsed.maintenanceModeAutoEnabled === undefined
? DEFAULT_SETTINGS.maintenanceModeAutoEnabled
: !!parsed.maintenanceModeAutoEnabled,
maintenanceModeActivatedAt: sanitizeNullableString(parsed.maintenanceModeActivatedAt, null),
maintenanceModeReason: sanitizeString(parsed.maintenanceModeReason),
maintenanceModeErrorThreshold: sanitizeNumber(
parsed.maintenanceModeErrorThreshold,
DEFAULT_SETTINGS.maintenanceModeErrorThreshold
),
maintenanceModeErrorWindowMinutes: sanitizeNumber(
parsed.maintenanceModeErrorWindowMinutes,
DEFAULT_SETTINGS.maintenanceModeErrorWindowMinutes
),
ignoredSlots: sanitizeIgnoredSlots(parsed.ignoredSlots),
notifications: sanitizeNotifications(parsed.notifications)
};
@@ -207,6 +255,43 @@ function writeSettings(patch = {}) {
patch.storePickupCheckDelayMs,
current.storePickupCheckDelayMs
),
messageWatcherSocketEnabled:
patch.messageWatcherSocketEnabled === undefined
? current.messageWatcherSocketEnabled
: !!patch.messageWatcherSocketEnabled,
messageWatcherFallbackEnabled:
patch.messageWatcherFallbackEnabled === undefined
? current.messageWatcherFallbackEnabled
: !!patch.messageWatcherFallbackEnabled,
messageWatcherFallbackCron: patch.messageWatcherFallbackCron || current.messageWatcherFallbackCron,
messageWatcherDebugLogging:
patch.messageWatcherDebugLogging === undefined
? current.messageWatcherDebugLogging
: !!patch.messageWatcherDebugLogging,
maintenanceModeActive:
patch.maintenanceModeActive === undefined
? current.maintenanceModeActive
: !!patch.maintenanceModeActive,
maintenanceModeAutoEnabled:
patch.maintenanceModeAutoEnabled === undefined
? current.maintenanceModeAutoEnabled
: !!patch.maintenanceModeAutoEnabled,
maintenanceModeActivatedAt:
patch.maintenanceModeActivatedAt === undefined
? current.maintenanceModeActivatedAt
: sanitizeNullableString(patch.maintenanceModeActivatedAt, null),
maintenanceModeReason:
patch.maintenanceModeReason === undefined
? current.maintenanceModeReason
: sanitizeString(patch.maintenanceModeReason),
maintenanceModeErrorThreshold: sanitizeNumber(
patch.maintenanceModeErrorThreshold,
current.maintenanceModeErrorThreshold
),
maintenanceModeErrorWindowMinutes: sanitizeNumber(
patch.maintenanceModeErrorWindowMinutes,
current.maintenanceModeErrorWindowMinutes
),
ignoredSlots:
patch.ignoredSlots !== undefined
? sanitizeIgnoredSlots(patch.ignoredSlots)
@@ -217,8 +302,13 @@ function writeSettings(patch = {}) {
: current.notifications
};
if (!next.maintenanceModeActive) {
next.maintenanceModeActivatedAt = null;
next.maintenanceModeReason = '';
}
ensureDir();
fs.writeFileSync(SETTINGS_FILE, JSON.stringify(next, null, 2));
writeJsonFile(SETTINGS_FILE, next);
return next;
}