From 654e7c601ed8e923ee6b470dff7c299f39f33c03 Mon Sep 17 00:00:00 2001 From: Nikola Ubavic <53820106+ubavic@users.noreply.github.com> Date: Thu, 25 Nov 2021 23:53:49 +0100 Subject: [PATCH 1/6] fix: machine unpair feat: add removed_devices table --- lib/pairing.js | 14 +++++++++++- ...637877732001-add_unpaired_devices_table.js | 22 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 migrations/1637877732001-add_unpaired_devices_table.js diff --git a/lib/pairing.js b/lib/pairing.js index 7cdf4a99..7c0e3cef 100644 --- a/lib/pairing.js +++ b/lib/pairing.js @@ -4,6 +4,7 @@ const readFile = pify(fs.readFile) const db = require('./db') const options = require('./options') const logger = require('./logger') +const uuid = require('uuid') // A machine on an older version (no multicassette code) could be paired with a server with multicassette code. // This makes sure that the server stores a default value @@ -17,13 +18,24 @@ function pullToken (token) { } function unpair (deviceId) { + const backupSQL = `INSERT INTO + unpaired_devices(id, device_id, name, model, paired, unpaired) + VALUES ( + $1, + $2, + (SELECT name FROM devices WHERE device_id=$2), + (SELECT model FROM devices WHERE device_id=$2), + (SELECT created FROM devices WHERE device_id=$2), + now() + )` + // TODO new-admin: We should remove all configs related to that device. This can get tricky. return db.tx(t => { const q1 = t.none('DELETE FROM devices WHERE device_id=$1', [deviceId]) const q2 = t.none('DELETE FROM machine_pings WHERE device_id=$1', [deviceId]) const q3 = t.none('DELETE FROM machine_network_heartbeat WHERE device_id=$1', [deviceId]) const q4 = t.none('DELETE FROM machine_network_performance WHERE device_id=$1', [deviceId]) - return Promise.all([q1, q2, q3, q4]) + return t.manyOrNone(backupSQL, [uuid.v4(), deviceId]).then(() => Promise.all([q1, q2, q3, q4])) }) } diff --git a/migrations/1637877732001-add_unpaired_devices_table.js b/migrations/1637877732001-add_unpaired_devices_table.js new file mode 100644 index 00000000..8bdbdab5 --- /dev/null +++ b/migrations/1637877732001-add_unpaired_devices_table.js @@ -0,0 +1,22 @@ +var db = require('./db') + +exports.up = function (next) { + var sql = [ + `ALTER TABLE cashbox_batches + DROP CONSTRAINT cashbox_batches_device_id_fkey;`, + `CREATE TABLE IF NOT EXISTS unpaired_devices ( + id uuid PRIMARY KEY, + device_id text NOT NULL, + model text, + name text, + paired timestamp NOT NULL, + unpaired timestamp NOT NULL + )`, + ] + + db.multi(sql, next) +} + +exports.down = function (next) { + next() +} \ No newline at end of file From b0c3ccdea6c47ec7570a79b4ed2c54e6f8653072 Mon Sep 17 00:00:00 2001 From: Nikola Ubavic <53820106+ubavic@users.noreply.github.com> Date: Fri, 26 Nov 2021 13:23:09 +0100 Subject: [PATCH 2/6] fix: sql script chore: use one query --- lib/pairing.js | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/lib/pairing.js b/lib/pairing.js index 7c0e3cef..7eb683a6 100644 --- a/lib/pairing.js +++ b/lib/pairing.js @@ -17,26 +17,23 @@ function pullToken (token) { return db.one(sql, [token]) } +// TODO new-admin: We should remove all configs related to that device. This can get tricky. function unpair (deviceId) { - const backupSQL = `INSERT INTO - unpaired_devices(id, device_id, name, model, paired, unpaired) - VALUES ( - $1, - $2, - (SELECT name FROM devices WHERE device_id=$2), - (SELECT model FROM devices WHERE device_id=$2), - (SELECT created FROM devices WHERE device_id=$2), - now() - )` + const sql = `INSERT INTO + unpaired_devices(id, device_id, name, model, paired, unpaired) + VALUES ( + $1, + $2, + (SELECT name FROM devices WHERE device_id=$2), + (SELECT model FROM devices WHERE device_id=$2), + (SELECT created FROM devices WHERE device_id=$2), + now()); + DELETE FROM devices WHERE device_id=$2; + DELETE FROM machine_pings WHERE device_id=$2; + DELETE FROM machine_network_heartbeat WHERE device_id=$2; + DELETE FROM machine_network_performance WHERE device_id=$2;` - // TODO new-admin: We should remove all configs related to that device. This can get tricky. - return db.tx(t => { - const q1 = t.none('DELETE FROM devices WHERE device_id=$1', [deviceId]) - const q2 = t.none('DELETE FROM machine_pings WHERE device_id=$1', [deviceId]) - const q3 = t.none('DELETE FROM machine_network_heartbeat WHERE device_id=$1', [deviceId]) - const q4 = t.none('DELETE FROM machine_network_performance WHERE device_id=$1', [deviceId]) - return t.manyOrNone(backupSQL, [uuid.v4(), deviceId]).then(() => Promise.all([q1, q2, q3, q4])) - }) + return db.tx(t => t.none(sql, [uuid.v4(), deviceId])) } function pair (token, deviceId, machineModel, numOfCassettes = DEFAULT_NUMBER_OF_CASSETTES) { From 39633e93a9e72b641f6d76192335a5ec221c0032 Mon Sep 17 00:00:00 2001 From: Nikola Ubavic <53820106+ubavic@users.noreply.github.com> Date: Fri, 26 Nov 2021 13:25:10 +0100 Subject: [PATCH 3/6] chore: add a newline --- migrations/1637877732001-add_unpaired_devices_table.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/migrations/1637877732001-add_unpaired_devices_table.js b/migrations/1637877732001-add_unpaired_devices_table.js index 8bdbdab5..fc7ac278 100644 --- a/migrations/1637877732001-add_unpaired_devices_table.js +++ b/migrations/1637877732001-add_unpaired_devices_table.js @@ -19,4 +19,4 @@ exports.up = function (next) { exports.down = function (next) { next() -} \ No newline at end of file +} From eb835b401cfeb5928b477facfb4711c6ef93696b Mon Sep 17 00:00:00 2001 From: Nikola Ubavic <53820106+ubavic@users.noreply.github.com> Date: Mon, 29 Nov 2021 13:44:26 +0100 Subject: [PATCH 4/6] chore: separate queries --- lib/pairing.js | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/lib/pairing.js b/lib/pairing.js index 7eb683a6..d919300d 100644 --- a/lib/pairing.js +++ b/lib/pairing.js @@ -19,21 +19,25 @@ function pullToken (token) { // TODO new-admin: We should remove all configs related to that device. This can get tricky. function unpair (deviceId) { - const sql = `INSERT INTO - unpaired_devices(id, device_id, name, model, paired, unpaired) - VALUES ( - $1, - $2, - (SELECT name FROM devices WHERE device_id=$2), - (SELECT model FROM devices WHERE device_id=$2), - (SELECT created FROM devices WHERE device_id=$2), - now()); - DELETE FROM devices WHERE device_id=$2; - DELETE FROM machine_pings WHERE device_id=$2; - DELETE FROM machine_network_heartbeat WHERE device_id=$2; - DELETE FROM machine_network_performance WHERE device_id=$2;` - - return db.tx(t => t.none(sql, [uuid.v4(), deviceId])) + return db.tx(t => + t.none(`INSERT INTO + unpaired_devices(id, device_id, name, model, paired, unpaired) + VALUES ( + $1, + $2, + (SELECT name FROM devices WHERE device_id=$2), + (SELECT model FROM devices WHERE device_id=$2), + (SELECT created FROM devices WHERE device_id=$2), + now() + )`, [uuid.v4(), deviceId]) + .then(() => { + const q1 = t.none(`DELETE FROM devices WHERE device_id=$1`, [deviceId]) + const q2 = t.none(`DELETE FROM machine_pings WHERE device_id=$1`, [deviceId]) + const q3 = t.none(`DELETE FROM machine_network_heartbeat WHERE device_id=$1`, [deviceId]) + const q4 = t.none(`DELETE FROM machine_network_performance WHERE device_id=$1`, [deviceId]) + return Promise.all([q1, q2, q3, q4]) + }) + ) } function pair (token, deviceId, machineModel, numOfCassettes = DEFAULT_NUMBER_OF_CASSETTES) { From 67742bca3adbe28219b3be0aa4eaf0be23e7c16a Mon Sep 17 00:00:00 2001 From: Nikola Ubavic <53820106+ubavic@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:02:46 +0100 Subject: [PATCH 5/6] fix: use spex batch --- lib/pairing.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pairing.js b/lib/pairing.js index d919300d..b848b859 100644 --- a/lib/pairing.js +++ b/lib/pairing.js @@ -35,7 +35,7 @@ function unpair (deviceId) { const q2 = t.none(`DELETE FROM machine_pings WHERE device_id=$1`, [deviceId]) const q3 = t.none(`DELETE FROM machine_network_heartbeat WHERE device_id=$1`, [deviceId]) const q4 = t.none(`DELETE FROM machine_network_performance WHERE device_id=$1`, [deviceId]) - return Promise.all([q1, q2, q3, q4]) + return t.batch([q1, q2, q3, q4]) }) ) } From bcad921edd1f550a9b93d6d6643b68ed6e169fba Mon Sep 17 00:00:00 2001 From: Nikola Ubavic <53820106+ubavic@users.noreply.github.com> Date: Wed, 1 Dec 2021 18:04:26 +0100 Subject: [PATCH 6/6] chore: accept suggestion --- lib/pairing.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/lib/pairing.js b/lib/pairing.js index b848b859..55cddc98 100644 --- a/lib/pairing.js +++ b/lib/pairing.js @@ -20,16 +20,11 @@ function pullToken (token) { // TODO new-admin: We should remove all configs related to that device. This can get tricky. function unpair (deviceId) { return db.tx(t => - t.none(`INSERT INTO - unpaired_devices(id, device_id, name, model, paired, unpaired) - VALUES ( - $1, - $2, - (SELECT name FROM devices WHERE device_id=$2), - (SELECT model FROM devices WHERE device_id=$2), - (SELECT created FROM devices WHERE device_id=$2), - now() - )`, [uuid.v4(), deviceId]) + t.none(`INSERT INTO unpaired_devices(id, device_id, name, model, paired, unpaired) + SELECT $1, $2, d.name, d.model, d.created, now() + FROM devices d + WHERE device_id=$2` + , [uuid.v4(), deviceId]) .then(() => { const q1 = t.none(`DELETE FROM devices WHERE device_id=$1`, [deviceId]) const q2 = t.none(`DELETE FROM machine_pings WHERE device_id=$1`, [deviceId])