50 lines
1.5 KiB
JavaScript
50 lines
1.5 KiB
JavaScript
// 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
|
|
}; |