Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Introduction


The following is an example of a daemon that uses the composer to function.

Similar to with services, we adhere to this folder schema to maintain code standardization.



Folder Schema


Code Samples


Code Block
languagejs
titleconfig.js
linenumberstrue
"use strict";

var daemon = {
   "type": "daemon",
   "dbs": [
      {
         prefix: "",
         name: "company",
         multitenant: false,
         mongo: true
      }
   ],
   prerequisites: {
      cpu: '',
      memory: ''
   },
   serviceName: "composerDaemon",
   serviceGroup: "Composer",
   servicePort: 4211,
   "errors": {},
   "schema": {
      "insertRecords": {
         "mw": __dirname + "/lib/mw/add.daemon.js",
         "_apiInfo": {
            "l": "Insert Records"
         }
      }
   }
};

module.exports = daemon;


Code Block
languagejs
titleindex.js
linenumberstrue
"use strict";
var composer = require("soajs.composer");
composer.deploy(__dirname +"/config.js", function(error){
   console.log( (error)? error : "Daemon started ...");
});


Middleware:

Code Block
languagejs
titlebuildMasterIndex job
linenumberstrue
"use strict";

var mongo = require("../model/mongo");

module.exports = {
   
   "checkIfExists": function (soajs, next) {
      
      var condition = {
         "id": 1
      };
      
      var combo = {
         condition: condition
      };
      if(!soajs.data){
         soajs.data = {}
      }
      mongo.findEntry(soajs, combo, function (error, oneRecord) {
         if (error) {
            return next(error);
         }
         if (oneRecord) {
            console.log("next()")
            next();
         }
         else {
            var combo2 = {
               "record": {
                  "name": "Joe",
                  "id": 1,
                  "position": "supervisor"
               }
            };
            
            mongo.insertEntries(soajs, combo2, function(error){
               if(error){
                  return next(error);
               }
               else{
                  console.log("insertEntries")
                  soajs.data.new= true;
                  next();
               }
            });
         }
      });
      
   },
   "update": function (soajs, end) {
      if (!soajs.data.new){
         var condition = {
            "id": 1
         };
         
         var combo = {
            condition: condition
         };
         
         mongo.findEntry(soajs, combo, function(error, oneRecord){
            if (error){
               return end(error);
            }
            else{
               var opt = {
                  ts: new Date().getTime()
               };
               
               var updated = {
                  "$set": opt
               };
               
               var combo1 = {
                  updatedFields: updated,
                  options: {
                     'upsert': false,
                     'multi': true
                  },
                  versioning: true,
                  condition: condition
               };
               mongo.updateEntries(soajs, combo1, function (error) {
                  if (error) {
                     return end(error);
                  }
                  
                  console.log("timestamp updated");
                  return end(null, true);
               });
            }
         });
      }
      else {
         return end(null, true);
      }
      
   }
};

Model:

Code Block
languagejs
titlemongo.js
linenumberstrue
"use strict";
var database = 'company';
var collection = 'employees';

var lib = {
   "defaults": function (combo) {
      if (!combo.database) {
         combo.database = database
      }
      if (!combo.collection) {
         combo.collection = collection
      }
      if (!Object.hasOwnProperty.call(combo, 'versioning')) {
         combo.versioning = false;
      }
   },
   
   "findEntry": function (soajs, combo, cb) {
      lib.defaults(combo);
      soajs.mongo[combo.database].findOne(combo.collection, combo.condition || {}, combo.fields || {}, cb);
   },
   "insertEntries": function (soajs, combo, cb) {
      lib.defaults(combo);
      soajs.mongo[combo.database].insert(combo.collection, combo.record, combo.versioning || false, cb);
   },
   "updateEntries": function (soajs, combo, cb) {
      lib.defaults(combo);
      soajs.mongo[combo.database].update(combo.collection, combo.condition, combo.updatedFields, combo.options || {}, combo.versioning || false, cb);
   }
};

module.exports = lib;

How to test


You can test this service for yourself by doing the following:

  • Create a local version of the folder schema on your machine
  • Copy the code from this page into their respective files
  • Run the following commands from a terminal window


Start controller

Code Block
languagebash
titleStart controller
linenumberstrue
# go to the controller directory and start the controller in the correct environment
 
cd /opt/soajs/node_modules/soajs.controller
 
export SOAJS_ENV=dev
export SOAJS_SRVIP = 127.0.0.1
 
node .
Code Block
languagebash
titleStart daemon
linenumberstrue
# go to the service directory and start the service in the correct environment
 
 
cd /opt/soajs/node_modules/composer.example/daemon/insertRecords
 
 
export SOAJS_ENV=dev
export SOAJS_SRVIP = 127.0.0.1
export SOAJS_DAEMON_GRP_CONF=catalog
 
node .