// Database pool setup and lifecycle maintenance for persisted onboarding devices. const mysql = require('mysql2/promise'); function createPool() { return mysql.createPool({ host: process.env.DB_HOST || '127.0.0.1', port: Number(process.env.DB_PORT || 3306), user: process.env.DB_USER || 'signage_user', password: process.env.DB_PASSWORD || 'signage_password', database: process.env.DB_NAME || 'signage', timezone: 'Z', waitForConnections: true, connectionLimit: 10, namedPlaceholders: true }); } async function pruneStaleOnboardingDevices(pool) { // Uncompleted pairings expire quickly; completed bindings use their persisted heartbeat instead. await pool.query( `DELETE FROM d_onboarding_devices WHERE (screen_id IS NULL AND modified_at < (CURRENT_TIMESTAMP - INTERVAL 15 MINUTE)) OR (last_seen_at IS NOT NULL AND last_seen_at < (CURRENT_TIMESTAMP - INTERVAL 24 HOUR))` ); } async function touchOnboardingDeviceLastSeen(pool, deviceId) { const deviceIds = (Array.isArray(deviceId) ? deviceId : [deviceId]) .map(function (value) { return String(value || '').trim(); }) .filter(Boolean); if (!deviceIds.length) { return; } await pool.query( `UPDATE d_onboarding_devices SET last_seen_at = CURRENT_TIMESTAMP WHERE device_id IN (${deviceIds.map(function () { return '?'; }).join(', ')})`, deviceIds ); } module.exports = { createPool, pruneStaleOnboardingDevices, touchOnboardingDeviceLastSeen };