UNPKG

loopback-graphql-relay

Version:

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

66 lines (50 loc) 1.95 kB
const _ = require('lodash'); const promisify = require('promisify-node'); const utils = require('../utils'); const { connectionFromPromisedArray } = require('graphql-relay'); const allowedVerbs = ['get', 'head']; const defaultFindMethods = ['find']; module.exports = function getRemoteMethodQueries(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] = { name: hookName, description: method.description, meta: { relation: true }, args: acceptingParams, type: typeObj.type, resolve: (__, args) => { let params = []; _.forEach(acceptingParams, (param, name) => { params.push(args[name]); }); const wrap = promisify(model[method.name]); if (typeObj.list) { if (defaultFindMethods.indexOf(method.name) === -1 && method.returns[0].type.indexOf('any') !== -1) { params = []; _.forEach(method.accepts, (accept) => { params.push(args[accept.arg]); }); } return connectionFromPromisedArray(wrap.apply(model, params), args, model); } return wrap.apply(model, params); }, }; } }); } return hooks; };