API for filtered events
This commit is contained in:
parent
6066324677
commit
ad27bf3078
@ -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;
|
||||||
@ -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
33
utils.js
Normal 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;
|
||||||
Loading…
Reference in New Issue
Block a user