graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
73 lines • 2.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.sortHelperArgs = sortHelperArgs;
exports.sortHelper = sortHelper;
exports.getSortTypeFromModel = getSortTypeFromModel;
const graphql_compose_1 = require("graphql-compose");
const utils_1 = require("../../utils");
function sortHelperArgs(tc, model, opts) {
if (!tc || tc.constructor.name !== 'ObjectTypeComposer') {
throw new Error('First arg for sortHelperArgs() should be instance of ObjectTypeComposer.');
}
if (!model || !model.modelName || !model.schema) {
throw new Error('Second arg for sortHelperArgs() should be instance of Mongoose Model.');
}
if (!opts || !opts.sortTypeName) {
throw new Error('You should provide non-empty `sortTypeName` in options for sortHelperArgs().');
}
const gqSortType = getSortTypeFromModel(opts.sortTypeName, model, tc.schemaComposer);
return {
sort: {
type: (opts === null || opts === void 0 ? void 0 : opts.multi) ? gqSortType.NonNull.List : gqSortType,
},
};
}
function sortHelper(resolveParams) {
var _a;
const _sort = (_a = resolveParams === null || resolveParams === void 0 ? void 0 : resolveParams.args) === null || _a === void 0 ? void 0 : _a.sort;
if (!_sort)
return;
let sort;
if (Array.isArray(_sort)) {
sort = {};
_sort.forEach((o) => {
if ((0, graphql_compose_1.isObject)(o)) {
Object.keys(o).forEach((key) => {
if (!sort.hasOwnProperty(key)) {
sort[key] = o[key];
}
});
}
});
}
else {
sort = _sort;
}
if (typeof sort === 'object' && Object.keys(sort).length > 0) {
resolveParams.query = resolveParams.query.sort(sort);
}
}
function getSortTypeFromModel(typeName, model, schemaComposer) {
return schemaComposer.getOrCreateETC(typeName, (etc) => {
const indexes = (0, utils_1.extendByReversedIndexes)((0, utils_1.getIndexesFromModel)(model));
const fields = {};
indexes.forEach((indexData) => {
const keys = Object.keys(indexData);
let name = keys
.join('__')
.toUpperCase()
.replace(/[^_a-zA-Z0-9]/gi, '__');
if (indexData[keys[0]] === 1) {
name = `${name}_ASC`;
}
else if (indexData[keys[0]] === -1) {
name = `${name}_DESC`;
}
fields[name] = {
value: indexData,
};
});
etc.setFields(fields);
});
}
//# sourceMappingURL=sort.js.map