UNPKG

@websolutespa/payload-plugin-bowl

Version:

Bowl PayloadCms plugin of the BOM Repository

231 lines (230 loc) 8.42 kB
// !!! 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