Skip to content

Node.js sample

Aaron Hanusa edited this page May 16, 2016 · 20 revisions

This sample requires nodejs.

Start by creating a directory to house your code.

From a command line within your new directory, install peasy-js via npm install peasy-js.

Next create a data proxy by creating a file (personDataProxy.js) with the following content:

// personDataProxy.js

var PersonDataProxy = function() {

  this.data = [];

  this.getById = function(id, done) {
    var person = this.findBy(id);
    done(person);
  };

  this.getAll = function(done) {
    done(this.data);
  };

  this.insert = function(data, done) {
    data.id = this.data.length + 1;
    this.data.push(data);
    done(data);
  };

  this.update = function(data, done) {
    var person = this.findBy(data.id);
    person.name = data.name;
    done(person);
  };

  this.delete = function(id, done) {
    var person = this.findBy(id);
    var index = this.data.indexOf(person);
    this.data.splice(index, 1);
    done();
  };

  this.findBy = function(id) {
    var person = this.data.filter((function(p) {
      return p.id === id;
    }))[0];
    return person;
  };

};

module.exports = PersonDataProxy;

Then, create a service class file (personService.js), which exposes CRUD commands responsible for subjecting data proxy invocations to business rules before execution:

// personService.js

var BusinessService = require('peasy-js').BusinessService;

var PersonService = BusinessService.extend().service;

module.exports = PersonService;

Now let's consume our PersonService by creating a file (example.js) with the following contents:

// example.js

var peasy = require('peasy-js');
var PersonDataProxy = require('./personDataProxy');
var PersonService = require('./personService');

var personService = new PersonService(new PersonDataProxy());
var command = personService.insertCommand({name: "James Morrison"});

command.execute(function(err, result) {
  if (result.success) {
    console.log(result.value); // prints the inserted object with the assigned id
  }
});

Testing it out from command line: node example.js

Let's create a business rule file (personNameRule.js) whose execution must be successful before the call to inject dataproxy.insert() function is invoked.

// personNameRule.js

var Rule = require('peasy-js').Rule;

var PersonNameRule = Rule.extend({
  association: "name",
  params: ['name'],
  onValidate: function(done) {
    if (this.name === "Fred Jones") {
      this.__invalidate("Name cannot be Fred Jones");
    }
    done();
  }
});

module.exports = PersonNameRule;

And wire it up in our PersonService to ensure that it gets fired before inserts:

// personService.js

var BusinessService = require('peasy-js').BusinessService;
var PersonNameRule = require('./personNameRule');

var PersonService = BusinessService.extend({
  functions: [{
    '__getRulesForInsert': function(person, context, done) {
      done([ new PersonNameRule(person.name) ]);
    }
  }]
}).service;

module.exports = PersonService;

Testing it out ...

// example.js

var peasy = require('peasy-js');
var PersonDataProxy = require('./personDataProxy');
var PersonService = require('./personService');

var dataProxy = new PersonDataProxy();
var personService = new PersonService(dataProxy);

var command = personService.insertCommand({name: "Fred Jones"});

command.execute(function(err, result) {
  if (result.success) {
    console.log(result.value);
  } else {
    console.log(result.errors); // prints the errors as a result of the failed PersonNameRule
  }
});

Testing it out from command line: node example.js

Let's create one more rule (validCityRule.js), just for fun:

// validCityRule.js

var Rule = require('peasy-js').Rule;

var ValidCityRule = Rule.extend({
  association: "city",
  params: ['city'],
  onValidate: function(done) {
    if (this.city === "Nowhere") {
      this.__invalidate("Nowhere is not a city");
    }
    done();
  }
});

module.exports = ValidCityRule;

We'll associate this one with inserts too:

// personService.js

var BusinessService = require('peasy-js').BusinessService;
var PersonNameRule = require('./personNameRule');
var ValidCityRule = require('./validCityRule');

var PersonService = BusinessService.extend({
  functions: [{
    '__getRulesForInsert': function(person, context, done) {
      done([
        new PersonNameRule(person.name),
        new ValidCityRule(person.city)
      ]);
    }
  }]
}).service;

module.exports = PersonService;

And test it out ...

// example.js

var peasy = require('peasy-js');
var PersonDataProxy = require('./personDataProxy');
var PersonService = require('./personService');

var dataProxy = new PersonDataProxy();
var personService = new PersonService(dataProxy);

var command = personService.insertCommand({name: "Fred Jones", city: "Nowhere"});

command.execute(function(err, result) {
  if (result.success) {
    console.log(result.value);
  } else {
    console.log(result.errors); // prints the errors as a result of the failed PersonNameRule and ValidCityRule rules
  }
});

Testing it out from command line: node example.js

Finally, let's pass in valid data and watch it be a success

// example.js

var peasy = require('peasy-js');
var PersonDataProxy = require('./personDataProxy');
var PersonService = require('./personService');

var dataProxy = new PersonDataProxy();
var personService = new PersonService(dataProxy);

var command = personService.insertCommand({name: "Freida Jones", city: "Madison"});

command.execute(function(err, result) {
  if (result.success) {
    console.log(result.value); // prints the inserted object with the assigned id
  } else {
    console.log(result.errors);
  }
});

Testing it out from command line: node example.js

Clone this wiki locally