151 lines
3.4 KiB
JavaScript
151 lines
3.4 KiB
JavaScript
class Utils {
|
||
static makeVehiclesSearchQuery(queryParams, email) {
|
||
const {
|
||
query,
|
||
brand,
|
||
model,
|
||
color,
|
||
regions,
|
||
fromDate,
|
||
toDate,
|
||
addedBy,
|
||
fromDateUpdated,
|
||
toDateUpdated,
|
||
fromLocationDate,
|
||
toLocationDate,
|
||
year,
|
||
scope
|
||
} = queryParams;
|
||
|
||
let numberQuery = Utils.makeNumberQuery(scope, query, regions?.split(',') ?? []);
|
||
let findQuery = {
|
||
'brand.name.normalized': brand,
|
||
'model.name.normalized': model,
|
||
color
|
||
};
|
||
|
||
if(year) {
|
||
findQuery.year = parseInt(year);
|
||
}
|
||
|
||
if(fromDate || toDate) {
|
||
findQuery.addedDate = {};
|
||
if(fromDate) {
|
||
findQuery.addedDate.$gte = fromDate*1000;
|
||
}
|
||
if(toDate) {
|
||
findQuery.addedDate.$lte = toDate*1000;
|
||
}
|
||
}
|
||
|
||
if(fromDateUpdated || toDateUpdated) {
|
||
findQuery.updatedDate = {};
|
||
if(fromDateUpdated) {
|
||
findQuery.updatedDate.$gte = fromDateUpdated*1000;
|
||
}
|
||
if(toDateUpdated) {
|
||
findQuery.updatedDate.$lte = toDateUpdated*1000;
|
||
}
|
||
}
|
||
|
||
if(fromLocationDate || toLocationDate) {
|
||
let comparator = {};
|
||
if(fromLocationDate) {
|
||
comparator.$gte = parseFloat(fromLocationDate);
|
||
}
|
||
if(toLocationDate) {
|
||
comparator.$lte = parseFloat(toLocationDate);
|
||
}
|
||
|
||
findQuery.events = {
|
||
$elemMatch: {
|
||
date: comparator
|
||
}
|
||
};
|
||
}
|
||
|
||
if(addedBy) {
|
||
if(addedBy == 'me') {
|
||
findQuery.addedBy = email;
|
||
} else if(addedBy == 'anyoneButMe') {
|
||
findQuery.addedBy = { $ne: email };
|
||
}
|
||
}
|
||
|
||
let findQueryFiltered = Object.fromEntries(Object.entries(findQuery).filter(([,val]) => val ));
|
||
return { ...findQueryFiltered, ...numberQuery };
|
||
}
|
||
|
||
static makeNumberQuery(scope, number, regions) {
|
||
|
||
let mainQuery = { number: { $regex: number } };
|
||
switch(scope) {
|
||
case 'plateNumber':
|
||
break;
|
||
case 'vin':
|
||
mainQuery = { vin1: { $regex: number } };
|
||
break;
|
||
case 'notes':
|
||
mainQuery = { 'notes.text': { $regex: RegExp(number, 'i') } };
|
||
break;
|
||
}
|
||
|
||
let regionsQuery = null;
|
||
if(regions.length > 0) {
|
||
regionsQuery = { $or: regions.map(r => { return { number: { $regex: `\\D${r}$` } }; }) };
|
||
}
|
||
if(number && regionsQuery) {
|
||
return { $and: [ mainQuery, regionsQuery ] };
|
||
} else if(number) {
|
||
return mainQuery;
|
||
} else if(regionsQuery) {
|
||
return regionsQuery;
|
||
} else {
|
||
return {};
|
||
}
|
||
}
|
||
|
||
static makeDateQuery(from, to) {
|
||
let conditions = [];
|
||
if(from) {
|
||
conditions.push({ $gte: from });
|
||
}
|
||
if(to) {
|
||
conditions.push({ $lte: to });
|
||
}
|
||
|
||
return { $and: conditions };
|
||
}
|
||
|
||
static cyrillicToLatin(str) {
|
||
if(!str) {
|
||
return null;
|
||
}
|
||
|
||
const cyrillic_to_latin = { 'А': 'A', 'В': 'B', 'Е': 'E', 'К': 'K', 'М': 'M', 'Н': 'H', 'О': 'O', 'Р': 'P', 'С': 'C', 'Т': 'T', 'У': 'Y', 'Х': 'X' }; //{'А':'A', 'К':'K', 'М':'M', 'В':'B', 'С':'C'};
|
||
let regex = new RegExp('[' + Object.keys(cyrillic_to_latin).join('') + ']', 'g');
|
||
return str.replace(regex, letter => cyrillic_to_latin[letter] || letter);
|
||
}
|
||
|
||
static parseDate(dateStr) {
|
||
let dateParams = dateStr.split('.').reverse().map(n => parseInt(n, 10));
|
||
dateParams[1] -= 1;
|
||
let date = (new Date(...dateParams)).getTime();
|
||
return Math.floor(date/1000);
|
||
}
|
||
|
||
static promiseWithResolvers() {
|
||
let resolve, reject;
|
||
const promise = new Promise((res, rej) => {
|
||
resolve = res;
|
||
reject = rej;
|
||
});
|
||
return { promise, resolve, reject };
|
||
}
|
||
|
||
static removeNullFields(obj) {
|
||
return Object.fromEntries(Object.entries(obj).filter(([, v]) => v != null));
|
||
}
|
||
}
|
||
|
||
export default Utils; |