diff --git a/routes/events.js b/routes/events.js index a5b2704..cd0725c 100644 --- a/routes/events.js +++ b/routes/events.js @@ -1,6 +1,7 @@ const express = require('express'); const router = express.Router(); const { v4: uuidv4 } = require('uuid'); +const Utils = require('../utils'); const makeError = error => ({ success: false, error }); @@ -69,4 +70,23 @@ router.put('/', async (req, res) => { } }); +router.get('/', async (req, res) => { + try { + let finalQuery = Utils.makeVehiclesSearchQuery(req.query); + let collection = req.db.collection('vehicles'); + let vehicles = await collection.find(finalQuery, { number: 1, events: 1 }).toArray(); + let events = []; + for(let vehicle of vehicles) { + for(let event of vehicle.events) { + event.number = vehicle.number; + } + events = events.concat(vehicle.events); + } + res.send({ success: true, data: events }); + } catch(ex) { + res.send(makeError(ex.message)); + console.error(ex); + } +}); + module.exports = router; \ No newline at end of file diff --git a/routes/vehicles.js b/routes/vehicles.js index b9b63ef..91a89ea 100644 --- a/routes/vehicles.js +++ b/routes/vehicles.js @@ -5,25 +5,10 @@ const cors = require('cors'); const AvtocodProvider = require('../data_providers/avtocod'); const Vin01Provider = require('../data_providers/vin01'); const { regions } = require('../data_providers/constants'); +const Utils = require('../utils'); const makeError = error => ({ success: false, error }); -function makeNumberQuery(number, regions) { - let regionsQuery = null; - if(regions.length > 0) { - regionsQuery = { $or: regions.map(r => { return { number: { $regex: `\\D${r}$` } }; }) }; - } - if(number && regionsQuery) { - return { $and: [ { number: { $regex: number } }, regionsQuery ] }; - } else if(number) { - return { number: { $regex: number } }; - } else if(regionsQuery) { - return regionsQuery; - } else { - return {}; - } -} - router.post('/check', async (req, res) => { const number = req.body.number.replace(/ /g, '').toUpperCase(); const googleIdToken = req.body.googleIdToken; @@ -78,19 +63,10 @@ router.post('/check', async (req, res) => { }); router.get('/', async (req, res) => { - const { limit, query, brand, model, color, regions } = req.query; - - let numberQuery = makeNumberQuery(query, regions?.split(',') ?? []); - let findQuery = { - 'brand.name.normalized': brand, - 'model.name.normalized': model, - color - }; - - let findQueryFiltered = Object.fromEntries(Object.entries(findQuery).filter(([,val]) => val )); - let finalQuery = { ...findQueryFiltered, ...numberQuery }; + const { limit } = req.query; try { + let finalQuery = Utils.makeVehiclesSearchQuery(req.query); let collection = req.db.collection('vehicles'); let vehicles = await collection.find(finalQuery).sort({ addedDate: -1 }).limit(parseInt(limit ?? 0)).toArray(); res.send({ success: true, data: vehicles }); diff --git a/utils.js b/utils.js new file mode 100644 index 0000000..1f8c2b2 --- /dev/null +++ b/utils.js @@ -0,0 +1,33 @@ +class Utils { + static makeVehiclesSearchQuery(queryParams) { + const { query, brand, model, color, regions } = queryParams; + + let numberQuery = Utils.makeNumberQuery(query, regions?.split(',') ?? []); + let findQuery = { + 'brand.name.normalized': brand, + 'model.name.normalized': model, + color + }; + + let findQueryFiltered = Object.fromEntries(Object.entries(findQuery).filter(([,val]) => val )); + return { ...findQueryFiltered, ...numberQuery }; + } + + static makeNumberQuery(number, regions) { + let regionsQuery = null; + if(regions.length > 0) { + regionsQuery = { $or: regions.map(r => { return { number: { $regex: `\\D${r}$` } }; }) }; + } + if(number && regionsQuery) { + return { $and: [ { number: { $regex: number } }, regionsQuery ] }; + } else if(number) { + return { number: { $regex: number } }; + } else if(regionsQuery) { + return regionsQuery; + } else { + return {}; + } + } +} + +module.exports = Utils; \ No newline at end of file