Files
pulse-signage/src/db/common.js
T
lzstealth 3f4f57020a
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile, web, pulse-signage-web) (push) Successful in 1m13s
Publish Docker Image / build-and-push-existing-registry (./build/Dockerfile.player, player, pulse-signage-player) (push) Successful in 31s
Release v2.10.3
2026-08-29 01:56:45 +01:00

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
};