UNPKG

loopback-graphql-relay

Version:

Add Relay based Apollo Server or GraphQL queries on your Loopback server

67 lines (52 loc) 1.92 kB
const _ = require('lodash'); const { mutationWithClientMutationId, } = require('graphql-relay'); const promisify = require('promisify-node'); const { connectionFromPromisedArray } = require('graphql-relay'); const utils = require('../utils'); // const { getType } = require('../../types/type'); const allowedVerbs = ['post', 'del', 'put', 'patch', 'all']; module.exports = function getRemoteMethodMutations(model) { const hooks = {}; if (model.sharedClass && model.sharedClass.methods) { model.sharedClass.methods().forEach((method) => { if (method.shared && method.name.indexOf('Stream') === -1 && method.name.indexOf('invoke') === -1) { if (!utils.isRemoteMethodAllowed(method, allowedVerbs)) { return; } // TODO: Add support for static methods if (method.isStatic === false) { return; } const typeObj = utils.getRemoteMethodOutput(method); const acceptingParams = utils.getRemoteMethodInput(method, typeObj.list); const hookName = utils.getRemoteMethodQueryName(model, method); hooks[hookName] = mutationWithClientMutationId({ name: hookName, description: method.description, meta: { relation: true }, inputFields: acceptingParams, outputFields: { obj: { type: typeObj.type, resolve: o => o, }, }, mutateAndGetPayload: (args) => { const params = []; _.forEach(acceptingParams, (param, name) => { params.push(args[name]); }); const wrap = promisify(model[method.name]); if (typeObj.list) { return connectionFromPromisedArray(wrap.apply(model, params), args, model); } return wrap.apply(model, params); }, }); } }); } return hooks; };