const db = require('../config/db'); const DEFAULTS = { device_renewal: true, device_suspended: true, device_paused: true, billing_reminder: true, payout_completed: true, payout_failed: true, trial_granted: true, purchase_alerts: true, system_alerts: true, }; const OPTION_DEFS = [ { key: 'device_renewal', label: 'Device renewal', description: 'Sent when a device subscription payment succeeds and the device is renewed.', default_enabled: true, }, { key: 'device_suspended', label: 'Device suspended', description: 'Sent when a device is suspended because billing expired or admin suspended it.', default_enabled: true, }, { key: 'device_paused', label: 'Device paused', description: 'Sent when you manually pause a device from the dashboard.', default_enabled: true, }, { key: 'billing_reminder', label: 'Billing reminders', description: 'Sent before a device trial or subscription is about to expire.', default_enabled: true, }, { key: 'payout_completed', label: 'Payout completed', description: 'Sent when a payout to your phone succeeds.', default_enabled: true, }, { key: 'payout_failed', label: 'Payout failed', description: 'Sent when a payout fails and your balance is restored.', default_enabled: true, }, { key: 'trial_granted', label: 'Trial granted', description: 'Sent when an admin grants a trial period to one of your devices.', default_enabled: true, }, { key: 'purchase_alerts', label: 'Purchase alerts', description: 'Show an in-app alert when a guest buys a WiFi bundle.', default_enabled: true, }, { key: 'system_alerts', label: 'System alerts', description: 'Show in-app device and controller alerts from Omada.', default_enabled: true, }, ]; function normalizeRow(row) { const prefs = {}; for (const [key, defaultValue] of Object.entries(DEFAULTS)) { prefs[key] = row ? Boolean(row[key]) : defaultValue; } return prefs; } async function getNotificationPreferences(clientId) { const row = await db.queryOne( `SELECT client_id, device_renewal, device_suspended, device_paused, billing_reminder, payout_completed, payout_failed, trial_granted, purchase_alerts, system_alerts FROM client_notification_preferences WHERE client_id = ?`, [clientId] ); return normalizeRow(row); } async function upsertNotificationPreferences(clientId, input) { const merged = { ...(await getNotificationPreferences(clientId)), ...input }; await db.query( `INSERT INTO client_notification_preferences (client_id, device_renewal, device_suspended, device_paused, billing_reminder, payout_completed, payout_failed, trial_granted, purchase_alerts, system_alerts) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE device_renewal = VALUES(device_renewal), device_suspended = VALUES(device_suspended), device_paused = VALUES(device_paused), billing_reminder = VALUES(billing_reminder), payout_completed = VALUES(payout_completed), payout_failed = VALUES(payout_failed), trial_granted = VALUES(trial_granted), purchase_alerts = VALUES(purchase_alerts), system_alerts = VALUES(system_alerts)`, [ clientId, merged.device_renewal ? 1 : 0, merged.device_suspended ? 1 : 0, merged.device_paused ? 1 : 0, merged.billing_reminder ? 1 : 0, merged.payout_completed ? 1 : 0, merged.payout_failed ? 1 : 0, merged.trial_granted ? 1 : 0, merged.purchase_alerts ? 1 : 0, merged.system_alerts ? 1 : 0, ] ); return getNotificationPreferences(clientId); } async function canSendTenantNotification(clientId, key) { const prefs = await getNotificationPreferences(clientId); return prefs[key] ?? true; } function serializePreferenceOptions(preferences) { return OPTION_DEFS.map(option => ({ ...option, enabled: preferences[option.key] ?? option.default_enabled, })); } module.exports = { DEFAULTS, OPTION_DEFS, getNotificationPreferences, upsertNotificationPreferences, canSendTenantNotification, serializePreferenceOptions, };