graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
130 lines (102 loc) • 4.51 kB
JavaScript
;
exports.__esModule = true;
exports.filterHelper = filterHelper;
exports.filterHelperArgs = exports.getFilterHelperArgOptsMap = void 0;
var _graphqlCompose = require("graphql-compose");
var _mongoid = _interopRequireDefault(require("../../types/mongoid"));
var _utils = require("../../utils");
var _filterOperators = require("./filterOperators");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
// for merging, discriminators merge-able only
const getFilterHelperArgOptsMap = () => ({
// filterTypeName? : 'string'
isRequired: 'boolean',
onlyIndexed: 'boolean',
requiredFields: ['string', 'string[]'],
operators: ['FilterOperatorsOptsMap', 'boolean'],
removeFields: ['string', 'string[]']
});
exports.getFilterHelperArgOptsMap = getFilterHelperArgOptsMap;
const filterHelperArgs = (typeComposer, model, opts) => {
if (!(typeComposer instanceof _graphqlCompose.ObjectTypeComposer)) {
throw new Error('First arg for filterHelperArgs() should be instance of ObjectTypeComposer.');
}
if (!model || !model.modelName || !model.schema) {
throw new Error('Second arg for filterHelperArgs() should be instance of MongooseModel.');
}
if (!opts || !opts.filterTypeName) {
throw new Error('You should provide non-empty `filterTypeName` in options.');
}
const removeFields = [];
if (opts.removeFields) {
if (Array.isArray(opts.removeFields)) {
removeFields.push(...opts.removeFields);
} else {
removeFields.push(opts.removeFields);
}
}
if (opts.onlyIndexed) {
const indexedFieldNames = (0, _utils.getIndexedFieldNamesForGraphQL)(model);
Object.keys(typeComposer.getFields()).forEach(fieldName => {
if (indexedFieldNames.indexOf(fieldName) === -1) {
removeFields.push(fieldName);
}
});
}
const filterTypeName = opts.filterTypeName;
const itc = typeComposer.getInputTypeComposer().clone(filterTypeName);
itc.makeFieldNullable('_id');
itc.addFields({
_ids: [_mongoid.default]
});
itc.removeField(removeFields);
if (opts.requiredFields) {
itc.makeFieldNonNull(opts.requiredFields);
}
if (itc.getFieldNames().length === 0) {
return {};
}
(0, _filterOperators.addFilterOperators)(itc, model, opts);
return {
filter: {
type: opts.isRequired ? itc.getTypeNonNull() : itc,
description: opts.onlyIndexed ? 'Filter only by indexed fields' : 'Filter by fields'
}
};
};
exports.filterHelperArgs = filterHelperArgs;
function filterHelper(resolveParams) {
const filter = resolveParams.args && resolveParams.args.filter;
if (filter && typeof filter === 'object' && Object.keys(filter).length > 0) {
const modelFields = resolveParams.query.schema.paths;
const {
_ids
} = filter,
filterFields = _objectWithoutProperties(filter, ["_ids"]);
if (_ids && Array.isArray(_ids)) {
// eslint-disable-next-line
resolveParams.query = resolveParams.query.where({
_id: {
$in: _ids
}
});
}
(0, _filterOperators.processFilterOperators)(filterFields);
const clearedFilter = {};
Object.keys(filterFields).forEach(key => {
if (modelFields[key] || key.indexOf('$') === 0) {
clearedFilter[key] = filterFields[key];
}
});
if (Object.keys(clearedFilter).length > 0) {
// eslint-disable-next-line
resolveParams.query = resolveParams.query.where((0, _utils.toMongoFilterDottedObject)(clearedFilter));
}
}
if ((0, _utils.isObject)(resolveParams.rawQuery)) {
// eslint-disable-next-line
resolveParams.query = resolveParams.query.where(resolveParams.rawQuery);
}
}