@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
119 lines (118 loc) • 4.51 kB
JavaScript
;
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;