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

+5 -3
View File
@@ -49,7 +49,7 @@ async function fetchApiGroupById(pool, id) {
const [groups] = await pool.query('SELECT * FROM i_api_source_groups WHERE id = ?', [id]);
if (!groups.length) return null;
const [requests] = await pool.query(API_REQUEST_SELECT + ' WHERE request.auth_source_id = ? ORDER BY request.id', [id]);
return Object.assign({}, groups[0], { requests: requests.map(function (request) { return Object.assign({}, request, { name: request.request_name }); }) });
return Object.assign({}, groups[0], { requests: requests.map(function (request) { return Object.assign({}, request, { name: request.request_name, enabled: request.request_enabled === undefined ? request.enabled : request.request_enabled }); }) });
}
async function fetchApiGroupsPage(pool, page, pageSize, search, sort, direction) {
@@ -77,11 +77,13 @@ async function getApiRequestUsage(pool) {
async function saveApiGroup(pool, id, payload, actorId, canDelete) {
const connection = await pool.getConnection();
let enabled = 1;
try {
await connection.beginTransaction();
if (id) {
const [groups] = await connection.query('SELECT id FROM i_api_source_groups WHERE id = ? FOR UPDATE', [id]);
const [groups] = await connection.query('SELECT id, enabled FROM i_api_source_groups WHERE id = ? FOR UPDATE', [id]);
if (!groups.length) throw validationError('API source not found.', 404);
enabled = groups[0].enabled === 0 || groups[0].enabled === false ? 0 : 1;
}
const [duplicates] = await connection.query('SELECT id FROM i_api_source_groups WHERE name = ? AND id <> ?', [payload.name, id || 0]);
if (duplicates.length) throw validationError('An API source with that name already exists.');
@@ -113,7 +115,7 @@ async function saveApiGroup(pool, id, payload, actorId, canDelete) {
}
if (removed.length) await connection.query('DELETE FROM i_api_sources WHERE auth_source_id = ? AND id IN (?)', [id, removed]);
await connection.commit();
return { id: Number(id), removed: removed, requests: payload.requests };
return { id: Number(id), enabled: enabled, removed: removed, requests: payload.requests };
} catch (error) {
await connection.rollback();
if (error.code === 'ER_DUP_ENTRY') throw validationError('An API source with that name already exists.');
+2 -2
View File
@@ -17,7 +17,7 @@ const tokenCache = new Map();
const tokenRequests = new Map();
const diagnosticContext = Symbol('apiSourceDiagnostics');
const API_AUTH_FIELDS = ['auth_method', 'auth_username', 'auth_password', 'auth_bearer_token', 'auth_header_name', 'auth_header_value', 'token_url', 'token_request_body_json', 'token_response_path', 'token_refresh_url', 'token_refresh_request_body_json', 'token_refresh_response_path', 'token_header_name', 'token_header_prefix'];
const API_REQUEST_SELECT = 'SELECT request.*, request.name AS request_name, auth.name AS group_name, CONCAT(auth.name, \' / \', request.name) AS name, ' + API_AUTH_FIELDS.map(function (field) { return 'auth.' + field; }).join(', ') + ' FROM i_api_sources request JOIN i_api_source_groups auth ON auth.id = request.auth_source_id';
const API_REQUEST_SELECT = 'SELECT request.*, request.enabled AS request_enabled, auth.enabled AS source_enabled, (request.enabled AND auth.enabled) AS enabled, request.name AS request_name, auth.name AS group_name, CONCAT(auth.name, \' / \', request.name) AS name, ' + API_AUTH_FIELDS.map(function (field) { return 'auth.' + field; }).join(', ') + ' FROM i_api_sources request JOIN i_api_source_groups auth ON auth.id = request.auth_source_id';
function createDiagnosticSanitizer(source) {
const secrets = [];
@@ -176,7 +176,7 @@ function buildAuthHeaders(source) {
async function fetchApiSourcesData(pool) {
const [apiSources] = await pool.query(
"SELECT request.id, request.auth_source_id, request.name AS request_name, auth.name AS group_name, CONCAT(auth.name, ' / ', request.name) AS name, request.items_path, request.enabled, request.update_interval_value, request.update_interval_unit, request.last_pulled_at, request.last_pull_error, request.last_response_status, request.last_response_content_type, request.last_response_json FROM i_api_sources request JOIN i_api_source_groups auth ON auth.id = request.auth_source_id ORDER BY auth.name, request.id"
"SELECT request.id, request.auth_source_id, request.name AS request_name, auth.name AS group_name, CONCAT(auth.name, ' / ', request.name) AS name, request.items_path, (request.enabled AND auth.enabled) AS enabled, request.update_interval_value, request.update_interval_unit, request.last_pulled_at, request.last_pull_error, request.last_response_status, request.last_response_content_type, request.last_response_json FROM i_api_sources request JOIN i_api_source_groups auth ON auth.id = request.auth_source_id ORDER BY auth.name, request.id"
);
return { apiSources: apiSources };