Release 2.16.2
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

This commit is contained in:
lzstealth committed 2026-10-21 01:38:22 +01:00
1 parent 8ce8228091
commit 49df51d92f
32 files changed
+390 -172

No files matched your search

@@ -49,7 +49,7 @@ function buildApiSourceFormViewModel(apiSource, message, currentUser, options, i
const viewApiSource = normalizeApiSourceForForm(apiSource);
const viewOptions = options || {};
function requestModel(request) {
return Object.assign({ name: 'Request 1', api_url: '', request_method: 'GET', request_body_json: '', items_path: '', enabled: 1, update_interval_value: viewApiSource.updateIntervalValue, update_interval_unit: viewApiSource.updateIntervalUnit }, request, {
return Object.assign({ name: 'Request 1', api_url: '', request_method: 'GET', request_body_json: '', items_path: '', enabled: 1, source_enabled: viewApiSource.enabled, update_interval_value: viewApiSource.updateIntervalValue, update_interval_unit: viewApiSource.updateIntervalUnit }, request, {
lastResponseJson: typeof request.last_response_json === 'object' && request.last_response_json ? JSON.stringify(request.last_response_json, null, 2) : request.last_response_json || '',
lastPulledAtValue: request.last_pulled_at ? new Date(request.last_pulled_at).toISOString() : ''
});
@@ -16,7 +16,7 @@ module.exports = function registerApiSourceRoutes(app, deps) {
function syncSchedules(group, removed, actorId) {
(removed || []).forEach(function (id) { dataSourceTasks.removeRecurringRefresh('api-source', id); });
group.requests.forEach(function (request) {
if (!request.enabled) return dataSourceTasks.removeRecurringRefresh('api-source', request.id);
if (group.enabled === 0 || group.enabled === false || !request.enabled) return dataSourceTasks.removeRecurringRefresh('api-source', request.id);
dataSourceTasks.registerRecurringRefresh('api-source', request.id, group.name + ' / ' + request.name, request.update_interval_value || request.updateIntervalValue, request.update_interval_unit || request.updateIntervalUnit, function () {
return dataSourceTasks.refreshApiSourceInBackground(request.id, actorId);
});
@@ -97,15 +97,15 @@ module.exports = function registerApiSourceRoutes(app, deps) {
if (req.body.data_source_action === 'toggle') {
const group = await fetchApiGroupById(pool, id);
if (!group) return res.status(404).send('API source not found');
const enabled = group.requests.some(function (request) { return request.enabled; }) ? 0 : 1;
await pool.query('UPDATE i_api_sources SET enabled = ?, modified_by = ? WHERE auth_source_id = ?', [enabled, getAuditUserId(req), id]);
group.requests.forEach(function (request) { request.enabled = enabled; });
const enabled = group.enabled === 0 || group.enabled === false ? 1 : 0;
await pool.query('UPDATE i_api_source_groups SET enabled = ?, modified_by = ? WHERE id = ?', [enabled, getAuditUserId(req), id]);
group.enabled = enabled;
syncSchedules(group, [], getAuditUserId(req));
return res.redirect(base + '/' + id + '/edit?message=' + encodeURIComponent(enabled ? 'API requests enabled.' : 'API requests disabled.'));
return res.redirect(base + '/' + id + '/edit?message=' + encodeURIComponent(enabled ? 'API source enabled.' : 'API source disabled.'));
}
const payload = buildApiGroupPayload(req.body);
const result = await saveApiGroup(pool, id, payload, getAuditUserId(req), hasPermission(req.currentUser, 'api-sources.delete'));
syncSchedules({ name: payload.name, requests: result.requests }, result.removed, getAuditUserId(req));
syncSchedules({ name: payload.name, enabled: result.enabled, requests: result.requests }, result.removed, getAuditUserId(req));
if (!id) {
for (const request of result.requests) { if (request.enabled) await enqueue(request, payload, getAuditUserId(req)); }
}
@@ -119,15 +119,38 @@ module.exports = function registerApiSourceRoutes(app, deps) {
try {
const group = await fetchApiGroupById(pool, Number(req.params.id));
if (!group) return res.status(404).send('API source not found');
if (group.enabled === 0 || group.enabled === false) return res.status(409).json({ error: 'API source is disabled.' });
const requests = req.params.requestId ? group.requests.filter(function (request) { return Number(request.id) === Number(req.params.requestId); }) : group.requests;
if (!requests.length) return res.status(404).send('API request not found');
for (const request of requests) { if (request.enabled) await enqueue(request, group, getAuditUserId(req)); }
const tasks = [];
for (const request of requests) { if (request.enabled) tasks.push(await enqueue(request, group, getAuditUserId(req))); }
if (req.params.requestId && req.get('Accept') === 'application/json') {
if (!tasks.length) return res.status(409).json({ error: 'API request is disabled.' });
return res.status(202).json({
taskId: tasks[0].id,
stateUrl: base + '/' + group.id + '/requests/' + Number(req.params.requestId) + '/state',
message: 'Refreshing saved API request. Unsaved changes are kept.'
});
}
res.redirect(base + '/' + group.id + '/edit?message=' + encodeURIComponent('Enabled API request refreshes queued.'));
} catch (error) { next(error); }
}
app.post(base + '/:id/refresh', requirePermission('api-sources.allow'), refresh);
app.post(base + '/:id/requests/:requestId/refresh', requirePermission('api-sources.allow'), refresh);
app.get(base + '/:id/requests/:requestId/state', requirePermission('api-sources.allow'), async function (req, res, next) {
res.set('Cache-Control', 'no-store');
try {
const taskId = Number(req.query.refresh_task_id);
if (!Number.isSafeInteger(taskId) || taskId <= 0) return res.status(400).json({ error: 'Missing refresh task id.' });
const [requests] = await pool.query('SELECT id FROM i_api_sources WHERE id = ? AND auth_source_id = ?', [Number(req.params.requestId), Number(req.params.id)]);
if (!requests.length) return res.status(404).json({ error: 'API request not found.' });
const task = await dataSourceTasks.getTaskStatusById(taskId);
if (!task || task.key !== 'api-source-refresh:' + Number(req.params.requestId)) return res.status(404).json({ error: 'Refresh task not found.' });
res.json(task);
} catch (error) { next(error); }
});
app.post(base + '/:id/delete', requirePermission('api-sources.delete'), async function (req, res, next) {
const connection = await pool.getConnection();
try {