graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
85 lines • 3.53 kB
JavaScript
;
var __rest = (this && this.__rest) || function (s, e) {
var t = {};
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
t[p] = s[p];
if (s != null && typeof Object.getOwnPropertySymbols === "function")
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
t[p[i]] = s[p[i]];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.connection = connection;
exports.prepareCursorQuery = prepareCursorQuery;
const graphql_compose_connection_1 = require("graphql-compose-connection");
const count_1 = require("./count");
const findMany_1 = require("./findMany");
const getIndexesFromModel_1 = require("../utils/getIndexesFromModel");
function connection(model, tc, opts) {
const uniqueIndexes = (0, getIndexesFromModel_1.extendByReversedIndexes)((0, getIndexesFromModel_1.getUniqueIndexes)(model), {
reversedFirst: true,
});
const sortConfigs = {};
uniqueIndexes.forEach((indexData) => {
const keys = Object.keys(indexData);
let name = keys
.join('__')
.toUpperCase()
.replace(/[^_a-zA-Z0-9]/i, '__');
if (indexData[keys[0]] === 1) {
name = `${name}_ASC`;
}
else if (indexData[keys[0]] === -1) {
name = `${name}_DESC`;
}
sortConfigs[name] = {
value: indexData,
cursorFields: keys,
beforeCursorQuery: (rawQuery, cursorData) => {
prepareCursorQuery(rawQuery, cursorData, keys, indexData, '$lt', '$gt');
},
afterCursorQuery: (rawQuery, cursorData) => {
prepareCursorQuery(rawQuery, cursorData, keys, indexData, '$gt', '$lt');
},
};
});
const _a = opts || {}, { findManyOpts, countOpts, findManyResolver, countResolver } = _a, restOpts = __rest(_a, ["findManyOpts", "countOpts", "findManyResolver", "countResolver"]);
return (0, graphql_compose_connection_1.prepareConnectionResolver)(tc, Object.assign({ findManyResolver: findManyResolver || (0, findMany_1.findMany)(model, tc, findManyOpts), countResolver: countResolver || (0, count_1.count)(model, tc, countOpts), sort: sortConfigs }, restOpts));
}
function prepareCursorQuery(rawQuery, cursorData, indexKeys, indexData, nextOper, prevOper) {
if (indexKeys.length === 1) {
const k = indexKeys[0];
if (!rawQuery[k])
rawQuery[k] = {};
if (indexData[k] === 1) {
rawQuery[k][nextOper] = cursorData[k];
}
else {
rawQuery[k][prevOper] = cursorData[k];
}
}
else {
const orCriteries = [];
for (let i = indexKeys.length - 1; i >= 0; i--) {
const criteria = {};
indexKeys.forEach((k, ii) => {
if (ii < i) {
criteria[k] = cursorData[k];
}
else if (ii === i) {
if (indexData[k] === 1) {
criteria[k] = { [nextOper]: cursorData[k] };
}
else {
criteria[k] = { [prevOper]: cursorData[k] };
}
}
});
orCriteries.push(criteria);
}
rawQuery.$or = orCriteries;
}
}
//# sourceMappingURL=connection.js.map