@grapi/server
Version:
Grapi Schema Generator For GraphQL Server
51 lines (50 loc) • 2.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("../lodash");
const baseType_1 = __importDefault(require("./baseType"));
const whereInput_1 = __importDefault(require("./whereInput"));
const parsePaginationFromArgs = (args) => {
if (!args) {
return null;
}
return (0, lodash_1.pick)(args, ['first', 'last', 'before', 'after']);
};
class RelayPlugin {
whereInputPlugin;
baseTypePlugin;
setPlugins(plugins) {
this.whereInputPlugin = plugins.find(plugin => plugin instanceof whereInput_1.default);
this.baseTypePlugin = plugins.find(plugin => plugin instanceof baseType_1.default);
}
visitModel(model, context) {
const { root } = context;
const connectionType = RelayPlugin.createConnectionType(model);
root.addObjectType(`type ${connectionType} { totalCount: Int! }`);
const queryName = RelayPlugin.createConnectionQueryName(model);
const whereInputName = this.whereInputPlugin.getWhereInputName(model);
root.addQuery(`${queryName}( where: ${whereInputName} ): ${connectionType}!`);
}
resolveInQuery({ model, dataSource, }) {
const queryName = RelayPlugin.createConnectionQueryName(model);
return {
[queryName]: async (root, args, context) => {
const where = this.whereInputPlugin.parseWhere(args.where, model);
const pagination = parsePaginationFromArgs(args);
const response = await dataSource.find({ where, pagination }, context);
return {
totalCount: response.total,
};
},
};
}
static createConnectionQueryName(model) {
return `${model.getNamings().plural}Connection`;
}
static createConnectionType(model) {
return `${model.getNamings().capitalSingular}Connection`;
}
}
exports.default = RelayPlugin;