From 77347ff29c56a50231b0bc0e8bcd6689703c8326 Mon Sep 17 00:00:00 2001 From: siiky Date: Tue, 17 Jun 2025 11:54:31 +0100 Subject: [PATCH 1/6] refactor: single pass through received frames --- packages/server/lib/machine-loader.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index 405f2fb9..d388ef57 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -683,11 +683,10 @@ function updateDiagnostics(deviceId, images) { const updateFailedQRScans = (deviceId, frames) => { const timestamp = new Date().toISOString() const directory = `${OPERATOR_DATA_DIR}/failedQRScans/${deviceId}/` - const filenames = _.map( - no => `${timestamp}-${no}.jpg`, - _.range(0, _.size(frames)), + return updatePhotos( + directory, + frames.map((frame, no) => [`${timestamp}-${no}.jpg`, frame]), ) - return updatePhotos(directory, _.zip(filenames, frames)) } function createPhoto(name, data, dir) { From 7d9df01eab1ed3ec08d0e2bf0c2d2ca0b56095da Mon Sep 17 00:00:00 2001 From: siiky Date: Tue, 17 Jun 2025 11:55:09 +0100 Subject: [PATCH 2/6] fix: don't let lack of photo data go unnoticed --- packages/server/lib/machine-loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index d388ef57..6eb9d449 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -692,7 +692,7 @@ const updateFailedQRScans = (deviceId, frames) => { function createPhoto(name, data, dir) { if (!data) { logger.error(`Diagnostics error: No data to save for ${name} photo`) - return Promise.resolve() + return Promise.reject() } const decodedImageData = Buffer.from(data, 'base64') From 70b72dc27bdf58d6ee70c20259a93cbe95bd2df7 Mon Sep 17 00:00:00 2001 From: siiky Date: Tue, 17 Jun 2025 11:55:35 +0100 Subject: [PATCH 3/6] feat: propagate photo creation success/failure --- packages/server/lib/machine-loader.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index 6eb9d449..dec771a5 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -703,9 +703,9 @@ function createPhoto(name, data, dir) { function updatePhotos(dir, photoPairs) { const dirname = path.join(dir) _.attempt(() => makeDir.sync(dirname)) - return Promise.all( + return Promise.allSettled( photoPairs.map(([filename, data]) => createPhoto(filename, data, dirname)), - ) + ).then(savedPhotos => savedPhotos.map(res => res.status === 'fulfilled')) } let pendingRecordPings = new Map() From fc649a0b991dc12863c714b013a4d45c5821d726 Mon Sep 17 00:00:00 2001 From: siiky Date: Tue, 17 Jun 2025 11:56:02 +0100 Subject: [PATCH 4/6] fix: update diagnostics timestamps depending on photo creation --- packages/server/lib/machine-loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index dec771a5..922f4990 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -676,7 +676,7 @@ function updateDiagnostics(deviceId, images) { ['scan.jpg', scan], ['front.jpg', front], ]) - .then(() => db.none(sql, [deviceId, !!scan, !!front])) + .then(([scan, front]) => db.none(sql, [deviceId, scan, front])) .catch(err => logger.error('while running machine diagnostics: ', err)) } From e9d219bc6c7b0cf2eedcd449e2bedeb673e63595 Mon Sep 17 00:00:00 2001 From: siiky Date: Tue, 17 Jun 2025 11:58:41 +0100 Subject: [PATCH 5/6] fix: put diagnostic timestamps in the right fields --- packages/server/lib/machine-loader.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/server/lib/machine-loader.js b/packages/server/lib/machine-loader.js index 922f4990..8e822fad 100644 --- a/packages/server/lib/machine-loader.js +++ b/packages/server/lib/machine-loader.js @@ -61,11 +61,11 @@ function toMachineObject(r) { timestamp: r.diagnostics_timestamp ? new Date(r.diagnostics_timestamp) : null, - scanTimestamp: r.diagnostics_scan_timestamp - ? new Date(r.diagnostics_scan_timestamp) + scanTimestamp: r.diagnostics_scan_updated_at + ? new Date(r.diagnostics_scan_updated_at) : null, - frontTimestamp: r.diagnostics_front_timestamp - ? new Date(r.diagnostics_front_timestamp) + frontTimestamp: r.diagnostics_front_updated_at + ? new Date(r.diagnostics_front_updated_at) : null, }, pairedAt: new Date(r.created), From 7f5b0bbbf59694cc1483dfd5f4f44b8c22d24025 Mon Sep 17 00:00:00 2001 From: siiky Date: Tue, 17 Jun 2025 12:00:38 +0100 Subject: [PATCH 6/6] fix: don't try to show diagnostics if they're missing --- .../machineActions/DiagnosticsModal.jsx | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx b/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx index 2d3faab1..d8915465 100644 --- a/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx +++ b/packages/admin-ui/src/components/machineActions/DiagnosticsModal.jsx @@ -56,6 +56,7 @@ const createCsv = async ({ machineLogsCsv }) => { const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { const [state, setState] = useState(STATES.INITIAL) const [timestamp, setTimestamp] = useState(null) + const [diagnosticTimestamps, setDiagnosticTimestamps] = useState({}) const timeoutRef = useRef(null) const [fetchSummary, { loading }] = useLazyQuery(MACHINE_LOGS, { @@ -81,6 +82,10 @@ const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { timeoutRef.current = null } setTimestamp(data.machine.diagnostics.timestamp) + setDiagnosticTimestamps({ + front: data.machine.diagnostics.frontTimestamp, + scan: data.machine.diagnostics.scanTimestamp, + }) setState(STATES.FILLED) stopPolling() } @@ -95,8 +100,6 @@ const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { } }, []) - const path = `/operator-data/diagnostics/${deviceId}/` - const runDiagnostics = () => { setState(STATES.RUNNING) startPolling(2000) @@ -116,6 +119,18 @@ const DiagnosticsModal = ({ onClose, deviceId, sendAction }) => { const messageClass = 'm-auto flex flex-col items-center justify-center' + const showPhoto = diagnosticName => { + console.log(diagnosticName, diagnosticTimestamps) + return diagnosticTimestamps[diagnosticName] ? ( + + ) : ( + <>Failed getting photo + ) + } + return ( { {state === STATES.FILLED && (
-
+

Scan

- Failure getting photo + {showPhoto('scan')}

Front

- Failure getting photo -

+ {showPhoto('front')}