@schamane/small-graphql-mongoose-middleware
Version:

96 lines • 5.13 kB
JavaScript
;
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