windchime
windchime

Reputation: 1285

how to call default blueprint actions in a custom overridden one?

SailsJS provides default blueprint actions, such as find, update, create, etc.

I need to override some of them to suit particular business purposes. However, I would like to add to them, instead of simply override them. How to call the default blueprint actions in the overriding action.

For example, update can update the record of a model.

update 

I want to have update do more, besides updating the record of a model. In my custom update method, I do not want to duplicate default update. How can I do that?

Upvotes: 11

Views: 2953

Answers (3)

Mindastic
Mindastic

Reputation: 4121

I just came across the same issue and found a different way to fix it. It may help in the future if someone has the same problem. What I finally did was to re-write the action in the controller, in my case it was add and then, after doing some stuff inside, called the default blueprint's action. So, my code looks like below:

add: function (req, res) {
    if (xxx) {
        // I need to do something only when the condition above is met
        Section.count({xxx: xxx)}).exec(function (error, count) {
            if (error) {
                return res.json(500, {error: 'There was an error while trying to run query'});
            }
            //I do what I have to do
            return sails.hooks.blueprints.middleware.add(req, res);
        });
    } else {
        //I just return the default blueprint's action
        return sails.hooks.blueprints.middleware.add(req, res);
    }
}

So, basically, default blueprint functions are stored in: sails.hooks.blueprints.middleware

Upvotes: 10

Meeker
Meeker

Reputation: 5979

copy everything from

PROJECT-ROOT\node_modules\sails\lib\hooks\blueprints\actions

to

PROJECT-ROOT\config\blueprints

Make sure findOne.js is lowercase. You will need to modify each one to make reference to the location of actionUtil.js. You can now modify these at your hearts content without re-inventing the wheel.

Upvotes: 3

r0hitsharma
r0hitsharma

Reputation: 1762

You should look at lifecycle callbacks in sailsjs. So for example, you can use beforeUpdate or beforeCreate lifecycle callback to do more in the model:

var bcrypt = require('bcrypt');

module.exports = {

  attributes: {

    username: {
      type: 'string',
      required: true
    },

    password: {
      type: 'string',
      minLength: 6,
      required: true,
      columnName: 'encrypted_password'
    }

  },


  // Lifecycle Callbacks
  beforeCreate: function (values, cb) {

    // Encrypt password
    bcrypt.hash(values.password, 10, function(err, hash) {
      if(err) return cb(err);
      values.password = hash;
      //calling cb() with an argument returns an error. Useful for canceling the entire operation if some criteria fails.
      cb();
    });
  }
};

Upvotes: 3

Related Questions