UNPKG

@grapi/server

Version:

Grapi Schema Generator For GraphQL Server

119 lines (118 loc) 4.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.filter = exports.createFilter = exports.iterateFilters = exports.getRelationItemKeyId = exports.iterateBaseFilter = exports.iterateWhereRelationsFilter = exports.iterateWhereFilter = exports.iterateRelationsWhere = exports.iterateWhere = void 0; const __1 = require(".."); const lodash_1 = require("../lodash"); const lodash_2 = require("../lodash"); const createFilterFromOperator = (value, op) => { switch (op) { case __1.Operator.eq: return (0, lodash_1.eq)(value); case __1.Operator.gt: return (0, lodash_1.gt)(lodash_1.placeholder, value); case __1.Operator.gte: return (0, lodash_1.gte)(lodash_1.placeholder, value); case __1.Operator.lt: return (0, lodash_1.lt)(lodash_1.placeholder, value); case __1.Operator.lte: return (0, lodash_1.lte)(lodash_1.placeholder, value); } }; const iterateWhere = (where, callback) => { (0, lodash_2.forEach)(where, (opWithValue, field) => { (0, lodash_2.forEach)(opWithValue, (value, op) => { callback(field, op, value); }); }); }; exports.iterateWhere = iterateWhere; const iterateRelationsWhere = async (where, callback) => { let filter = true; for (const filterKey in where) { filter = filter && await callback(where[filterKey]); if (!filter) { return filter; } } return filter; }; exports.iterateRelationsWhere = iterateRelationsWhere; const iterateWhereFilter = async (where, callback) => { if ((0, lodash_2.isEmpty)(where)) { await callback({}, undefined); } const baseFilter = (0, lodash_2.transform)(where, (result, value, key) => { if (key !== __1.Operator.or && key !== __1.Operator.and && (0, lodash_2.has)(value, 'filters') === false) { result[key] = value; } return result; }); if ((0, lodash_2.isEmpty)(baseFilter) === false) { await callback(baseFilter, __1.WhereOperator.base); } const filters = (0, lodash_2.omit)(where, (0, lodash_2.keys)(baseFilter)); if ((0, lodash_2.isEmpty)(filters) === false) { const relationFilters = {}; for (const filterKey in filters) { if (filterKey === __1.Operator.or || filterKey === __1.Operator.and) { await callback(filters[filterKey], filterKey); } else { relationFilters[filterKey] = filters[filterKey]; } } if ((0, lodash_2.isEmpty)(relationFilters) === false) { await callback(relationFilters, __1.WhereOperator.relation); } } }; exports.iterateWhereFilter = iterateWhereFilter; const iterateWhereRelationsFilter = async (relationFilter, callback) => { (0, lodash_2.forEach)(relationFilter, async (value) => { await callback(value); }); }; exports.iterateWhereRelationsFilter = iterateWhereRelationsFilter; const iterateBaseFilter = (where) => { return (0, lodash_2.transform)(where, (result, value, key) => { if (key !== __1.Operator.or && key !== __1.Operator.and && (0, lodash_2.has)(value, 'filters') === false) { result[key] = value; } return result; }); }; exports.iterateBaseFilter = iterateBaseFilter; const getRelationItemKeyId = (item, relation) => { const itemId = item[relation.foreignKey]; if (itemId) { return { itemId, key: `id` }; } return { itemId: item.id, key: relation.foreignKey }; }; exports.getRelationItemKeyId = getRelationItemKeyId; const iterateFilters = (where) => { const filters = {}; (0, lodash_2.forEach)(where, (opWithValue, field) => { if (opWithValue.model) { (0, lodash_2.forEach)(opWithValue, (value, op) => { filters[field] = { op, value }; }); } }); return filters; }; exports.iterateFilters = iterateFilters; const createFilter = (where) => { const funcs = []; (0, exports.iterateWhere)(where, (field, op, value) => { const opFilter = createFilterFromOperator(value, op); funcs.push(row => opFilter((0, lodash_2.get)(row, field))); }); return (0, lodash_1.filter)((0, lodash_1.flow)(funcs)); }; exports.createFilter = createFilter; const filter = (rows, where) => { const composedFilter = (0, exports.createFilter)(where); return composedFilter(rows); }; exports.filter = filter;