Nauseating Pumpkin Mush

    loopback-setup-remote-methods-mixin

    1.2.1 • Public • Published

    loopback-setup-remote-methods-mixin

    Mixins for Loopback, to easily disable or setup new remote methods from the model definition file. It works with both Loopback 2 and 3.

    Installation

    npm install --save loopback-setup-remote-methods-mixin

    Usage

    As a mixin (recommended)

    First, modify your server/model-config.json to include the path to this module:

    For LB3, mixins should be declared in the _meta.mixins property. For LB2, mixins should be declared in the mixins property.

    {
     "_meta": {
       "mixins": [
          "loopback/common/mixins",
          "loopback/server/mixins",
          "../common/mixins",
          "./mixins",
          "../node_modules/loopback-setup-remote-methods-mixin"
        ]
      }
    }

    Then you can use the mixin from your model definition files:

    ...
      "mixins"{
        "SetupRemoteMethods": {
          "disableAllExcept": ["create", "prototype.updateAttributes"],
          "addFromFile": "./common/models/mymodel-remotes.js"
        }
      }
    ...

    List of default remote methods

    http://loopback.io/doc/en/lb3/Exposing-models-over-REST.html#predefined-remote-methods

    Options

    disable

    Disable the defined remote methods. For example, to disable the create and the updateAttributes remote methods:

      "mixins"{
        "SetupRemoteMethods": {
          "disable": ["create", "prototype.updateAttributes"]
        }
      }

    Allows wildcards with * (not fully tested though)

    disableAllExcept

    Disable all the remote methods, except the defined on the options. For example, to disable all except create and updateAttributes remote methods:

      "mixins"{
        "SetupRemoteMethods": {
          "disableAllExcept": ["create", "prototype.updateAttributes"]
        }
      }

    Allows wildcards with * (not fully tested though)

    relations

    Allows to setup some options per relation. Currently only disableAllExcept is supported.

      "mixins"{
        "SetupRemoteMethods": {
          "relations": {
            "customer": {
              "disableAllExcept": ["create", "get"]          
            }
          }
        }
      }

    ignoreACL

    Default value: false

    This option works together with disable and disableAllExcept. If true, it forces to disable the methods, even if they are configured in the ACL to be allowed.

      "mixins"{
        "SetupRemoteMethods": {
          "ignoreACL": true,
          "disableAllExcept": ["create", "prototype.updateAttributes"]
        }
      }

    add

    It adds new remote methods to the model. This is similar to what's planned for the Methods section. (Which is not yet implemented. This option will be deprecated when that happens.)

    Add using JSON

      "mixins"{
        "SetupRemoteMethods": {
          "add": {
            "sayHello": {
              "accepts": {"arg": "msg", "type": "string"},
              "returns": {"arg": "greeting", "type": "string"}
            },
            "sayBye": {
              "accepts": {"arg": "msg", "type": "string"},
              "returns": {"arg": "farewell", "type": "string"}
            }
          }
        }
      }

    Then you can have the methods implemented in your model as usual:

    const Promise = require('bluebird');
     
    module.exports = function(Employee) {
      Employee.sayHello = msg => {
        return new Promise((resolve) => {
          resolve('Hello ' + msg);
        });
      };
      
      Employee.sayBye = msg => {
        return new Promise((resolve) => {
          resolve('Goodbye ' + msg);
        });
      };
    };

    Add using JS in the model

    Deprecated, use addFromFile instead.

    You can define the name of the methods in the model that will provide the remote method definition.

      "mixins"{
        "SetupRemoteMethods": {
          "add": {
            "greet": "remotesDefinitions.greet"
          }
        }
      }

    In order to avoid having this definition in the model file, we can have the definition on a different file, let's say we name it remote-methods.js

    module.exports = {
      greet
    };
     
    function greet() {
      return {
        accepts: {arg: 'msg', type: 'string'},
        returns: {arg: 'greeting', type: 'string'},
      };
    }
     

    Then, on your model, you would need to have something like:

    module.exports = function(Employee) {
      // Include the definitions in the model for the mixin to be able to get them
      Employee.remotesDefinitions = require('./remote-methods');
     
      // The implementation of your remote method  
      Employee.greet = msg => {
        return new Promise((resolve) => {
          resolve('Hello ' + msg);
        });
      };
    };

    addFromFile

    There are some cases that you might want to call a method to return the definition. This happens for example if one of the properties should be calculated.

    You can add all the methods from the file:

      "mixins"{
        "SetupRemoteMethods": {
          "addFromFile": "./common/models/employee-remotes.js"
        }
      }

    Or just some of them:

      "mixins"{
        "SetupRemoteMethods": {
          "addFromFile": {
            "filename": "./common/models/employee-remotes.js",
            "methods": [ "sayHello" ]
          }
        }
      }

    The path of the file should be relative to process.cwd().

    The file (employee-remotes.js in our example) would contain the remotes definitions:

    module.exports = {
      sayHello,
      sayBye
    };
     
    function sayHello() {
      return {
        accepts: {arg: 'msg', type: 'string'},
        returns: {arg: 'greeting', type: 'string'},
      };
    }
     
    function sayBye() {
      return {
        accepts: {arg: 'msg', type: 'string'},
        returns: {arg: 'farewell', type: 'string'},
      };
    }

    Then, in the model, you will only need the implementation:

    module.exports = function(Employee) {
      Employee.sayHello = msg => {
        return new Promise((resolve) => {
          resolve('Hello ' + msg);
        });
      };
      
      Employee.sayBye = msg => {
        return new Promise((resolve) => {
          resolve('Goodbye ' + msg);
        });
      };
    };

    Credits

    Disabling remote methods feature is based on the discussion at https://github.com/strongloop/loopback/issues/651.

    The code for disable, disableAllExcept and ignoreACL options is based on this gist from ebarault, which was based on another gist from drmikecrowe.

    Module created by c3s4r for Devsu.

    Install

    npm i loopback-setup-remote-methods-mixin

    DownloadsWeekly Downloads

    881

    Version

    1.2.1

    License

    MIT

    Unpacked Size

    16.5 kB

    Total Files

    8

    Last publish

    Collaborators

    • c3s4r
    • devsu
    • drmikecrowe
    • ebarault