export const normalizeAdminSettings = (raw) => { if (!raw) { return null; } return { scheduleCron: raw.scheduleCron || '', randomDelayMinSeconds: raw.randomDelayMinSeconds ?? '', randomDelayMaxSeconds: raw.randomDelayMaxSeconds ?? '', initialDelayMinSeconds: raw.initialDelayMinSeconds ?? '', initialDelayMaxSeconds: raw.initialDelayMaxSeconds ?? '', storePickupCheckDelayMs: raw.storePickupCheckDelayMs ?? '', storeWatchCron: raw.storeWatchCron || '', storeWatchInitialDelayMinSeconds: raw.storeWatchInitialDelayMinSeconds ?? '', storeWatchInitialDelayMaxSeconds: raw.storeWatchInitialDelayMaxSeconds ?? '', ignoredSlots: Array.isArray(raw.ignoredSlots) ? raw.ignoredSlots.map((slot) => ({ storeId: slot?.storeId ? String(slot.storeId) : '', description: slot?.description || '' })) : [], notifications: { ntfy: { enabled: !!raw.notifications?.ntfy?.enabled, serverUrl: raw.notifications?.ntfy?.serverUrl || 'https://ntfy.sh', topicPrefix: raw.notifications?.ntfy?.topicPrefix || '', username: raw.notifications?.ntfy?.username || '', password: raw.notifications?.ntfy?.password || '' }, telegram: { enabled: !!raw.notifications?.telegram?.enabled, botToken: raw.notifications?.telegram?.botToken || '' } } }; }; const toNumberOrUndefined = (value) => { if (value === '' || value === null || value === undefined) { return undefined; } const parsed = Number(value); return Number.isFinite(parsed) ? parsed : undefined; }; export const serializeAdminSettings = (adminSettings) => { if (!adminSettings) { return null; } return { scheduleCron: adminSettings.scheduleCron, randomDelayMinSeconds: toNumberOrUndefined(adminSettings.randomDelayMinSeconds), randomDelayMaxSeconds: toNumberOrUndefined(adminSettings.randomDelayMaxSeconds), initialDelayMinSeconds: toNumberOrUndefined(adminSettings.initialDelayMinSeconds), initialDelayMaxSeconds: toNumberOrUndefined(adminSettings.initialDelayMaxSeconds), storePickupCheckDelayMs: toNumberOrUndefined(adminSettings.storePickupCheckDelayMs), storeWatchCron: adminSettings.storeWatchCron, storeWatchInitialDelayMinSeconds: toNumberOrUndefined(adminSettings.storeWatchInitialDelayMinSeconds), storeWatchInitialDelayMaxSeconds: toNumberOrUndefined(adminSettings.storeWatchInitialDelayMaxSeconds), ignoredSlots: (adminSettings.ignoredSlots || []).map((slot) => ({ storeId: slot.storeId || '', description: slot.description || '' })), notifications: { ntfy: { enabled: !!adminSettings.notifications?.ntfy?.enabled, serverUrl: adminSettings.notifications?.ntfy?.serverUrl || '', topicPrefix: adminSettings.notifications?.ntfy?.topicPrefix || '', username: adminSettings.notifications?.ntfy?.username || '', password: adminSettings.notifications?.ntfy?.password || '' }, telegram: { enabled: !!adminSettings.notifications?.telegram?.enabled, botToken: adminSettings.notifications?.telegram?.botToken || '' } } }; };