Migrating to ES modules. Adding TG client
This commit is contained in:
parent
6f03bf49c5
commit
d0a0fcb105
@ -10,10 +10,11 @@ PRIVATE_KEY_PATH = "/path/to/privkey.pem"
|
|||||||
|
|
||||||
# Database
|
# Database
|
||||||
|
|
||||||
|
DB_NAME = ""
|
||||||
DB_USER_NAME = ""
|
DB_USER_NAME = ""
|
||||||
DB_USER_PASSWORD = ""
|
DB_USER_PASSWORD = ""
|
||||||
DB_SERVER = ""
|
DB_SERVER = ""
|
||||||
MONGO_CONNECTION_STRING = "mongodb+srv://$DB_USER_NAME:$DB_USER_PASSWORD@$DB_SERVER/autocatdev?retryWrites=true&w=majority"
|
MONGO_CONNECTION_STRING = "mongodb+srv://$DB_USER_NAME:$DB_USER_PASSWORD@$DB_SERVER"
|
||||||
|
|
||||||
# JWT secrets
|
# JWT secrets
|
||||||
|
|
||||||
|
|||||||
@ -25,5 +25,8 @@ module.exports = {
|
|||||||
'always'
|
'always'
|
||||||
],
|
],
|
||||||
'no-console': 0
|
'no-console': 0
|
||||||
|
},
|
||||||
|
'parserOptions': {
|
||||||
|
'sourceType': 'module'
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,4 +1,5 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
_td_database/
|
||||||
node_modules/
|
node_modules/
|
||||||
.env
|
.env
|
||||||
@ -1,13 +1,13 @@
|
|||||||
const crypto = require('crypto');
|
import { createHash, createDecipheriv } from 'crypto';
|
||||||
const Vehicle = require('../models/vehicle');
|
import Vehicle from '../models/vehicle.js';
|
||||||
const DebugInfo = require('../models/DebugInfo');
|
import DebugInfo from '../models/DebugInfo.js';
|
||||||
const { Centrifuge } = require('centrifuge');
|
import { Centrifuge } from 'centrifuge';
|
||||||
const WebSocket = require('ws');
|
import WebSocket from 'ws';
|
||||||
|
|
||||||
const baseUrl = 'https://avtocod.ru/api/v3';
|
const baseUrl = 'https://avtocod.ru/api/v3';
|
||||||
const tokenRefreshUrl = 'https://avtocod.ru/api/centrifuge/refresh';
|
const tokenRefreshUrl = 'https://avtocod.ru/api/centrifuge/refresh';
|
||||||
|
|
||||||
let deviceToken = crypto.createHash('sha256').update(Date.now().toString()).digest().toString('hex');
|
let deviceToken = createHash('sha256').update(Date.now().toString()).digest().toString('hex');
|
||||||
|
|
||||||
const myWs = function (options) {
|
const myWs = function (options) {
|
||||||
return class wsClass extends WebSocket {
|
return class wsClass extends WebSocket {
|
||||||
@ -37,9 +37,9 @@ function decryptReport(report, hash) {
|
|||||||
|
|
||||||
let iv = Buffer.from(encryptedObject.iv, 'base64');
|
let iv = Buffer.from(encryptedObject.iv, 'base64');
|
||||||
let data = Buffer.from(encryptedObject.value, 'base64');
|
let data = Buffer.from(encryptedObject.value, 'base64');
|
||||||
let key = crypto.createHash('sha256').update(hash).digest();
|
let key = createHash('sha256').update(hash).digest();
|
||||||
|
|
||||||
let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
|
let decipher = createDecipheriv('aes-256-cbc', key, iv);
|
||||||
let decrypted = decipher.update(data);
|
let decrypted = decipher.update(data);
|
||||||
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
||||||
|
|
||||||
@ -147,4 +147,4 @@ class AvtocodProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = AvtocodProvider;
|
export default AvtocodProvider;
|
||||||
@ -255,6 +255,6 @@ const regions = [
|
|||||||
{ name: 'Чеченская республика', codes: [20, 95]},
|
{ name: 'Чеченская республика', codes: [20, 95]},
|
||||||
];
|
];
|
||||||
|
|
||||||
module.exports = {
|
export default {
|
||||||
organs, ogr, typeAuto, typeOperation, regions
|
organs, ogr, typeAuto, typeOperation, regions
|
||||||
};
|
};
|
||||||
@ -1,7 +1,7 @@
|
|||||||
const crypto = require('crypto');
|
import { createHash } from 'crypto';
|
||||||
const Utils = require('../utils/utils');
|
import Utils from '../utils/utils.js';
|
||||||
const utf8 = require('utf8');
|
import Utf8 from 'utf8';
|
||||||
const DebugInfo = require('../models/DebugInfo');
|
import DebugInfo from '../models/DebugInfo.js';
|
||||||
|
|
||||||
const baseUrl = 'https://www.nomerogram.ru/api/v1.1';
|
const baseUrl = 'https://www.nomerogram.ru/api/v1.1';
|
||||||
|
|
||||||
@ -17,13 +17,13 @@ class NomerogramProvider {
|
|||||||
let timestamp = Math.floor(Date.now() / 1000);
|
let timestamp = Math.floor(Date.now() / 1000);
|
||||||
let secretSource = appId + number + deviceId + from + timestamp + secretSuffix;
|
let secretSource = appId + number + deviceId + from + timestamp + secretSuffix;
|
||||||
|
|
||||||
let hash = crypto.createHash('sha256');
|
let hash = createHash('sha256');
|
||||||
hash.update(secretSource);
|
hash.update(secretSource);
|
||||||
let secret = hash.digest('hex');
|
let secret = hash.digest('hex');
|
||||||
console.log('secret: ', secret);
|
console.log('secret: ', secret);
|
||||||
|
|
||||||
let url = `${baseUrl}/group/list?from=${from}&carplate=${number}×tamp=${timestamp}&secret=${secret}&app_id=${appId}&device_id=${deviceId}`;
|
let url = `${baseUrl}/group/list?from=${from}&carplate=${number}×tamp=${timestamp}&secret=${secret}&app_id=${appId}&device_id=${deviceId}`;
|
||||||
let result = await fetch(utf8.encode(url), {
|
let result = await fetch(Utf8.encode(url), {
|
||||||
timeout: 5000,
|
timeout: 5000,
|
||||||
headers: { 'User-Agent': userAgent }
|
headers: { 'User-Agent': userAgent }
|
||||||
});
|
});
|
||||||
@ -57,4 +57,4 @@ class NomerogramProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = NomerogramProvider;
|
export default NomerogramProvider;
|
||||||
@ -1,7 +1,7 @@
|
|||||||
const https = require('https');
|
import { Agent } from 'https';
|
||||||
const parser = require('node-html-parser');
|
import { parse } from 'node-html-parser';
|
||||||
|
|
||||||
const httpsAgent = new https.Agent({
|
const httpsAgent = new Agent({
|
||||||
rejectUnauthorized: false
|
rejectUnauthorized: false
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ class RsaProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static parseReport(html) {
|
static parseReport(html) {
|
||||||
let root = parser.parse(html);
|
let root = parse(html);
|
||||||
if(!root) {
|
if(!root) {
|
||||||
throw Error('Failed to parse dkbm response');
|
throw Error('Failed to parse dkbm response');
|
||||||
}
|
}
|
||||||
@ -91,4 +91,4 @@ class RsaProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = RsaProvider;
|
export default RsaProvider;
|
||||||
108
data_providers/tgclient.js
Normal file
108
data_providers/tgclient.js
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
import tdl from 'tdl';
|
||||||
|
import { platform } from 'node:process';
|
||||||
|
|
||||||
|
class TGClient {
|
||||||
|
|
||||||
|
static {
|
||||||
|
let libdir = null;
|
||||||
|
if(platform == 'linux') {
|
||||||
|
libdir = './node_modules/prebuilt-tdlib/prebuilds/tdlib-linux-x64';
|
||||||
|
} else if(platform == 'darwin') {
|
||||||
|
libdir = './node_modules/prebuilt-tdlib/prebuilds/tdlib-macos';
|
||||||
|
}
|
||||||
|
|
||||||
|
tdl.configure({ libdir });
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(apiId, apiHash) {
|
||||||
|
|
||||||
|
this.client = tdl.createClient({
|
||||||
|
apiId: apiId,
|
||||||
|
apiHash: apiHash
|
||||||
|
});
|
||||||
|
|
||||||
|
this.client.on('error', console.error);
|
||||||
|
|
||||||
|
this.client.on('update', update => {
|
||||||
|
//console.log('update: ', update);
|
||||||
|
switch(update._) {
|
||||||
|
case 'updateMessageSendSucceeded':
|
||||||
|
this.sendTasks.get(update.old_message_id)?.resolve(update.message);
|
||||||
|
this.sendTasks.delete(update.old_message_id);
|
||||||
|
break;
|
||||||
|
case 'updateMessageSendFailed':
|
||||||
|
this.sendTasks.get(update.old_message_id)?.reject(Error(update.error_message));
|
||||||
|
this.sendTasks.delete(update.old_message_id);
|
||||||
|
break;
|
||||||
|
case 'updateNewMessage':
|
||||||
|
this.newMessageCallback?.(update.message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.sendTasks = new Map();
|
||||||
|
}
|
||||||
|
|
||||||
|
onNewMessage(callback) {
|
||||||
|
this.newMessageCallback = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
waitAsync(ms) {
|
||||||
|
return new Promise(resolve => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
async login() {
|
||||||
|
await this.client.login();
|
||||||
|
}
|
||||||
|
|
||||||
|
async close() {
|
||||||
|
await this.client.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
async getMe() {
|
||||||
|
return await this.client.invoke({ _: 'getMe'});
|
||||||
|
}
|
||||||
|
|
||||||
|
async findChat(name) {
|
||||||
|
return await this.client.invoke({
|
||||||
|
_: 'searchPublicChat',
|
||||||
|
username: name
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async getSavedMessagesChat() {
|
||||||
|
let me = await this.getMe();
|
||||||
|
return await this.client.invoke({
|
||||||
|
_: 'createPrivateChat',
|
||||||
|
user_id: me.id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async sendMessage(chat, text) {
|
||||||
|
let message = await this.client.invoke({
|
||||||
|
_: 'sendMessage',
|
||||||
|
chat_id: chat.id,
|
||||||
|
input_message_content: {
|
||||||
|
_: 'inputMessageText',
|
||||||
|
text: {
|
||||||
|
_: 'formattedText',
|
||||||
|
text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let sendStatusTask = Promise.withResolvers();
|
||||||
|
this.sendTasks.set(message.id, sendStatusTask);
|
||||||
|
return await sendStatusTask.promise;
|
||||||
|
}
|
||||||
|
|
||||||
|
async viewMessage(id, chatId) {
|
||||||
|
await this.client.invoke({
|
||||||
|
_: 'viewMessages',
|
||||||
|
chat_id: chatId,
|
||||||
|
message_ids: [ id ]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { TGClient };
|
||||||
80
data_providers/tgprovider.js
Normal file
80
data_providers/tgprovider.js
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
import { TGClient } from './tgclient.js';
|
||||||
|
|
||||||
|
class TGProvider {
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.tgClient = new TGClient(869171, 'c3731f831b212a314f71172daf233f9d');
|
||||||
|
this.checksMap = new Map();
|
||||||
|
|
||||||
|
this.tgClient.onNewMessage(message => {
|
||||||
|
if(message.chat_id == this.chat.id) {
|
||||||
|
let messageText = message?.content?.text?.text;
|
||||||
|
if(messageText && messageText.includes('#️⃣')) {
|
||||||
|
let number = this.findFirst(messageText, /Номер: (.*)\n/);
|
||||||
|
if(number) {
|
||||||
|
this.checksMap.get(number).resolve({
|
||||||
|
id: message.id,
|
||||||
|
text: messageText
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
//this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
findFirst(string, regex) {
|
||||||
|
let result = string.match(regex);
|
||||||
|
if(result && result.length > 1) {
|
||||||
|
return result[1];
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async init() {
|
||||||
|
await this.tgClient.login();
|
||||||
|
this.chat = await this.tgClient.findChat('@l0r3m1psum_bot');
|
||||||
|
}
|
||||||
|
|
||||||
|
async close() {
|
||||||
|
await this.tgClient.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
async getReport(number) {
|
||||||
|
try {
|
||||||
|
await this.tgClient.sendMessage(this.chat, number);
|
||||||
|
let waitResponseTask = Promise.withResolvers();
|
||||||
|
this.checksMap.set(number, waitResponseTask);
|
||||||
|
setTimeout(() => {
|
||||||
|
waitResponseTask.reject(Error('TG report timeout'));
|
||||||
|
}, 10000);
|
||||||
|
let { id, text } = await waitResponseTask.promise;
|
||||||
|
await this.tgClient.viewMessage(id, this.chat.id);
|
||||||
|
return this.parseReport(text);
|
||||||
|
} finally {
|
||||||
|
this.checksMap.delete(number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
parseReport(text) {
|
||||||
|
let number = this.findFirst(text, /Номер: (.*)\n/);
|
||||||
|
let vin = this.findFirst(text, /VIN: (.*)\n/);
|
||||||
|
let owner = this.findFirst(text, /Владелец: (.*)\n/);
|
||||||
|
let year = this.findFirst(text, /Год: (.*)\n/);
|
||||||
|
let color = this.findFirst(text, /Цвет: (.*)\n/);
|
||||||
|
let sts = this.findFirst(text, /СТС: (.*)\n/);
|
||||||
|
|
||||||
|
return {
|
||||||
|
number,
|
||||||
|
vin,
|
||||||
|
owner,
|
||||||
|
year,
|
||||||
|
color,
|
||||||
|
sts
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { TGProvider };
|
||||||
@ -1,7 +1,7 @@
|
|||||||
const AbortController = require('abort-controller');
|
import AbortController from 'abort-controller';
|
||||||
const DebugInfo = require('../models/DebugInfo');
|
import DebugInfo from '../models/DebugInfo.js';
|
||||||
const Vehicle = require('../models/vehicle');
|
import Vehicle from '../models/vehicle.js';
|
||||||
const Utils = require('../utils/utils');
|
import Utils from '../utils/utils.js';
|
||||||
|
|
||||||
const baseUrl = 'https://vin01.ru/v2';
|
const baseUrl = 'https://vin01.ru/v2';
|
||||||
const reportBaseUrl = `${baseUrl}/gibddApp.php`;
|
const reportBaseUrl = `${baseUrl}/gibddApp.php`;
|
||||||
@ -148,7 +148,7 @@ class Vin01Provider {
|
|||||||
}
|
}
|
||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
ex.debugInfo = {
|
ex.debugInfo = {
|
||||||
vin01vin: DebugInfo.fromError(ex.message),
|
vin01vin:DebugInfo.fromError(ex.message),
|
||||||
vin01history: DebugInfo.fromError('Not applicable (VIN was not found)'),
|
vin01history: DebugInfo.fromError('Not applicable (VIN was not found)'),
|
||||||
vin01base: DebugInfo.fromError('Not applicable (VIN was not found)')
|
vin01base: DebugInfo.fromError('Not applicable (VIN was not found)')
|
||||||
};
|
};
|
||||||
@ -157,4 +157,4 @@ class Vin01Provider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Vin01Provider;
|
export default Vin01Provider;
|
||||||
42
index.js
42
index.js
@ -1,21 +1,21 @@
|
|||||||
const express = require('express');
|
import express from 'express';
|
||||||
const bodyParser = require('body-parser');
|
import expressMongoDb from './middleware/mongo.js';
|
||||||
const expressMongoDb = require('./middleware/mongo');
|
import users from './routes/user.js';
|
||||||
const users = require('./routes/user');
|
import vehicles from './routes/vehicles.js';
|
||||||
const vehicles = require('./routes/vehicles');
|
import events from './routes/events.js';
|
||||||
const events = require('./routes/events');
|
import notes from './routes/notes.js';
|
||||||
const notes = require('./routes/notes');
|
import bearerToken from 'express-bearer-token';
|
||||||
const app = express();
|
import jwt from './middleware/jwt.js';
|
||||||
const bearerToken = require('express-bearer-token');
|
import { createServer } from 'https';
|
||||||
const jwt = require('./middleware/jwt');
|
import { readFileSync } from 'fs';
|
||||||
const https = require('https');
|
import compression from 'compression';
|
||||||
const fs = require('fs');
|
import { config } from 'dotenv';
|
||||||
const compression = require('compression');
|
import dotenvExpand from 'dotenv-expand';
|
||||||
const dotenv = require('dotenv');
|
import responseTime from 'response-time';
|
||||||
const dotenvExpand = require('dotenv-expand');
|
|
||||||
const responseTime = require('response-time');
|
|
||||||
|
|
||||||
let dotenvConf = dotenv.config();
|
const app = express();
|
||||||
|
|
||||||
|
let dotenvConf = config();
|
||||||
dotenvExpand(dotenvConf);
|
dotenvExpand(dotenvConf);
|
||||||
|
|
||||||
app.use(responseTime(function (req, res, time) {
|
app.use(responseTime(function (req, res, time) {
|
||||||
@ -23,7 +23,7 @@ app.use(responseTime(function (req, res, time) {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
app.use(compression());
|
app.use(compression());
|
||||||
app.use(bodyParser.json());
|
app.use(express.json());
|
||||||
app.use(expressMongoDb(process.env.MONGO_CONNECTION_STRING));
|
app.use(expressMongoDb(process.env.MONGO_CONNECTION_STRING));
|
||||||
app.use(bearerToken());
|
app.use(bearerToken());
|
||||||
app.use(jwt({ secret: process.env.JWT_SECRET_AUTH, exclude: ['/user/signup', '/user/login', '/vehicles/shared_report'] }));
|
app.use(jwt({ secret: process.env.JWT_SECRET_AUTH, exclude: ['/user/signup', '/user/login', '/vehicles/shared_report'] }));
|
||||||
@ -39,9 +39,9 @@ app.use((req, res) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if(process.env.NODE_ENV == 'production') {
|
if(process.env.NODE_ENV == 'production') {
|
||||||
const httpsServer = https.createServer({
|
const httpsServer = createServer({
|
||||||
key: fs.readFileSync(process.env.PRIVATE_KEY_PATH),
|
key: readFileSync(process.env.PRIVATE_KEY_PATH),
|
||||||
cert: fs.readFileSync(process.env.CERT_PATH)
|
cert: readFileSync(process.env.CERT_PATH)
|
||||||
}, app);
|
}, app);
|
||||||
httpsServer.listen(8443);
|
httpsServer.listen(8443);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
const jsonwebtoken = require('jsonwebtoken');
|
import Jwt from 'jsonwebtoken';
|
||||||
|
|
||||||
module.exports = function (options) {
|
export default function (options) {
|
||||||
return function jwt(req, res, next) {
|
return function jwt(req, res, next) {
|
||||||
if('exclude' in options && options.exclude.includes(req.path)) {
|
if('exclude' in options && options.exclude.includes(req.path)) {
|
||||||
next();
|
next();
|
||||||
@ -13,7 +13,7 @@ module.exports = function (options) {
|
|||||||
let scheme = parts[0];
|
let scheme = parts[0];
|
||||||
let token = parts[1];
|
let token = parts[1];
|
||||||
if (/^Bearer$/i.test(scheme)) {
|
if (/^Bearer$/i.test(scheme)) {
|
||||||
jsonwebtoken.verify(token, options.secret, (error, decoded) => {
|
Jwt.verify(token, options.secret, (error, decoded) => {
|
||||||
if(error) {
|
if(error) {
|
||||||
res.status(401).send({ success: false, error: error.message });
|
res.status(401).send({ success: false, error: error.message });
|
||||||
console.error(error);
|
console.error(error);
|
||||||
@ -35,4 +35,4 @@ module.exports = function (options) {
|
|||||||
console.error('Missing authorization header');
|
console.error('Missing authorization header');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
@ -1,6 +1,6 @@
|
|||||||
let MongoClient = require('mongodb').MongoClient;
|
import { MongoClient } from 'mongodb';
|
||||||
|
|
||||||
module.exports = function (uri) {
|
export default function expressMongoDb(uri) {
|
||||||
if (typeof uri !== 'string') {
|
if (typeof uri !== 'string') {
|
||||||
throw new TypeError('Expected uri to be a string');
|
throw new TypeError('Expected uri to be a string');
|
||||||
}
|
}
|
||||||
@ -14,7 +14,7 @@ module.exports = function (uri) {
|
|||||||
|
|
||||||
connection
|
connection
|
||||||
.then(function (client) {
|
.then(function (client) {
|
||||||
req['db'] = client.db('autocat');
|
req['db'] = client.db(process.env.DB_NAME);
|
||||||
next();
|
next();
|
||||||
})
|
})
|
||||||
.catch(function (err) {
|
.catch(function (err) {
|
||||||
@ -22,4 +22,4 @@ module.exports = function (uri) {
|
|||||||
next(err);
|
next(err);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
@ -1,7 +1,7 @@
|
|||||||
class DebugInfo {
|
class DebugInfo {
|
||||||
status
|
status;
|
||||||
fields
|
fields;
|
||||||
error
|
error;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.status = 0;
|
this.status = 0;
|
||||||
@ -29,4 +29,4 @@ class DebugInfo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = DebugInfo;
|
export default DebugInfo;
|
||||||
@ -1,9 +1,9 @@
|
|||||||
class Engine {
|
class Engine {
|
||||||
number
|
number;
|
||||||
volume
|
volume;
|
||||||
type
|
type;
|
||||||
power
|
power;
|
||||||
fuelType
|
fuelType;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Engine;
|
export default Engine;
|
||||||
@ -1,11 +1,11 @@
|
|||||||
class Event {
|
class Event {
|
||||||
id
|
id;
|
||||||
date
|
date;
|
||||||
latitude
|
latitude;
|
||||||
longitude
|
longitude;
|
||||||
speed
|
speed;
|
||||||
direction
|
direction;
|
||||||
address
|
address;
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Event;
|
export default Event;
|
||||||
@ -1,8 +1,8 @@
|
|||||||
const crypto = require('crypto');
|
import { createHash } from 'crypto';
|
||||||
const { v4: uuidv4 } = require('uuid');
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
|
|
||||||
const hash = Symbol();
|
const hash = Symbol();
|
||||||
const sha256 = text => crypto.createHash('sha256').update(text).digest('base64');
|
const sha256 = text => createHash('sha256').update(text).digest('base64');
|
||||||
|
|
||||||
class User {
|
class User {
|
||||||
constructor(email = '', password = '') {
|
constructor(email = '', password = '') {
|
||||||
@ -33,4 +33,4 @@ class User {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = User;
|
export default User;
|
||||||
@ -1,28 +1,28 @@
|
|||||||
const Constants = require('../data_providers/constants');
|
import Constants from '../data_providers/constants.js';
|
||||||
const Utils = require('../utils/utils');
|
import Utils from '../utils/utils.js';
|
||||||
const DebugInfo = require('./DebugInfo');
|
import DebugInfo from './DebugInfo.js';
|
||||||
|
|
||||||
class Vehicle {
|
class Vehicle {
|
||||||
brand
|
brand;
|
||||||
model
|
model;
|
||||||
color
|
color;
|
||||||
year
|
year;
|
||||||
category
|
category;
|
||||||
engine
|
engine;
|
||||||
number
|
number;
|
||||||
currentNumber
|
currentNumber;
|
||||||
vin1
|
vin1;
|
||||||
vin2
|
vin2;
|
||||||
sts
|
sts;
|
||||||
pts
|
pts;
|
||||||
isRightWheel
|
isRightWheel;
|
||||||
isJapanese
|
isJapanese;
|
||||||
photos
|
photos;
|
||||||
addedDate
|
addedDate;
|
||||||
addedBy
|
addedBy;
|
||||||
ownershipPeriods
|
ownershipPeriods;
|
||||||
events
|
events;
|
||||||
notes
|
notes;
|
||||||
|
|
||||||
static fromAvtocod(report) {
|
static fromAvtocod(report) {
|
||||||
//console.log(JSON.stringify(report));
|
//console.log(JSON.stringify(report));
|
||||||
@ -197,4 +197,4 @@ class Vehicle {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Vehicle;
|
export default Vehicle;
|
||||||
|
|||||||
209
package-lock.json
generated
209
package-lock.json
generated
@ -10,7 +10,6 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"abort-controller": "^3.0.0",
|
"abort-controller": "^3.0.0",
|
||||||
"body-parser": "^1.19.0",
|
|
||||||
"centrifuge": "^3.1.0",
|
"centrifuge": "^3.1.0",
|
||||||
"compress": "^0.99.0",
|
"compress": "^0.99.0",
|
||||||
"compression": "^1.7.4",
|
"compression": "^1.7.4",
|
||||||
@ -21,8 +20,10 @@
|
|||||||
"express-bearer-token": "^2.4.0",
|
"express-bearer-token": "^2.4.0",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"mongodb": "^6.3.0",
|
"mongodb": "^6.3.0",
|
||||||
"node-html-parser": "^2.0.0",
|
"node-html-parser": "^6.0.0",
|
||||||
|
"prebuilt-tdlib": "^0.1008026.0",
|
||||||
"response-time": "^2.3.2",
|
"response-time": "^2.3.2",
|
||||||
|
"tdl": "^7.4.1",
|
||||||
"utf8": "^3.0.0",
|
"utf8": "^3.0.0",
|
||||||
"uuid": "^8.3.0",
|
"uuid": "^8.3.0",
|
||||||
"ws": "^8.12.0"
|
"ws": "^8.12.0"
|
||||||
@ -405,28 +406,10 @@
|
|||||||
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/body-parser": {
|
"node_modules/boolbase": {
|
||||||
"version": "1.20.2",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
|
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||||
"integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
|
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
|
||||||
"dependencies": {
|
|
||||||
"bytes": "3.1.2",
|
|
||||||
"content-type": "~1.0.5",
|
|
||||||
"debug": "2.6.9",
|
|
||||||
"depd": "2.0.0",
|
|
||||||
"destroy": "1.2.0",
|
|
||||||
"http-errors": "2.0.0",
|
|
||||||
"iconv-lite": "0.4.24",
|
|
||||||
"on-finished": "2.4.1",
|
|
||||||
"qs": "6.11.0",
|
|
||||||
"raw-body": "2.5.2",
|
|
||||||
"type-is": "~1.6.18",
|
|
||||||
"unpipe": "1.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8",
|
|
||||||
"npm": "1.2.8000 || >= 1.4.16"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.11",
|
"version": "1.1.11",
|
||||||
@ -673,6 +656,32 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/css-select": {
|
||||||
|
"version": "5.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
|
||||||
|
"integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
|
||||||
|
"dependencies": {
|
||||||
|
"boolbase": "^1.0.0",
|
||||||
|
"css-what": "^6.1.0",
|
||||||
|
"domhandler": "^5.0.2",
|
||||||
|
"domutils": "^3.0.1",
|
||||||
|
"nth-check": "^2.0.1"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/fb55"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/css-what": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/fb55"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/debug": {
|
"node_modules/debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
@ -732,6 +741,57 @@
|
|||||||
"node": ">=6.0.0"
|
"node": ">=6.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/dom-serializer": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
|
||||||
|
"dependencies": {
|
||||||
|
"domelementtype": "^2.3.0",
|
||||||
|
"domhandler": "^5.0.2",
|
||||||
|
"entities": "^4.2.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/domelementtype": {
|
||||||
|
"version": "2.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
|
||||||
|
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/fb55"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules/domhandler": {
|
||||||
|
"version": "5.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
|
||||||
|
"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
|
||||||
|
"dependencies": {
|
||||||
|
"domelementtype": "^2.3.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 4"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/fb55/domhandler?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/domutils": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
|
||||||
|
"dependencies": {
|
||||||
|
"dom-serializer": "^2.0.0",
|
||||||
|
"domelementtype": "^2.3.0",
|
||||||
|
"domhandler": "^5.0.3"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/fb55/domutils?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/dotenv": {
|
"node_modules/dotenv": {
|
||||||
"version": "8.6.0",
|
"version": "8.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
|
||||||
@ -766,6 +826,17 @@
|
|||||||
"node": ">= 0.8"
|
"node": ">= 0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/entities": {
|
||||||
|
"version": "4.5.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
|
||||||
|
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.12"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/es-define-property": {
|
"node_modules/es-define-property": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||||
@ -983,6 +1054,11 @@
|
|||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/eventemitter3": {
|
||||||
|
"version": "4.0.7",
|
||||||
|
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
|
||||||
|
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
|
||||||
|
},
|
||||||
"node_modules/events": {
|
"node_modules/events": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
|
||||||
@ -1802,14 +1878,41 @@
|
|||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/node-addon-api": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="
|
||||||
|
},
|
||||||
|
"node_modules/node-gyp-build": {
|
||||||
|
"version": "4.8.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz",
|
||||||
|
"integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==",
|
||||||
|
"bin": {
|
||||||
|
"node-gyp-build": "bin.js",
|
||||||
|
"node-gyp-build-optional": "optional.js",
|
||||||
|
"node-gyp-build-test": "build-test.js"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/node-html-parser": {
|
"node_modules/node-html-parser": {
|
||||||
"version": "2.2.1",
|
"version": "6.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.12.tgz",
|
||||||
"integrity": "sha512-Vccqb62t6t7DkMVwqPQgb0NWO+gUMMDm+1X3LzqbtXLqjilCTtUYTlniKk08yuA1zIhEFVzu/dozpqs5KZbRFQ==",
|
"integrity": "sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"css-select": "^5.1.0",
|
||||||
"he": "1.2.0"
|
"he": "1.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/nth-check": {
|
||||||
|
"version": "2.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
|
||||||
|
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
|
||||||
|
"dependencies": {
|
||||||
|
"boolbase": "^1.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/fb55/nth-check?sponsor=1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/object-assign": {
|
"node_modules/object-assign": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||||
@ -1953,6 +2056,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||||
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
|
"integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
|
||||||
},
|
},
|
||||||
|
"node_modules/prebuilt-tdlib": {
|
||||||
|
"version": "0.1008026.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/prebuilt-tdlib/-/prebuilt-tdlib-0.1008026.0.tgz",
|
||||||
|
"integrity": "sha512-LLlaWPgvTttArop9FnFbjZ+fi5+s7TNiEyil7bTXAdgSBpNvzT1eboNA2Qcej6B9fglPewhtjyu8m91jky564Q=="
|
||||||
|
},
|
||||||
"node_modules/prelude-ls": {
|
"node_modules/prelude-ls": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
||||||
@ -2049,20 +2157,6 @@
|
|||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/raw-body": {
|
|
||||||
"version": "2.5.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
|
|
||||||
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
|
|
||||||
"dependencies": {
|
|
||||||
"bytes": "3.1.2",
|
|
||||||
"http-errors": "2.0.0",
|
|
||||||
"iconv-lite": "0.4.24",
|
|
||||||
"unpipe": "1.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/resolve-from": {
|
"node_modules/resolve-from": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
||||||
@ -2317,6 +2411,39 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tdl": {
|
||||||
|
"version": "7.4.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/tdl/-/tdl-7.4.1.tgz",
|
||||||
|
"integrity": "sha512-7EkVpgAndBAd+jMeRR+FI3v/Y0iy0bmcTDNACqp9Dtg+4AWdLb7fdjbMCEOuL2+ezjoslInXKx9SNWJ1vBT11A==",
|
||||||
|
"hasInstallScript": true,
|
||||||
|
"dependencies": {
|
||||||
|
"debug": "^4.3.4",
|
||||||
|
"eventemitter3": "^4.0.7",
|
||||||
|
"node-addon-api": "^6.0.0",
|
||||||
|
"node-gyp-build": "^4.6.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tdl/node_modules/debug": {
|
||||||
|
"version": "4.3.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||||
|
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"ms": "2.1.2"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=6.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"supports-color": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/tdl/node_modules/ms": {
|
||||||
|
"version": "2.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||||
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||||
|
},
|
||||||
"node_modules/text-table": {
|
"node_modules/text-table": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
|
||||||
|
|||||||
10
package.json
10
package.json
@ -3,16 +3,16 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "AutoCat app backend",
|
"description": "AutoCat app backend",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"server": "node --async-stack-traces --trace-warnings index.js",
|
"server": "node --js-promise-withresolvers --async-stack-traces --trace-warnings index.js",
|
||||||
"migration": "node --async-stack-traces --trace-warnings migration.js",
|
"migration": "node --js-promise-withresolvers --async-stack-traces --trace-warnings migration.js",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
"author": "Selim Mustafaev",
|
"author": "Selim Mustafaev",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"abort-controller": "^3.0.0",
|
"abort-controller": "^3.0.0",
|
||||||
"body-parser": "^1.19.0",
|
|
||||||
"centrifuge": "^3.1.0",
|
"centrifuge": "^3.1.0",
|
||||||
"compress": "^0.99.0",
|
"compress": "^0.99.0",
|
||||||
"compression": "^1.7.4",
|
"compression": "^1.7.4",
|
||||||
@ -23,8 +23,10 @@
|
|||||||
"express-bearer-token": "^2.4.0",
|
"express-bearer-token": "^2.4.0",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"mongodb": "^6.3.0",
|
"mongodb": "^6.3.0",
|
||||||
"node-html-parser": "^2.0.0",
|
"node-html-parser": "^6.0.0",
|
||||||
|
"prebuilt-tdlib": "^0.1008026.0",
|
||||||
"response-time": "^2.3.2",
|
"response-time": "^2.3.2",
|
||||||
|
"tdl": "^7.4.1",
|
||||||
"utf8": "^3.0.0",
|
"utf8": "^3.0.0",
|
||||||
"uuid": "^8.3.0",
|
"uuid": "^8.3.0",
|
||||||
"ws": "^8.12.0"
|
"ws": "^8.12.0"
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
const express = require('express');
|
import { Router } from 'express';
|
||||||
const router = express.Router();
|
const router = Router();
|
||||||
const { v4: uuidv4 } = require('uuid');
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
const Utils = require('../utils/utils');
|
import Utils from '../utils/utils.js';
|
||||||
|
|
||||||
const makeError = error => ({ success: false, error });
|
const makeError = error => ({ success: false, error });
|
||||||
|
|
||||||
@ -99,4 +99,4 @@ router.get('/', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = router;
|
export default router;
|
||||||
@ -1,6 +1,6 @@
|
|||||||
const express = require('express');
|
import { Router } from 'express';
|
||||||
const router = express.Router();
|
const router = Router();
|
||||||
const { makeError } = require('../utils/errors');
|
import { makeError } from '../utils/errors.js';
|
||||||
|
|
||||||
router.post('/', async (req, res) => {
|
router.post('/', async (req, res) => {
|
||||||
const { number, notes } = req.body;
|
const { number, notes } = req.body;
|
||||||
@ -67,4 +67,4 @@ router.delete('/', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = router;
|
export default router;
|
||||||
@ -1,8 +1,9 @@
|
|||||||
const express = require('express');
|
import { Router } from 'express';
|
||||||
const router = express.Router();
|
import Jwt from 'jsonwebtoken';
|
||||||
const jwt = require('jsonwebtoken');
|
import User from '../models/user.js';
|
||||||
const User = require('../models/user');
|
import { errorCodes, makeError } from '../utils/errors.js';
|
||||||
const { errorCodes, makeError } = require('../utils/errors');
|
|
||||||
|
const router = Router();
|
||||||
|
|
||||||
router.post('/signup', async (req, res) => {
|
router.post('/signup', async (req, res) => {
|
||||||
const { email, password } = req.body;
|
const { email, password } = req.body;
|
||||||
@ -13,7 +14,7 @@ router.post('/signup', async (req, res) => {
|
|||||||
if(users.length == 0) {
|
if(users.length == 0) {
|
||||||
let user = new User(email, password);
|
let user = new User(email, password);
|
||||||
await collection.insertOne(user.toDB());
|
await collection.insertOne(user.toDB());
|
||||||
user.token = jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
user.token = Jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
||||||
res.send({ success: true, data: user });
|
res.send({ success: true, data: user });
|
||||||
} else {
|
} else {
|
||||||
res.send(makeError('User already exists'));
|
res.send(makeError('User already exists'));
|
||||||
@ -40,7 +41,7 @@ router.post('/login', async (req, res) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
me.token = jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
me.token = Jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
||||||
res.send({ success: true, data: me });
|
res.send({ success: true, data: me });
|
||||||
} else {
|
} else {
|
||||||
res.send(makeError('Incorrect login or password', errorCodes.invalidLoginOrPassword));
|
res.send(makeError('Incorrect login or password', errorCodes.invalidLoginOrPassword));
|
||||||
@ -67,12 +68,12 @@ router.post('/signIn', async (req, res) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
me.token = jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
me.token = Jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
||||||
res.send({ success: true, data: me });
|
res.send({ success: true, data: me });
|
||||||
} else {
|
} else {
|
||||||
let user = new User(email, password);
|
let user = new User(email, password);
|
||||||
await users.insertOne(user.toDB());
|
await users.insertOne(user.toDB());
|
||||||
user.token = jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
user.token = Jwt.sign({ email }, process.env.JWT_SECRET_AUTH, { expiresIn: process.env.JWT_EXPIRATION_TIME });
|
||||||
res.send({ success: true, data: user });
|
res.send({ success: true, data: user });
|
||||||
}
|
}
|
||||||
} catch(ex) {
|
} catch(ex) {
|
||||||
@ -106,4 +107,4 @@ router.get('/find', async (req, res) => {
|
|||||||
res.status(code).send({ success: true, data: { users } });
|
res.status(code).send({ success: true, data: { users } });
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = router;
|
export default router;
|
||||||
|
|||||||
@ -1,16 +1,18 @@
|
|||||||
const express = require('express');
|
import { Router } from 'express';
|
||||||
const router = express.Router();
|
import Jwt from 'jsonwebtoken';
|
||||||
const jwt = require('jsonwebtoken');
|
import cors from 'cors';
|
||||||
const cors = require('cors');
|
import AvtocodProvider from '../data_providers/avtocod.js';
|
||||||
const AvtocodProvider = require('../data_providers/avtocod');
|
import Vin01Provider from '../data_providers/vin01.js';
|
||||||
const Vin01Provider = require('../data_providers/vin01');
|
import Constants from '../data_providers/constants.js';
|
||||||
const { regions } = require('../data_providers/constants');
|
import RsaProvider from '../data_providers/rsa.js';
|
||||||
const RsaProvider = require('../data_providers/rsa');
|
import NomerogramProvider from '../data_providers/nomerogram.js';
|
||||||
const NomerogramProvider = require('../data_providers/nomerogram');
|
import Utils from '../utils/utils.js';
|
||||||
const Utils = require('../utils/utils');
|
import { ObjectId } from 'mongodb';
|
||||||
const ObjectId = require('mongodb').ObjectId;
|
import DebugInfo from '../models/DebugInfo.js';
|
||||||
const DebugInfo = require('../models/DebugInfo');
|
import Vehicle from '../models/vehicle.js';
|
||||||
const Vehicle = require('../models/vehicle');
|
import { TGProvider } from '../data_providers/tgprovider.js';
|
||||||
|
|
||||||
|
const router = Router();
|
||||||
|
|
||||||
const makeError = error => ({ success: false, error });
|
const makeError = error => ({ success: false, error });
|
||||||
|
|
||||||
@ -231,7 +233,7 @@ router.get('/colors', async (req, res) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
router.get('/regions', (req, res) => {
|
router.get('/regions', (req, res) => {
|
||||||
res.send({ success: true, data: regions });
|
res.send({ success: true, data: Constants.regions });
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get('/years', async (req, res) => {
|
router.get('/years', async (req, res) => {
|
||||||
@ -247,7 +249,7 @@ router.get('/years', async (req, res) => {
|
|||||||
|
|
||||||
router.get('/shared_report', cors({ origin: 'https://auto.aliencat.pro' }), async (req, res) => {
|
router.get('/shared_report', cors({ origin: 'https://auto.aliencat.pro' }), async (req, res) => {
|
||||||
try {
|
try {
|
||||||
let { plateNumber } = jwt.verify(req.query.token, process.env.JWT_SECRET_SHARED_REPORT);
|
let { plateNumber } = Jwt.verify(req.query.token, process.env.JWT_SECRET_SHARED_REPORT);
|
||||||
let collection = req.db.collection('vehicles');
|
let collection = req.db.collection('vehicles');
|
||||||
let vehicles = await collection.find({ number: plateNumber }).toArray();
|
let vehicles = await collection.find({ number: plateNumber }).toArray();
|
||||||
if(vehicles.length > 0) {
|
if(vehicles.length > 0) {
|
||||||
@ -282,4 +284,43 @@ router.post('/checkOsago', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
module.exports = router;
|
router.post('/checkGbTg', async (req, res) => {
|
||||||
|
try {
|
||||||
|
const number = req.body.number.replace(/ /g, '').toUpperCase();
|
||||||
|
|
||||||
|
let tgProvider = new TGProvider();
|
||||||
|
await tgProvider.init();
|
||||||
|
let report = await tgProvider.getReport(number);
|
||||||
|
await tgProvider.close();
|
||||||
|
|
||||||
|
let collection = req.db.collection('vehicles');
|
||||||
|
let vehicle = await collection.findOne({ number });
|
||||||
|
|
||||||
|
if(vehicle) {
|
||||||
|
let vinRegex = RegExp(vehicle.vin1.replace(/\*/g, '.'));
|
||||||
|
//let stsRegex = RegExp(vehicle.sts.replace(/\*/g, '.'));
|
||||||
|
|
||||||
|
if(report.vin.match(vinRegex) /*&& report.sts.match(stsRegex)*/) {
|
||||||
|
let updatedFields = {
|
||||||
|
vin1: report.vin,
|
||||||
|
color: report.color,
|
||||||
|
sts: report.sts,
|
||||||
|
updatedDate: Date.now()
|
||||||
|
}
|
||||||
|
|
||||||
|
await collection.updateOne({ number }, { $set: updatedFields });
|
||||||
|
res.send({ success: true, data: Object.assign(vehicle, updatedFields) });
|
||||||
|
} else {
|
||||||
|
res.send(makeError('Vehicle doesn\'t match'));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
res.send(makeError('Vehicle not found'));
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch(ex) {
|
||||||
|
res.send(makeError(ex.message));
|
||||||
|
console.error(ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
||||||
|
|||||||
@ -27,4 +27,4 @@ const makeError = (error, code) => {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = { errorCodes, makeError };
|
export { errorCodes, makeError };
|
||||||
@ -135,4 +135,4 @@ class Utils {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = Utils;
|
export default Utils;
|
||||||
Loading…
Reference in New Issue
Block a user