fix: handle mysql2 >=3.23 returning JSON columns pre-parsed
Lint / JS (eslint) (pull_request) Successful in 11s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / JS Security (npm audit) (pull_request) Successful in 10s
Test / JS Tests (jest) (pull_request) Successful in 10s
Lint / JS (eslint) (push) Successful in 11s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Security / JS Security (npm audit) (push) Successful in 11s
Test / JS Tests (jest) (push) Successful in 11s
Lint / JS (eslint) (pull_request) Successful in 11s
Lint / Notify on failure (pull_request) Skipped
Lint / Deploy (pull_request) Skipped
Security / JS Security (npm audit) (pull_request) Successful in 10s
Test / JS Tests (jest) (pull_request) Successful in 10s
Lint / JS (eslint) (push) Successful in 11s
Lint / Notify on failure (push) Skipped
Lint / Deploy (push) Skipped
Security / JS Security (npm audit) (push) Successful in 11s
Test / JS Tests (jest) (push) Successful in 11s
mysql2 3.24 (pulled in by the audit fix in #35) returns MariaDB JSON columns as JS objects. GET /api/internal/executions/:id and GET /api/workflows/:id still called JSON.parse on the value, threw, and silently returned [] / {}. This broke Gandalf's relay checks (false 'PBS unreachable' ticket) and the workflow edit modal. Guard both sites with the same typeof check already used by GET /api/executions/:id. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HamVMDrA8RqhyxmUHgiqRp
This commit is contained in:
@@ -1194,7 +1194,11 @@ app.get('/api/workflows/:id', authenticateSSO, async (req, res) => {
|
|||||||
if (rows.length === 0) return res.status(404).json({ error: 'Not found' });
|
if (rows.length === 0) return res.status(404).json({ error: 'Not found' });
|
||||||
const wf = rows[0];
|
const wf = rows[0];
|
||||||
let definition = {};
|
let definition = {};
|
||||||
try { definition = JSON.parse(wf.definition || '{}'); } catch { /* corrupt definition — return empty */ }
|
try {
|
||||||
|
definition = typeof wf.definition === 'string'
|
||||||
|
? JSON.parse(wf.definition || '{}')
|
||||||
|
: (wf.definition || {});
|
||||||
|
} catch { /* corrupt definition — return empty */ }
|
||||||
res.json({ ...wf, definition });
|
res.json({ ...wf, definition });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[API] GET /api/workflows/:id error:', error);
|
console.error('[API] GET /api/workflows/:id error:', error);
|
||||||
@@ -1659,7 +1663,11 @@ app.get('/api/internal/executions/:id', authenticateGandalf, async (req, res) =>
|
|||||||
}
|
}
|
||||||
const execution = rows[0];
|
const execution = rows[0];
|
||||||
let logs = [];
|
let logs = [];
|
||||||
try { logs = JSON.parse(execution.logs || '[]'); } catch { logs = []; }
|
try {
|
||||||
|
logs = typeof execution.logs === 'string'
|
||||||
|
? JSON.parse(execution.logs || '[]')
|
||||||
|
: (execution.logs || []);
|
||||||
|
} catch { logs = []; }
|
||||||
res.json({ ...execution, logs });
|
res.json({ ...execution, logs });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('[API] GET /api/internal/executions/:id error:', error);
|
console.error('[API] GET /api/internal/executions/:id error:', error);
|
||||||
|
|||||||
Reference in New Issue
Block a user