Skip to content

Latest commit

 

History

History
126 lines (114 loc) · 4.17 KB

README.md

File metadata and controls

126 lines (114 loc) · 4.17 KB

behaviours-js Codacy Badge

0_00

Modern enterprise and customer behaviours framework written in JavaScript implementing Behaviour-first design and queue-map architecture as part of BeamJS.

Installation

npm install behaviours-js

Usage

var ( BusinessController, BehaviourConstructor, ModelEntity, QueryExpression } = require("behaviours-js");
var define = require("define-js");

// 1: define data controller
var ComparisonOperators = {
    EQUAL: "=",
    NE: "$ne"
};
backend.setComparisonOperators(ComparisonOperators);
var ModelController = function () {
    self.removeObjects = function (queryExprs, entity, callback) {
        // do remove
    };
    self.addObjects = function (objsAttributes, entity, callback) {
        // do add new
    };
    self.getObjects = function (queryExprs, entity, callback) {
        // do select
    };
    self.save = function (callback, oldSession) {
        // do select
    };
};
ModelController.defineEntity = function (name, attributes) {
    // define entity
    return entity;
};
ModelController.prototype.constructor = ModelController;

// 2: define data entity
var Schema = {
  id: Number
}
var EntityConstructor = ModelController.defineEntity("entity name", Schema);
var Entity = define(function (init) {
    return function (features, query, aggregate) {
        init.apply(this, [{
            constructor: EntityConstructor,
            attributes: Schema
        }]).self();
    };
}).extend(ModelEntity).defaults({
    constructor: EntityConstructor,
    attributes: Schema
});
ModelEntity.registerModelEntity({
    entity: Entity,
    entityName: "entity name"
});

// 3: define behaviour
var MyBehaviour = define(function (init) {
    return function () {
        var self = init.apply(this, arguments).self();
        var goal = null;
        var error = null;
        self.begin("ErrorHandling", function (key, businessController, operation) {
            operation.error(function (e) {
                return error || e;
            }).apply();
        });
        // validate self.inputObjects
        self.begin("Query", function (key, businessController, operation) {
            operation.query([new QueryExpression({
                fieldName: "id",
                comparisonOperator: ComparisonOperators.EQUAL,
                fieldValue: self.inputObjects.id
            })]).entity(new Entity({
                readonly: true
            })).callback(function (models, e) {
                if (e) error = e;
                goal = models;
            }).apply();
        }).begin("ModelObjectMapping", function (key, businessController, operation) {
            operation.callback(function (output) {
                output.goal = goal;
            }).apply();
        });
    };
}).extend(BehaviourConstructor).defaults({
    type: 1
});
var behaviour = new MyBehaviour({
    name: "behaviour name",
    type: 1, // 0: the behaviour will read data from external service
             // 1: it will read data from internal db
             // 2: it will write data to external service
             // 3: it will write data to internal db
    priority: 0,
    inputObjects: {} // an object of inputs
});

// 3: execute the behaviour
var businessController = new BusinessController({
    modelController: new ModelController(),
    ModelEntity: ModelEntity,
    QueryExpression: QueryExpression,
    ComparisonOperators: ComparisonOperators,
    operationCallback(data, operationType, operationSubtype) {
      // logic to be executed on all behaviours per operation
    }
});
var cancel = businessController.runBehaviour(behaviour, function (property, superProperty) {
  // data mapping logic for output
}, function(output, error) {
  // the output / the goal of behaviour
);

// call cancel() to cancel execution