From 35f0bd84a2ee527c43c269ed768ddd94e8c590ca Mon Sep 17 00:00:00 2001 From: jecihjoy Date: Thu, 3 Dec 2020 12:28:02 +0300 Subject: [PATCH] Implemented node script for mass assignment of ccc identifiers (#1005) --- package-lock.json | 191 +++++++++++++++++- package.json | 1 + worker/identifier-auto-asignment/cccids.csv | 2 + .../identifier-auto-asignment.js | 153 ++++++++++++++ 4 files changed, 338 insertions(+), 9 deletions(-) create mode 100644 worker/identifier-auto-asignment/cccids.csv create mode 100644 worker/identifier-auto-asignment/identifier-auto-asignment.js diff --git a/package-lock.json b/package-lock.json index dc9fb0f58..0e344a7f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -73,6 +73,31 @@ } } }, + "@fast-csv/format": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.1.tgz", + "integrity": "sha512-Ap6KSt0iJlzrivZU4grQzDGGOQ+vN5kvUeOHLF1BE7nWri1auiodgS3SCffvLe1Zvu79tACe1tw3dyBADk1NsA==", + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.2.tgz", + "integrity": "sha512-smFKL1E00zy6SB+MIRL4kJq4ba4Is9mHEf+1kdMH7iLInrKszADyJFGicoRfiFTtAvm+661LJMWjyQHrmx6WeA==", + "requires": { + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1891,6 +1916,12 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2587,6 +2618,15 @@ "yaml": "^1.10.0" } }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "^1.0.0" + } + }, "create-thenable": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/create-thenable/-/create-thenable-1.0.2.tgz", @@ -3276,6 +3316,23 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, + "fast-csv": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.2.tgz", + "integrity": "sha512-tmvVMsliprsl7P1z++XuhfGZPTz/h2sTLhs5PYVhtOSsu7t0T2q1TdWq/CORQsD9Cc2oPiTchpf7gACLXArNYQ==", + "requires": { + "@fast-csv/format": "4.3.1", + "@fast-csv/parse": "4.3.2", + "@types/node": "^14.0.1" + }, + "dependencies": { + "@types/node": { + "version": "14.11.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", + "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==" + } + } + }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -5226,6 +5283,12 @@ "url-parse-lax": "^1.0.0" } }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", @@ -5240,6 +5303,12 @@ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, "is-set": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz", @@ -5434,12 +5503,6 @@ } } }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -5507,11 +5570,69 @@ }, "keyv": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "json-buffer": "3.0.0" + "package-json": "^4.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + } + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + } + }, + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dev": true, + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "^1.0.1" + } + } } }, "kind-of": { @@ -5843,11 +5964,51 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=" + }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha1-SeKM1VkBNFjIFMVHnTxmOiG/qmw=" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, "log": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/log/-/log-6.0.0.tgz", @@ -11709,6 +11870,12 @@ } } }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -12082,6 +12249,12 @@ } } }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, "update-notifier": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", diff --git a/package.json b/package.json index 20c4df8e3..0e5368bc6 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "elastic.js": "^1.2.0", "elasticsearch": "^15.2.0", "express": "^4.13.4", + "fast-csv": "^4.3.2", "fs": "0.0.2", "good": "^6.1.0", "good-console": "^5.0.0", diff --git a/worker/identifier-auto-asignment/cccids.csv b/worker/identifier-auto-asignment/cccids.csv new file mode 100644 index 000000000..7a3bb6f15 --- /dev/null +++ b/worker/identifier-auto-asignment/cccids.csv @@ -0,0 +1,2 @@ +"15204-40309","2f5c0593-55b4-462b-ac33-f492479bb69c" +"15204-40310","aefed1ca-657a-4028-8039-2677bcbd3584" \ No newline at end of file diff --git a/worker/identifier-auto-asignment/identifier-auto-asignment.js b/worker/identifier-auto-asignment/identifier-auto-asignment.js new file mode 100644 index 000000000..7d6b89e6c --- /dev/null +++ b/worker/identifier-auto-asignment/identifier-auto-asignment.js @@ -0,0 +1,153 @@ +const fs = require('fs'); +const csv = require('@fast-csv/parse'); + +const curl = require('curlrequest'); +const config = require('../../conf/config.json'); +const e = require('express'); + +const stream = fs.createReadStream(__dirname + '/cccids.csv'); + +const error_file = __dirname + '/ccc-errors.csv'; + +fs.exists(error_file, function (exists) { + if (exists) { + fs.unlink(error_file, function (err) { + if (err) throw err; + console.log('successfully deleted ' + error_file); + }); + } +}); + +csv + .parseStream(stream) + .on('error', (error) => console.error(error)) + .on('data', (row) => { + stream.pause(); + + checkIfIdentifierExists(row[1]).then((d) => { + if (d == false) { + postIdentifier(row).then((d) => { + if (d.error) { + fs.appendFileSync(error_file, d.error.message + '\r\n'); + } + stream.resume(); + }); + } else if (d.identifier != row[0]) { + updateIdentifier(row, d.uuid) + .then((d) => { + if (d.error) { + fs.appendFileSync(error_file, d.error.message + '\r\n'); + } + stream.resume(); + }) + .catch((err) => { + console.log('err', err); + }); + } else { + stream.resume(); + } + }); + }) + .on('end', (rowCount) => console.log(`Parsed ${rowCount} rows`)); + +function checkIfIdentifierExists(patientUuid) { + const config = setupAmrs(patientUuid); + + var options = { + url: config.url, + headers: { + 'Content-Type': 'application/json', + Authorization: config.auth + }, + method: 'GET' + }; + return new Promise(function (resolve, reject) { + curl.request(options, function (err, data) { + const res = JSON.parse(data); + res.results.forEach((identifier) => { + if ( + identifier.identifierType.uuid == + 'f2d6ff1a-8440-4d35-a150-1d4b5a930c5e' + ) { + resolve(identifier); + } else { + resolve(false); + } + }); + }); + }); +} + +function updateIdentifier(patientId, uuid) { + const payload = JSON.stringify(createPayload(patientId)); + const config = setupAmrs(patientId[1]); + + const url = config.url + '/' + uuid; + + var options = { + url: url, + data: payload, + headers: { + 'Content-Type': 'application/json', + Authorization: config.auth + }, + method: 'POST' + }; + return new Promise(function (resolve, reject) { + try { + curl.request(options, function (err, data) { + resolve(JSON.parse(data)); + }); + } catch (e) { + console.log('err ', e); + reject(e); + } + }); +} + +function postIdentifier(patientId) { + const payload = JSON.stringify(createPayload(patientId)); + const config = setupAmrs(patientId[1]); + + console.log(config.url); + + var options = { + url: config.url, + data: payload, + headers: { + 'Content-Type': 'application/json', + Authorization: config.auth + }, + method: 'POST' + }; + return new Promise(function (resolve, reject) { + try { + curl.request(options, function (err, data) { + resolve(JSON.parse(data)); + }); + } catch (e) { + console.log('err ', e); + reject(e); + } + }); +} + +function setupAmrs(uuid) { + var url = + 'https://ngx.ampath.or.ke/amrs/ws/rest/v1/patient/' + uuid + '/identifier'; + + var usernamePass = + 'username:password'; /* REPLACE WITH AMRS USERNAME AND PASSWORD HERE */ + var auth = 'Basic ' + new Buffer(usernamePass).toString('base64'); + + return { url: url, auth: auth }; +} + +function createPayload(csvData) { + return { + identifier: csvData[0], + identifierType: 'f2d6ff1a-8440-4d35-a150-1d4b5a930c5e', + location: '08fec33a-1352-11df-a1f1-0026b9348838', + preferred: true + }; +}