AutoCatBackend/utils/utils.js

151 lines
3.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;