diff --git a/data_providers/tgprovider.js b/data_providers/tgprovider.js index 1df69ee..edab3b6 100644 --- a/data_providers/tgprovider.js +++ b/data_providers/tgprovider.js @@ -1,5 +1,6 @@ import { TGClient } from './tgclient.js'; import Utils from '../utils/utils.js'; +import Vin01Provider from './vin01.js'; class TGProvider { @@ -43,7 +44,7 @@ class TGProvider { await this.tgClient.close(); } - async getReport(number) { + async getReport(number, vin01token) { try { let waitResponseTask = Utils.promiseWithResolvers(); this.checksMap.set(number, waitResponseTask); @@ -53,7 +54,17 @@ class TGProvider { }, 25000); let { id, text } = await waitResponseTask.promise; await this.tgClient.viewMessage(id, this.chat.id); - return this.parseReport(text); + let report = this.parseReport(text); + + if(vin01token && report.generalInfo.vin) { + console.log('Found vin: ', report.generalInfo.vin); + let vin01report = await Vin01Provider.getReportVin(report.generalInfo.vin, null, vin01token); + if(vin01report.ownershipPeriods?.length > 0) { + report.ownershipPeriods = vin01report.ownershipPeriods; + } + } + + return report; } finally { this.checksMap.delete(number); } diff --git a/data_providers/vin01.js b/data_providers/vin01.js index f626b67..85aa81e 100644 --- a/data_providers/vin01.js +++ b/data_providers/vin01.js @@ -75,77 +75,7 @@ class Vin01Provider { try { let vin = await Vin01Provider.getVin(number, token); console.log('vin01 found VIN: ', vin); - - let checks = [Vin01Provider.runCheck('base', vin, token), Vin01Provider.runCheck('history', vin, token)]; - let [base, history] = (await Promise.allSettled(checks)).map(Vin01Provider.checkErrors); - if(base.status == 'rejected' && history.status == 'rejected') { - console.log('Vin01 base error: ', base.reason.message); - console.log('Vin01 history error: ', history.reason.message); - let vehicle = new Vehicle(); - vehicle.vin1 = Utils.cyrillicToLatin(vin); - vehicle.debugInfo = { - vin01vin: new DebugInfo(), - vin01history: DebugInfo.fromError(history.reason.message), - vin01base: DebugInfo.fromError(base.reason.message) - }; - return vehicle; - } else if(base.status == 'rejected') { - console.log('vin01 found history'); - let vehicle = Vehicle.fromVin01History(history.value); - vehicle.number = number; - Object.assign(vehicle.debugInfo, { - vin01vin: new DebugInfo(), - vin01base: DebugInfo.fromError(base.reason.message) - }); - return vehicle; - } else if(history.status == 'rejected') { - console.log('vin01 found base info'); - let vehicle = Vehicle.fromVin01Base(base.value); - vehicle.number = number; - Object.assign(vehicle.debugInfo, { - vin01vin: new DebugInfo(), - vin01history: DebugInfo.fromError(history.reason.message) - }); - return vehicle; - } else { - // Both history and base reports were successfully received, merge them in one report - let baseVehicle = Vehicle.fromVin01Base(base.value); - let historyVehicle = Vehicle.fromVin01History(history.value); - - historyVehicle.brand.name.normalized = baseVehicle.brand.name.normalized; - historyVehicle.model = baseVehicle.model; - - for(let period of historyVehicle.ownershipPeriods) { - let basePeriod = baseVehicle.ownershipPeriods.find(p => p.from == period.from); - if(basePeriod) { - period.region = basePeriod.region; - period.registrationRegion = basePeriod.registrationRegion; - period.locality = basePeriod.locality; - - if(basePeriod.street) { - period.street = basePeriod.street; - } - - if(basePeriod.building) { - period.building = basePeriod.building; - } - - if(basePeriod.inn) { - period.inn = basePeriod.inn; - } - - if(basePeriod.code) { - period.code = basePeriod.code; - } - } - } - - Object.assign(historyVehicle.debugInfo, { vin01vin: new DebugInfo() }); - Object.assign(historyVehicle.debugInfo, baseVehicle.debugInfo); - - historyVehicle.number = number; - return historyVehicle; - } + return await this.getReportVin(vin, number, token); } catch(ex) { ex.debugInfo = { vin01vin:DebugInfo.fromError(ex.message), @@ -155,6 +85,79 @@ class Vin01Provider { throw ex; } } + + static async getReportVin(vin, number, token) { + let checks = [Vin01Provider.runCheck('base', vin, token), Vin01Provider.runCheck('history', vin, token)]; + let [base, history] = (await Promise.allSettled(checks)).map(Vin01Provider.checkErrors); + if(base.status == 'rejected' && history.status == 'rejected') { + console.log('Vin01 base error: ', base.reason.message); + console.log('Vin01 history error: ', history.reason.message); + let vehicle = new Vehicle(); + vehicle.vin1 = Utils.cyrillicToLatin(vin); + vehicle.debugInfo = { + vin01vin: new DebugInfo(), + vin01history: DebugInfo.fromError(history.reason.message), + vin01base: DebugInfo.fromError(base.reason.message) + }; + return vehicle; + } else if(base.status == 'rejected') { + console.log('vin01 found history'); + let vehicle = Vehicle.fromVin01History(history.value); + vehicle.number = number; + Object.assign(vehicle.debugInfo, { + vin01vin: new DebugInfo(), + vin01base: DebugInfo.fromError(base.reason.message) + }); + return vehicle; + } else if(history.status == 'rejected') { + console.log('vin01 found base info'); + let vehicle = Vehicle.fromVin01Base(base.value); + vehicle.number = number; + Object.assign(vehicle.debugInfo, { + vin01vin: new DebugInfo(), + vin01history: DebugInfo.fromError(history.reason.message) + }); + return vehicle; + } else { + // Both history and base reports were successfully received, merge them in one report + let baseVehicle = Vehicle.fromVin01Base(base.value); + let historyVehicle = Vehicle.fromVin01History(history.value); + + historyVehicle.brand.name.normalized = baseVehicle.brand.name.normalized; + historyVehicle.model = baseVehicle.model; + + for(let period of historyVehicle.ownershipPeriods) { + let basePeriod = baseVehicle.ownershipPeriods.find(p => p.from == period.from); + if(basePeriod) { + period.region = basePeriod.region; + period.registrationRegion = basePeriod.registrationRegion; + period.locality = basePeriod.locality; + + if(basePeriod.street) { + period.street = basePeriod.street; + } + + if(basePeriod.building) { + period.building = basePeriod.building; + } + + if(basePeriod.inn) { + period.inn = basePeriod.inn; + } + + if(basePeriod.code) { + period.code = basePeriod.code; + } + } + } + + Object.assign(historyVehicle.debugInfo, { vin01vin: new DebugInfo() }); + Object.assign(historyVehicle.debugInfo, baseVehicle.debugInfo); + + historyVehicle.number = number; + return historyVehicle; + } + } } export default Vin01Provider; \ No newline at end of file diff --git a/routes/vehicles.js b/routes/vehicles.js index b714831..516431f 100644 --- a/routes/vehicles.js +++ b/routes/vehicles.js @@ -290,10 +290,11 @@ router.post('/checkGbTg', async (req, res) => { try { const number = req.body.number.replace(/ /g, '').toUpperCase(); + const token = req.body.token; tgProvider = new TGProvider(); await tgProvider.init(); - let report = await tgProvider.getReport(number); + let report = await tgProvider.getReport(number, token); await tgProvider.close(); if(!report?.generalInfo && !report?.insurance) { @@ -324,6 +325,10 @@ router.post('/checkGbTg', async (req, res) => { } } + if(report.ownershipPeriods) { + updatedFields.ownershipPeriods = report.ownershipPeriods; + } + await collection.updateOne({ number }, { $set: updatedFields }); vehicle = await collection.findOne({ number }); res.send({ success: true, data: Object.assign(vehicle, updatedFields) });