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;