@websolutespa/payload-plugin-bowl
Version:
Bowl PayloadCms plugin of the BOM Repository
231 lines (230 loc) • 8.42 kB
JavaScript
// !!! todo use json service from bom-core
function clauseValue(value) {
if (value == null) {
return;
}
if (Array.isArray(value)) {
return value.map((x)=>clauseValue(x));
}
if (typeof value === 'string') {
if (String(parseInt(value)) === value) {
return Number(value);
} else if (value === 'true') {
return true;
} else if (value === 'false') {
return false;
}
}
return value;
}
function existsClause(value, exists) {
// console.log('existsClause', value, typeof value, exists, typeof exists);
const clause = clauseValue(exists);
if (typeof clause === 'boolean') {
return Boolean(value) === clause;
}
return true;
}
function equalsClause(value, equals) {
// console.log('equalsClause', value, typeof value, equals, typeof equals);
const clause = clauseValue(equals);
if (typeof clause !== 'undefined') {
return value === clause;
}
return true;
}
function notEqualsClause(value, not_equals) {
// console.log('notEqualsClause', value, typeof value, not_equals, typeof not_equals);
const clause = clauseValue(not_equals);
if (typeof clause !== 'undefined') {
return value !== not_equals;
}
return true;
}
function containsClause(value, contains) {
// console.log('containsClause', value, contains);
const clause = clauseValue(contains);
if (typeof clause !== 'undefined') {
const query = String(clause).toLowerCase();
if (Array.isArray(value)) {
return value.reduce((p, c)=>p || String(c).toLowerCase() === query, false);
} else if (typeof value === 'string') {
return value.toLowerCase().includes(query);
} else {
return false;
}
}
return true;
}
function inClause(value, values) {
// console.log('inClause', value, values);
const clause = clauseValue(values);
if (Array.isArray(clause)) {
return clause.indexOf(value) !== -1;
}
return true;
}
function notInClause(value, values) {
// console.log('notInClause', value, values);
const clause = clauseValue(values);
if (Array.isArray(clause)) {
return clause.indexOf(value) === -1;
}
return true;
}
function greaterThanClause(value, greater_than) {
// console.log('greaterThanClause', value, greater_than);
const clause = clauseValue(greater_than);
if (typeof clause === 'number') {
return typeof value === 'number' && value > clause;
}
return true;
}
function greaterThanEqualClause(value, greater_than_equal) {
// console.log('greaterThanEqualClause', value, greater_than_equal);
const clause = clauseValue(greater_than_equal);
if (typeof clause === 'number') {
return typeof value === 'number' && value >= clause;
}
return true;
}
function lessThanClause(value, less_than) {
// console.log('lessThanClause', value, less_than);
const clause = clauseValue(less_than);
if (typeof clause === 'number') {
return typeof value === 'number' && value < clause;
}
return true;
}
function lessThanEqualClause(value, less_than_equal) {
// console.log('lessThanEqualClause', value, less_than_equal);
const clause = clauseValue(less_than_equal);
if (typeof clause === 'number') {
return typeof value === 'number' && value <= clause;
}
return true;
}
function likeClause(value, query) {
// console.log('likeClause', value, query);
const clause = clauseValue(query);
if (typeof clause === 'string' && clause.length > 0) {
return String(value).toLowerCase().indexOf(query.toLowerCase()) !== -1;
}
return true;
}
function allClause(value, values) {
// console.log('allClause', value, values);
const clause = clauseValue(values);
if (Array.isArray(clause) && clause.length > 0) {
return Array.isArray(value) ? clause.reduce((p, c)=>p && value.includes(c), true) : false;
}
return true;
}
function nearClause(value, near) {
// console.log('nearClause', value, near);
const clause = clauseValue(near);
if (Array.isArray(clause) && clause.reduce((p, c)=>p && typeof c === 'number', true)) {
if (!Array.isArray(value)) {
return false;
}
const itemLongitude = value[0];
if (typeof itemLongitude !== 'number') {
return false;
}
const itemLatitude = value[1];
if (typeof itemLatitude !== 'number') {
return false;
}
const [longitude, latitude, maxDistance, minDistance] = clause;
const distance = longitude && latitude ? calculateDistanceInMeters_(itemLongitude, itemLatitude, longitude, latitude) : 0;
if (typeof maxDistance === 'number' && typeof minDistance === 'number') {
return distance <= maxDistance && distance >= minDistance;
} else if (typeof maxDistance === 'number') {
return distance <= maxDistance;
} else if (typeof minDistance === 'number') {
return distance >= minDistance;
}
}
return true;
}
function whereItem(item, where) {
let has = true;
if (typeof where === 'object') {
Object.entries(where).forEach(([k, v])=>{
switch(k){
case 'and':
if (Array.isArray(v)) {
has = v.reduce((p, c)=>{
return p && whereItem(item, c);
}, has);
}
break;
case 'or':
if (Array.isArray(v)) {
has = has && v.reduce((p, c)=>{
return p || whereItem(item, c);
}, false);
}
break;
default:
if (typeof v === 'object') {
const value = item[k];
has = has && equalsClause(value, v.equals);
has = has && notEqualsClause(value, v.not_equals);
has = has && existsClause(value, v.exists);
has = has && greaterThanClause(value, v.greater_than);
has = has && greaterThanEqualClause(value, v.greater_than_equal);
has = has && lessThanClause(value, v.less_than);
has = has && lessThanEqualClause(value, v.less_than_equal);
has = has && likeClause(value, v.like);
has = has && containsClause(value, v.contains);
has = has && inClause(value, v.in);
has = has && notInClause(value, v.not_in);
has = has && allClause(value, v.all);
has = has && nearClause(value, v.near);
}
}
});
}
return has;
}
export async function whereCollection(items, where) {
if (typeof where === 'object') {
items = items.filter((item)=>whereItem(item, where));
}
return items;
}
export async function sortCollection(items, sort) {
if (sort) {
const keys = sort.split('-');
const reverse = keys.length > 1 ? -1 : 1;
const key = keys.pop();
items = [
...items
];
items.sort((a, b)=>{
const aValue = a[key];
const bValue = b[key];
if (typeof aValue === 'number' && typeof bValue === 'number') {
return (aValue - bValue) * reverse;
}
const aStringValue = String(aValue);
const bStringValue = String(bValue);
return aStringValue.localeCompare(bStringValue) * reverse;
});
}
return items;
}
function calculateDistanceInMeters_(lon1, lat1, lon2, lat2) {
const R = 6371; // Radius of the earth in km
const dLat = deg2rad_(lat2 - lat1);
const dLon = deg2rad_(lon2 - lon1);
const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(deg2rad_(lat1)) * Math.cos(deg2rad_(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
const distance = R * c * 1000; // Distance in meters
return distance;
}
function deg2rad_(deg) {
return deg * (Math.PI / 180);
}
//# sourceMappingURL=where.service.js.map