Add second provider

This commit is contained in:
Selim Mustafaev 2020-06-01 12:14:21 +03:00
parent 26fb90df9c
commit 2c1957677f
6 changed files with 124 additions and 66 deletions

View File

@ -47,7 +47,7 @@ function waitForReport(pubnubConfig, channel) {
} else { } else {
reject(new Error('Request timed out')); reject(new Error('Request timed out'));
} }
}, 10000); }, 15000);
let pubnub = new PubNub(pubnubConfig); let pubnub = new PubNub(pubnubConfig);
pubnub.addListener({ pubnub.addListener({

20
data_providers/vin01.js Normal file
View File

@ -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;

View File

@ -20,7 +20,7 @@ class Vehicle {
//console.log(JSON.stringify(report)); //console.log(JSON.stringify(report));
let tech = report.fields.tech_data; let tech = report.fields.tech_data;
if(!tech) { if(!tech) {
throw Error("Empty report"); throw Error('Empty report');
} }
let e = tech.engine; let e = tech.engine;
@ -49,6 +49,10 @@ class Vehicle {
return v; return v;
} }
// updateFromVin01(report) {
// }
} }
module.exports = Vehicle; module.exports = Vehicle;

122
package-lock.json generated
View File

@ -14,26 +14,26 @@
} }
}, },
"@babel/generator": { "@babel/generator": {
"version": "7.8.4", "version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz",
"integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/types": "^7.8.3", "@babel/types": "^7.9.6",
"jsesc": "^2.5.1", "jsesc": "^2.5.1",
"lodash": "^4.17.13", "lodash": "^4.17.13",
"source-map": "^0.5.0" "source-map": "^0.5.0"
} }
}, },
"@babel/helper-function-name": { "@babel/helper-function-name": {
"version": "7.8.3", "version": "7.9.5",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
"integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==", "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/helper-get-function-arity": "^7.8.3", "@babel/helper-get-function-arity": "^7.8.3",
"@babel/template": "^7.8.3", "@babel/template": "^7.8.3",
"@babel/types": "^7.8.3" "@babel/types": "^7.9.5"
} }
}, },
"@babel/helper-get-function-arity": { "@babel/helper-get-function-arity": {
@ -54,6 +54,12 @@
"@babel/types": "^7.8.3" "@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": { "@babel/highlight": {
"version": "7.8.3", "version": "7.8.3",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
@ -66,34 +72,34 @@
} }
}, },
"@babel/parser": { "@babel/parser": {
"version": "7.8.4", "version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz",
"integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==",
"dev": true "dev": true
}, },
"@babel/template": { "@babel/template": {
"version": "7.8.3", "version": "7.8.6",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
"integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/code-frame": "^7.8.3", "@babel/code-frame": "^7.8.3",
"@babel/parser": "^7.8.3", "@babel/parser": "^7.8.6",
"@babel/types": "^7.8.3" "@babel/types": "^7.8.6"
} }
}, },
"@babel/traverse": { "@babel/traverse": {
"version": "7.8.4", "version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz",
"integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/code-frame": "^7.8.3", "@babel/code-frame": "^7.8.3",
"@babel/generator": "^7.8.4", "@babel/generator": "^7.9.6",
"@babel/helper-function-name": "^7.8.3", "@babel/helper-function-name": "^7.9.5",
"@babel/helper-split-export-declaration": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3",
"@babel/parser": "^7.8.4", "@babel/parser": "^7.9.6",
"@babel/types": "^7.8.3", "@babel/types": "^7.9.6",
"debug": "^4.1.0", "debug": "^4.1.0",
"globals": "^11.1.0", "globals": "^11.1.0",
"lodash": "^4.17.13" "lodash": "^4.17.13"
@ -123,12 +129,12 @@
} }
}, },
"@babel/types": { "@babel/types": {
"version": "7.8.3", "version": "7.9.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz",
"integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==",
"dev": true, "dev": true,
"requires": { "requires": {
"esutils": "^2.0.2", "@babel/helper-validator-identifier": "^7.9.5",
"lodash": "^4.17.13", "lodash": "^4.17.13",
"to-fast-properties": "^2.0.0" "to-fast-properties": "^2.0.0"
} }
@ -221,9 +227,9 @@
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
}, },
"ast-types": { "ast-types": {
"version": "0.13.2", "version": "0.13.3",
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.2.tgz", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz",
"integrity": "sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA==" "integrity": "sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA=="
}, },
"astral-regex": { "astral-regex": {
"version": "1.0.0", "version": "1.0.0",
@ -237,15 +243,15 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
}, },
"babel-eslint": { "babel-eslint": {
"version": "10.0.3", "version": "10.1.0",
"resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz", "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
"integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==", "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@babel/code-frame": "^7.0.0", "@babel/code-frame": "^7.0.0",
"@babel/parser": "^7.0.0", "@babel/parser": "^7.7.0",
"@babel/traverse": "^7.0.0", "@babel/traverse": "^7.7.0",
"@babel/types": "^7.0.0", "@babel/types": "^7.7.0",
"eslint-visitor-keys": "^1.0.0", "eslint-visitor-keys": "^1.0.0",
"resolve": "^1.12.0" "resolve": "^1.12.0"
} }
@ -293,9 +299,9 @@
} }
}, },
"bson": { "bson": {
"version": "1.1.3", "version": "1.1.4",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz",
"integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q=="
}, },
"buffer-equal-constant-time": { "buffer-equal-constant-time": {
"version": "1.0.1", "version": "1.0.1",
@ -313,6 +319,11 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
"dev": true "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": { "cbor-sync": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/cbor-sync/-/cbor-sync-1.0.4.tgz", "resolved": "https://registry.npmjs.org/cbor-sync/-/cbor-sync-1.0.4.tgz",
@ -876,9 +887,9 @@
} }
}, },
"formidable": { "formidable": {
"version": "1.2.1", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz",
"integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q=="
}, },
"forwarded": { "forwarded": {
"version": "0.1.2", "version": "0.1.2",
@ -1380,12 +1391,12 @@
} }
}, },
"mongodb": { "mongodb": {
"version": "3.5.2", "version": "3.5.7",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.2.tgz", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.5.7.tgz",
"integrity": "sha512-Lxt4th2tK2MxmkDBR5cMik+xEnkvhwg0BC5kGcHm9RBwaNEsrIryvV5istGXOHbnif5KslMpY1FbX6YbGJ/Trg==", "integrity": "sha512-lMtleRT+vIgY/JhhTn1nyGwnSMmJkJELp+4ZbrjctrnBxuLbj6rmLuJFz8W2xUzUqWmqoyVxJLYuC58ZKpcTYQ==",
"requires": { "requires": {
"bl": "^2.2.0", "bl": "^2.2.0",
"bson": "^1.1.1", "bson": "^1.1.4",
"denque": "^1.4.1", "denque": "^1.4.1",
"require_optional": "^1.0.1", "require_optional": "^1.0.1",
"safe-buffer": "^5.1.2", "safe-buffer": "^5.1.2",
@ -1610,16 +1621,17 @@
} }
}, },
"proxy-from-env": { "proxy-from-env": {
"version": "1.0.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
}, },
"pubnub": { "pubnub": {
"version": "4.27.3", "version": "4.27.6",
"resolved": "https://registry.npmjs.org/pubnub/-/pubnub-4.27.3.tgz", "resolved": "https://registry.npmjs.org/pubnub/-/pubnub-4.27.6.tgz",
"integrity": "sha512-Wl8MrwMJPJSUCLHhxhQSKdNbpopNPgCVNL5ogDw/fZ8OUn0/6o/V6HTPTAkyurD3LnPCw7M1A7kdBFmpy+Iitw==", "integrity": "sha512-+g7rVPiiDNLgDO3Z+oNOpyEVMuNYrulxPqxbVUyFQId4RlNyiiv61vvnTPdq4TiPrEmjcrByTK5+sCrzgUX5NQ==",
"requires": { "requires": {
"agentkeepalive": "^3.5.2", "agentkeepalive": "^3.5.2",
"cbor-js": "^0.1.0",
"cbor-sync": "^1.0.4", "cbor-sync": "^1.0.4",
"lil-uuid": "^0.1.1", "lil-uuid": "^0.1.1",
"superagent": "^3.8.1", "superagent": "^3.8.1",
@ -1683,9 +1695,9 @@
} }
}, },
"resolve": { "resolve": {
"version": "1.15.0", "version": "1.17.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
"integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==", "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
"dev": true, "dev": true,
"requires": { "requires": {
"path-parse": "^1.0.6" "path-parse": "^1.0.6"

View File

@ -4,7 +4,7 @@
"description": "AutoCat app backend", "description": "AutoCat app backend",
"main": "index.js", "main": "index.js",
"scripts": { "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" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"author": "Selim Mustafaev", "author": "Selim Mustafaev",
@ -14,13 +14,13 @@
"express": "^4.17.1", "express": "^4.17.1",
"express-bearer-token": "^2.4.0", "express-bearer-token": "^2.4.0",
"jsonwebtoken": "^8.5.1", "jsonwebtoken": "^8.5.1",
"mongodb": "^3.5.2", "mongodb": "^3.5.7",
"node-fetch": "^2.6.0", "node-fetch": "^2.6.0",
"pubnub": "^4.27.3", "pubnub": "^4.27.6",
"uuid": "^3.4.0" "uuid": "^3.4.0"
}, },
"devDependencies": { "devDependencies": {
"babel-eslint": "^10.0.3", "babel-eslint": "^10.1.0",
"eslint": "^6.8.0" "eslint": "^6.8.0"
} }
} }

View File

@ -1,23 +1,45 @@
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
const AvtocodProvider = require('../data_providers/avtocod'); const AvtocodProvider = require('../data_providers/avtocod');
const Vin01Provider = require('../data_providers/vin01');
const makeError = error => ({ success: false, error }); const makeError = error => ({ success: false, error });
router.post('/check', async (req, res) => { router.post('/check', async (req, res) => {
const number = req.body.number.replace(/ /g, '').toUpperCase(); const number = req.body.number.replace(/ /g, '').toUpperCase();
const googleIdToken = req.body.googleIdToken;
const forceUpdate = req.body.forceUpdate.toLowerCase() == 'true';
const { login } = req.user; const { login } = req.user;
//console.log('TOKEN: ', req.body.googleIdToken);
let collection = req.db.collection('vehicles'); let collection = req.db.collection('vehicles');
let vehicles = await collection.find({ number }).toArray(); let vehicles = await collection.find({ number }).toArray();
if(vehicles.length > 0) { if(vehicles.length > 0 && !forceUpdate) {
res.send({ success: true, data: vehicles[0] }); res.send({ success: true, data: vehicles[0] });
} else { } else {
try { try {
let vehicle = await AvtocodProvider.getReport(number); 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; vehicle.addedBy = login;
await collection.insertOne(vehicle); 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 }); res.status(201).send({ success: true, data: vehicle });
} else {
throw Error(autocod.reason);
}
} catch(ex) { } catch(ex) {
res.send(makeError(ex.message)); res.send(makeError(ex.message));
console.error(ex); console.error(ex);