API for filtered events

This commit is contained in:
Selim Mustafaev 2020-09-16 13:52:46 +03:00
parent 6066324677
commit ad27bf3078
3 changed files with 56 additions and 27 deletions

View File

@ -1,6 +1,7 @@
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
const { v4: uuidv4 } = require('uuid'); const { v4: uuidv4 } = require('uuid');
const Utils = require('../utils');
const makeError = error => ({ success: false, error }); 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; module.exports = router;

View File

@ -5,25 +5,10 @@ const cors = require('cors');
const AvtocodProvider = require('../data_providers/avtocod'); const AvtocodProvider = require('../data_providers/avtocod');
const Vin01Provider = require('../data_providers/vin01'); const Vin01Provider = require('../data_providers/vin01');
const { regions } = require('../data_providers/constants'); const { regions } = require('../data_providers/constants');
const Utils = require('../utils');
const makeError = error => ({ success: false, error }); 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) => { 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 googleIdToken = req.body.googleIdToken;
@ -78,19 +63,10 @@ router.post('/check', async (req, res) => {
}); });
router.get('/', async (req, res) => { router.get('/', async (req, res) => {
const { limit, query, brand, model, color, regions } = req.query; const { limit } = 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 };
try { try {
let finalQuery = Utils.makeVehiclesSearchQuery(req.query);
let collection = req.db.collection('vehicles'); let collection = req.db.collection('vehicles');
let vehicles = await collection.find(finalQuery).sort({ addedDate: -1 }).limit(parseInt(limit ?? 0)).toArray(); let vehicles = await collection.find(finalQuery).sort({ addedDate: -1 }).limit(parseInt(limit ?? 0)).toArray();
res.send({ success: true, data: vehicles }); res.send({ success: true, data: vehicles });

33
utils.js Normal file
View File

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