From 2c1957677fc981bcabf7384c3abcc19f594d3fd1 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Mon, 1 Jun 2020 12:14:21 +0300 Subject: [PATCH] Add second provider --- data_providers/avtocod.js | 2 +- data_providers/vin01.js | 20 +++++++ models/vehicle.js | 6 +- package-lock.json | 122 +++++++++++++++++++++----------------- package.json | 8 +-- routes/vehicles.js | 32 ++++++++-- 6 files changed, 124 insertions(+), 66 deletions(-) create mode 100644 data_providers/vin01.js diff --git a/data_providers/avtocod.js b/data_providers/avtocod.js index 65a5a4b..e3965ed 100644 --- a/data_providers/avtocod.js +++ b/data_providers/avtocod.js @@ -47,7 +47,7 @@ function waitForReport(pubnubConfig, channel) { } else { reject(new Error('Request timed out')); } - }, 10000); + }, 15000); let pubnub = new PubNub(pubnubConfig); pubnub.addListener({ diff --git a/data_providers/vin01.js b/data_providers/vin01.js new file mode 100644 index 0000000..3cf3544 --- /dev/null +++ b/data_providers/vin01.js @@ -0,0 +1,20 @@ +const fetch = require('node-fetch'); + +const baseUrl = 'https://vin01.ru/v2'; + +class Vin01Provider { + static async getVin(number, token) { + let url = `${baseUrl}/getVin.php?key=${token}&gosNumber=${encodeURIComponent(number)}`; + let result = await fetch(url); + let json = await result.json(); + if(json.success && json.code == 200) { + return json.data.vin; + } else { + console.log('=========================================================='); + console.log(JSON.stringify(json)); + throw Error('Vin01 provider failed to get VIN'); + } + } +} + +module.exports = Vin01Provider; \ No newline at end of file diff --git a/models/vehicle.js b/models/vehicle.js index 9505ff3..4c214d7 100644 --- a/models/vehicle.js +++ b/models/vehicle.js @@ -20,7 +20,7 @@ class Vehicle { //console.log(JSON.stringify(report)); let tech = report.fields.tech_data; if(!tech) { - throw Error("Empty report"); + throw Error('Empty report'); } let e = tech.engine; @@ -49,6 +49,10 @@ class Vehicle { return v; } + + // updateFromVin01(report) { + + // } } module.exports = Vehicle; diff --git a/package-lock.json b/package-lock.json index 19abcbf..4a60757 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,26 +14,26 @@ } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.9.6", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", - "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.8.3", "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/types": "^7.9.5" } }, "@babel/helper-get-function-arity": { @@ -54,6 +54,12 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, "@babel/highlight": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", @@ -66,34 +72,34 @@ } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", "dev": true }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helper-function-name": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" @@ -123,12 +129,12 @@ } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.5", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -221,9 +227,9 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, "ast-types": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", - "integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz", + "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA==" }, "astral-regex": { "version": "1.0.0", @@ -237,15 +243,15 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "babel-eslint": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", - "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", "eslint-visitor-keys": "^1.0.0", "resolve": "^1.12.0" } @@ -293,9 +299,9 @@ } }, "bson": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", - "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", + "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" }, "buffer-equal-constant-time": { "version": "1.0.1", @@ -313,6 +319,11 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "cbor-js": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cbor-js/-/cbor-js-0.1.0.tgz", + "integrity": "sha1-yAzmEg84fo+qdDcN/aIdlluPx/k=" + }, "cbor-sync": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cbor-sync/-/cbor-sync-1.0.4.tgz", @@ -876,9 +887,9 @@ } }, "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" }, "forwarded": { "version": "0.1.2", @@ -1380,12 +1391,12 @@ } }, "mongodb": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.2.tgz", - "integrity": "sha512-Lxt4th2tK2MxmkDBR5cMik+xEnkvhwg0BC5kGcHm9RBwaNEsrIryvV5istGXOHbnif5KslMpY1FbX6YbGJ/Trg==", + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.7.tgz", + "integrity": "sha512-lMtleRT+vIgY/JhhTn1nyGwnSMmJkJELp+4ZbrjctrnBxuLbj6rmLuJFz8W2xUzUqWmqoyVxJLYuC58ZKpcTYQ==", "requires": { "bl": "^2.2.0", - "bson": "^1.1.1", + "bson": "^1.1.4", "denque": "^1.4.1", "require_optional": "^1.0.1", "safe-buffer": "^5.1.2", @@ -1610,16 +1621,17 @@ } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "pubnub": { - "version": "4.27.3", - "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-4.27.3.tgz", - "integrity": "sha512-Wl8MrwMJPJSUCLHhxhQSKdNbpopNPgCVNL5ogDw/fZ8OUn0/6o/V6HTPTAkyurD3LnPCw7M1A7kdBFmpy+Iitw==", + "version": "4.27.6", + "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-4.27.6.tgz", + "integrity": "sha512-+g7rVPiiDNLgDO3Z+oNOpyEVMuNYrulxPqxbVUyFQId4RlNyiiv61vvnTPdq4TiPrEmjcrByTK5+sCrzgUX5NQ==", "requires": { "agentkeepalive": "^3.5.2", + "cbor-js": "^0.1.0", "cbor-sync": "^1.0.4", "lil-uuid": "^0.1.1", "superagent": "^3.8.1", @@ -1683,9 +1695,9 @@ } }, "resolve": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", - "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" diff --git a/package.json b/package.json index 7a382e6..85fe1c4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "AutoCat app backend", "main": "index.js", "scripts": { - "server": "node --async-stack-traces index.js", + "server": "node --async-stack-traces --trace-warnings index.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "Selim Mustafaev", @@ -14,13 +14,13 @@ "express": "^4.17.1", "express-bearer-token": "^2.4.0", "jsonwebtoken": "^8.5.1", - "mongodb": "^3.5.2", + "mongodb": "^3.5.7", "node-fetch": "^2.6.0", - "pubnub": "^4.27.3", + "pubnub": "^4.27.6", "uuid": "^3.4.0" }, "devDependencies": { - "babel-eslint": "^10.0.3", + "babel-eslint": "^10.1.0", "eslint": "^6.8.0" } } diff --git a/routes/vehicles.js b/routes/vehicles.js index b6e1fa9..d8e2b9d 100644 --- a/routes/vehicles.js +++ b/routes/vehicles.js @@ -1,23 +1,45 @@ const express = require('express'); const router = express.Router(); const AvtocodProvider = require('../data_providers/avtocod'); +const Vin01Provider = require('../data_providers/vin01'); const makeError = error => ({ success: false, error }); router.post('/check', async (req, res) => { const number = req.body.number.replace(/ /g, '').toUpperCase(); + const googleIdToken = req.body.googleIdToken; + const forceUpdate = req.body.forceUpdate.toLowerCase() == 'true'; const { login } = req.user; + //console.log('TOKEN: ', req.body.googleIdToken); + let collection = req.db.collection('vehicles'); let vehicles = await collection.find({ number }).toArray(); - if(vehicles.length > 0) { + if(vehicles.length > 0 && !forceUpdate) { res.send({ success: true, data: vehicles[0] }); } else { try { - let vehicle = await AvtocodProvider.getReport(number); - vehicle.addedBy = login; - await collection.insertOne(vehicle); - res.status(201).send({ success: true, data: vehicle }); + let autocodPromise = AvtocodProvider.getReport(number); + let all = [autocodPromise]; + + if(googleIdToken) { + let vin01Promise = Vin01Provider.getVin(number, googleIdToken); + all.push(vin01Promise); + } + let [autocod, vin01] = await Promise.allSettled(all); + if(autocod.status == 'fulfilled') { + let vehicle = autocod.value; + vehicle.addedBy = login; + if(vin01?.status == 'fulfilled') { + vehicle.vin1 = vin01.value; + } else { + console.log(vin01.reason); + } + await collection.replaceOne({ number }, vehicle, { upsert: true }); + res.status(201).send({ success: true, data: vehicle }); + } else { + throw Error(autocod.reason); + } } catch(ex) { res.send(makeError(ex.message)); console.error(ex);