From 86dfca60c1514dcc23d4d969215dfb19d48692e7 Mon Sep 17 00:00:00 2001 From: Josh Harvey Date: Sat, 3 Feb 2018 14:32:05 +0200 Subject: [PATCH] Add id-card compliance --- lib/customers.js | 30 ++++-- lib/db.js | 7 +- lib/route-helpers.js | 8 +- lib/routes.js | 14 +++ package-lock.json | 217 ++++--------------------------------------- package.json | 1 + 6 files changed, 67 insertions(+), 210 deletions(-) diff --git a/lib/customers.js b/lib/customers.js index 6db8a819..931cea0b 100644 --- a/lib/customers.js +++ b/lib/customers.js @@ -57,9 +57,12 @@ function get (phone) { */ function update (id, data, userToken) { const formattedData = _.omit(['id'], _.mapKeys(_.snakeCase, data)) - const updateData = enhanceOverrideFields(formattedData, userToken) + + const updateData = enhanceAtFields(enhanceOverrideFields(formattedData, userToken)) + const sql = Pgp.helpers.update(updateData, _.keys(updateData), 'customers') + ' where id=$1 returning *' + return db.one(sql, [id]) .then(addComplianceOverrides(id, updateData, userToken)) .then(populateOverrideUsernames) @@ -100,11 +103,11 @@ function getById (id, userToken) { */ function getDailyVolume (id) { return Promise.all([ - db.one(`select coalesce(sum(fiat), 0) as total from cash_in_txs - where customer_id=$1 + db.one(`select coalesce(sum(fiat), 0) as total from cash_in_txs + where customer_id=$1 and created > now() - interval '1 day'`, [id]), - db.one(`select coalesce(sum(fiat), 0) as total from cash_out_txs - where customer_id=$1 + db.one(`select coalesce(sum(fiat), 0) as total from cash_out_txs + where customer_id=$1 and created > now() - interval '1 day'`, [id]) ]).then(([cashInTotal, cashOutTotal]) => { return BN(cashInTotal.total).add(cashOutTotal.total) @@ -161,6 +164,21 @@ function getComplianceTypes () { 'authorized' ] } +function enhanceAtFields (fields) { + const updateableFields = [ + 'id_card_data', + 'id_card_photo', + 'front_camera', + 'sanctions', + 'authorized' + ] + + const updatedFields = _.intersection(updateableFields, _.keys(fields)) + const atFields = _.fromPairs(_.map(f => [`${f}_at`, 'now()^'], updatedFields)) + + return _.merge(fields, atFields) +} + /** * Add *override_by and *override_at fields with acting user's token * and date of override respectively before saving to db. @@ -298,7 +316,7 @@ function populateOverrideUsernames (customer) { * @returns {array} Array of customers populated with status field */ function batch () { - const sql = `select * from customers + const sql = `select * from customers where id != $1 order by created desc limit $2` return db.any(sql, [ anonymous.uuid, NUM_RESULTS ]) diff --git a/lib/db.js b/lib/db.js index a68c9b00..bed67ddf 100644 --- a/lib/db.js +++ b/lib/db.js @@ -5,8 +5,11 @@ const logger = require('./logger') const pgp = Pgp({ pgNative: true, error: (err, e) => { - if (e.cn) return logger.error('Database not reachable.') - if (e.query) return + if (e.cn) logger.error('Database not reachable.') + if (e.query) { + logger.error(e.query) + logger.error(e.params) + } logger.error(err) } }) diff --git a/lib/route-helpers.js b/lib/route-helpers.js index 2fe8fafe..fdfa114b 100644 --- a/lib/route-helpers.js +++ b/lib/route-helpers.js @@ -110,4 +110,10 @@ function updateMachineDefaults (deviceId) { }) } -module.exports = {stateChange, fetchPhoneTx, fetchStatusTx, updateDeviceConfigVersion, updateMachineDefaults} +module.exports = { + stateChange, + fetchPhoneTx, + fetchStatusTx, + updateDeviceConfigVersion, + updateMachineDefaults +} diff --git a/lib/routes.js b/lib/routes.js index 86882de9..8f169e24 100644 --- a/lib/routes.js +++ b/lib/routes.js @@ -177,6 +177,18 @@ function getCustomerWithPhoneCode (req, res, next) { .catch(next) } +function updateCustomer (req, res, next) { + const id = req.params.id + const patch = req.body + customers.getById(id) + .then(customer => { + if (!customer) { throw httpError('Not Found', 404)} + return customers.update(id, patch) + }) + .then(customer => respond(req, res, {customer})) + .catch(next) +} + function getLastSeen (req, res, next) { return logs.getLastSeen(req.deviceId) .then(r => res.json(r)) @@ -304,6 +316,8 @@ app.post('/verify_user', verifyUser) app.post('/verify_transaction', verifyTx) app.post('/phone_code', getCustomerWithPhoneCode) +app.patch('/customer/:id', updateCustomer) + app.post('/tx', postTx) app.get('/tx/:id', getTx) app.get('/tx', getPhoneTx) diff --git a/package-lock.json b/package-lock.json index 4913c4a1..eaa7ce7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1154,7 +1154,7 @@ "bitcore-lib": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/bitcore-lib/-/bitcore-lib-0.15.0.tgz", - "integrity": "sha512-AeXLWhiivF6CDFzrABZHT4jJrflyylDWTi32o30rF92HW9msfuKpjzrHtFKYGa9w0kNVv5HABQjCB3OEav4PhQ==", + "integrity": "sha1-+SS+E4afKqt+BK7sVkKtM1m2zsI=", "requires": { "bn.js": "4.11.8", "bs58": "4.0.1", @@ -1184,38 +1184,6 @@ } } }, - "bitcore-lib-cash": { - "version": "git+https://github.com/bitpay/bitcore-lib.git#8f2633b5c1b5554f29847344c477f10d39c68455", - "requires": { - "bn.js": "4.11.8", - "bs58": "4.0.1", - "buffer-compare": "1.1.1", - "elliptic": "6.4.0", - "inherits": "2.0.1", - "lodash": "4.17.4", - "phantomjs-prebuilt": "2.1.16" - }, - "dependencies": { - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", - "requires": { - "base-x": "3.0.2" - } - }, - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" - } - } - }, "bitgo": { "version": "3.4.11", "resolved": "https://registry.npmjs.org/bitgo/-/bitgo-3.4.11.tgz", @@ -1966,16 +1934,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" - } - }, "configstore": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", @@ -2619,11 +2577,6 @@ "integrity": "sha1-7sXHJurO9Rt/a3PCDbbhsTsGnJg=", "dev": true }, - "es6-promise": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", - "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2950,40 +2903,6 @@ "is-extglob": "1.0.0" } }, - "extract-zip": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", - "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", - "requires": { - "concat-stream": "1.6.0", - "debug": "2.6.9", - "mkdirp": "0.5.0", - "yauzl": "2.4.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", - "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "requires": { - "minimist": "0.0.8" - } - } - } - }, "extsprintf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", @@ -2999,14 +2918,6 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "requires": { - "pend": "1.2.0" - } - }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", @@ -3147,16 +3058,6 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=" }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4615,15 +4516,6 @@ "minimalistic-assert": "1.0.0" } }, - "hasha": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", - "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "requires": { - "is-stream": "1.1.0", - "pinkie-promise": "2.0.1" - } - }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", @@ -5159,7 +5051,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isobject": { "version": "2.1.0", @@ -5356,14 +5249,6 @@ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } - }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -5443,11 +5328,6 @@ "sha3": "1.2.0" } }, - "kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -5457,21 +5337,6 @@ "is-buffer": "1.1.5" } }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "kraken-api": { - "version": "github:DeX3/npm-kraken-api#ca939e6dd6c6cd9d3ca9a6ee52dc2170a8d25978", - "requires": { - "querystring": "0.2.0", - "request": "2.81.0" - } - }, "last-line-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/last-line-stream/-/last-line-stream-1.0.0.tgz", @@ -5630,6 +5495,14 @@ "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" }, + "longjohn": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/longjohn/-/longjohn-0.2.12.tgz", + "integrity": "sha1-fKdEawg2VcN351EiE9x1TVKmSn4=", + "requires": { + "source-map-support": "0.4.15" + } + }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -6410,11 +6283,6 @@ "sha.js": "2.4.8" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" - }, "performance-now": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", @@ -6423,7 +6291,7 @@ "pg": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/pg/-/pg-7.4.1.tgz", - "integrity": "sha512-Pi5qYuXro5PAD9xXx8h7bFtmHgAQEG6/SCNyi7gS3rvb/ZQYDmxKchfB0zYtiSJNWq9iXTsYsHjrM+21eBcN1A==", + "integrity": "sha1-80Ecjd+faSMi/gXnAXoYiOR/ePE=", "requires": { "buffer-writer": "1.0.1", "js-string-escape": "1.0.1", @@ -6466,7 +6334,7 @@ "pg-int8": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" + "integrity": "sha1-lDvUY79bcbQXARX4D478mgwOt4w=" }, "pg-native": { "version": "2.2.0", @@ -6516,7 +6384,7 @@ "pg-promise": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/pg-promise/-/pg-promise-7.4.1.tgz", - "integrity": "sha512-WlELd86G2ucrFbomdn+UfOeLMeFuPd/v8qXvn0rXgcxWfuxkn1fU3nKmaEnNFuDaOykDnO4bkxL6O0vnJi+HHg==", + "integrity": "sha1-uyDjnS0ObUXZLwu6szidHmEXlxo=", "requires": { "manakin": "0.5.1", "pg": "7.4.1", @@ -6549,22 +6417,6 @@ "split": "1.0.0" } }, - "phantomjs-prebuilt": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", - "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", - "requires": { - "es6-promise": "4.2.4", - "extract-zip": "1.6.6", - "fs-extra": "1.0.0", - "hasha": "2.2.0", - "kew": "0.7.0", - "progress": "1.1.8", - "request": "2.81.0", - "request-progress": "2.0.1", - "which": "1.2.14" - } - }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -6748,11 +6600,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" - }, "promise-sequential": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/promise-sequential/-/promise-sequential-1.1.1.tgz", @@ -6906,11 +6753,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, "ramda": { "version": "0.22.1", "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.22.1.tgz", @@ -7205,14 +7047,6 @@ } } }, - "request-progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", - "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "requires": { - "throttleit": "1.0.0" - } - }, "require-precompiled": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/require-precompiled/-/require-precompiled-0.1.0.tgz", @@ -7765,7 +7599,6 @@ "version": "0.4.15", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", - "dev": true, "requires": { "source-map": "0.5.6" }, @@ -7773,8 +7606,7 @@ "source-map": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", - "dev": true + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" } } }, @@ -8047,11 +7879,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -8211,11 +8038,6 @@ "mime-types": "2.1.15" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, "typeforce": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.11.1.tgz", @@ -8408,6 +8230,7 @@ "version": "1.2.14", "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, "requires": { "isexe": "2.0.0" } @@ -8644,14 +8467,6 @@ "y18n": "3.2.1" } }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "requires": { - "fd-slicer": "1.0.1" - } - }, "yeast": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", diff --git a/package.json b/package.json index b2f059ef..136b41be 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "kraken-api": "github:DeX3/npm-kraken-api", "lnd-async": "^1.0.1", "lodash": "^4.17.2", + "longjohn": "^0.2.12", "make-dir": "^1.0.0", "mem": "^1.1.0", "migrate": "^0.2.2",