UNPKG

@schamane/small-graphql-mongoose-middleware

Version:

![Check Code](https://github.com/schamane/small-graphql-mongoose-middleware/workflows/Check%20Code/badge.svg)

96 lines 5.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.languageFilter = exports.translationsFieldStringPath = exports.translatedFieldLanguagePath = exports.translationsFieldPath = exports.translateSorter = exports.filtersToQuery = exports.filterToQuery = exports.mapFilter = void 0; /* eslint-disable @typescript-eslint/ban-types */ const lodash_1 = require("lodash"); const mongo_1 = require("../datasources/mongo"); const errors_1 = require("../errors"); const translate_1 = require("./translate"); const resolution = (name, value, op) => (op ? { [name]: { [op]: value } } : { [name]: value }); const toQueryOperation = (name, value, op = undefined) => { if ((0, lodash_1.isArray)(value)) { return { [mongo_1.GraphqlQueryType.OR]: (0, lodash_1.map)(value, (x) => resolution(name, x, op)) }; } return resolution(name, value, op); }; const processOperator = { [mongo_1.FilterOperator.EQ]: (name, value) => toQueryOperation(name, value), [mongo_1.FilterOperator.NE]: (name, value) => toQueryOperation(name, value, '$ne'), [mongo_1.FilterOperator.GT]: (name, value) => toQueryOperation(name, value, '$gt'), [mongo_1.FilterOperator.GTE]: (name, value) => toQueryOperation(name, value, '$gte'), [mongo_1.FilterOperator.LT]: (name, value) => toQueryOperation(name, value, '$lt'), [mongo_1.FilterOperator.LTE]: (name, value) => toQueryOperation(name, value, '$lte'), [mongo_1.FilterOperator.CONTAINS]: (name, value) => { if ((0, lodash_1.isArray)(value)) { throw new errors_1.FilterValueValidatorError('Value for CONTAINS operator cant be an Array'); } return { [name]: { $regex: value, $options: 'i' } }; }, [mongo_1.FilterOperator.IN]: (name, value) => { if (!(0, lodash_1.isArray)(value)) { throw new errors_1.FilterValueValidatorError('Value for IN operator should be an Array'); } if ((0, lodash_1.isArray)(value) && (0, lodash_1.isEmpty)(value)) { // switch to equals return processOperator[mongo_1.FilterOperator.EQ](name, (0, lodash_1.head)(value)); } return resolution(name, value, '$in'); }, [mongo_1.FilterOperator.NIN]: (name, value) => { if (!(0, lodash_1.isArray)(value)) { throw new errors_1.FilterValueValidatorError('Value for IN operator should be an Array'); } if ((0, lodash_1.isArray)(value) && (0, lodash_1.isEmpty)(value)) { // switch to equals return processOperator[mongo_1.FilterOperator.NE](name, (0, lodash_1.head)(value)); } return resolution(name, value, '$nin'); } }; const mapFilter = (filter, fieldTranslations) => { const translateOperation = (name, filterOperator, value) => { const translateNames = (0, translate_1.translateField)(name, fieldTranslations); // default filterOperator if (!(0, lodash_1.has)(processOperator, filterOperator)) { throw new errors_1.UnknowFilterOperatorError('UnknowFilterOperatorError'); } if ((0, lodash_1.isObject)(translateNames)) { // use first value as query type const { type, fields } = translateNames; // console.debug(map(fields, (x) => processOperator[filterOperator](x, value))); return { [type]: (0, lodash_1.map)(fields, (x) => processOperator[filterOperator](x, value)) }; } // console.debug('processed', processOperator[filterOperator](translateNames, value)); return processOperator[filterOperator]((0, lodash_1.toString)(translateNames), value); }; const field = filter ? translateOperation(filter.name, filter.operator, filter.value) : undefined; return field; }; exports.mapFilter = mapFilter; const filterToQuery = (filter, fieldTranslations) => (0, exports.mapFilter)(filter, fieldTranslations); exports.filterToQuery = filterToQuery; const filtersToQuery = (filters, fieldTranslations) => lodash_1.defaults.apply({}, (0, lodash_1.map)(filters, (filter) => (0, exports.mapFilter)(filter, fieldTranslations))); exports.filtersToQuery = filtersToQuery; const translateSorter = (field, fieldTranslations) => { if ((0, lodash_1.has)(fieldTranslations, field)) { const q = (0, lodash_1.get)(fieldTranslations, field); return (0, lodash_1.isObject)(q) ? q.fields : q; } return field; }; exports.translateSorter = translateSorter; const translationsFieldPath = (field) => `${field}.translations`; exports.translationsFieldPath = translationsFieldPath; const translatedFieldLanguagePath = (field) => `${field}.translations.language`; exports.translatedFieldLanguagePath = translatedFieldLanguagePath; const translationsFieldStringPath = (attribute) => `${attribute}[0].translations`; exports.translationsFieldStringPath = translationsFieldStringPath; const languageFilter = (attribute, language) => ({ [`${(0, exports.translatedFieldLanguagePath)(attribute)}`]: language }); exports.languageFilter = languageFilter; //# sourceMappingURL=filter.js.map