Javascript Library based on micro-service design pattern to support and improve the development of function indicators. Built with best practices in mind from the experience of writing function indicators with on function maintenance app.
For details on function maintenance visit it's source codes, for online documentations visit https://hisptz.github.io/function-analytics/, visit it's source codes here.
Function analytics makes it easy for developers to focus on the business logic of their functions indicator while also considering the best way to perform analytics operations with out of the box performance execution strategy.
Start with adding fn-analytics to your project:
npm install @iapps/function-analytics
After installing you will be able to import the library into your project by using the files in the lib
folder:
// Using ES2015 imports
import { Fn } from '@iapps/function-analytics';
// Using CommonJS imports
var Fn = require('@iapps/function-analytics').Fn;
To be able to use fn-analytics you will first need to initialise the library. This is required to let the library know where it should load its data from.
Fn.init({
baseUrl: 'api_url_to_dhis_server',
username: 'username', //Optional if in a DHIS app
pasword: 'password' //Optional if in a DHIS app
});
You can fetch analytic with a few lines of code
new Fn.Analytics()
.setData('dx')
.setOrgUnit('ou')
.setPeriod('pe')
.postProcess(function(analyticsResult) {
// This adds post processing after fetching is done
return analyticsResult;
})
.get()
.progress(function(value) {
// Do something with the progress value
})
.then(function(analyticsResult) {
//The result after fetching and processing with the post process callback
});
You can put together dependencies if calls depend on one another
var orgunit = new Fn.IdentifiableObject('organisationUnits'); // Example of an organisation fetcher
orgunit.where('id', 'in', ['Rp268JB6Ne4', 'Rp268JB6Ne2']);
//Declare business process to run after orgunit results
var bussinessAfterOrgunitProcess = (orgUnitResult, analytics) => {
// Adds dependency
let ous = orgUnitResult.organisationUnits
.map(organisationUnit => {
return organisationUnit.id;
})
.join(';');
analytics.setPeriod('2016').setOrgUnit(ous);
};
var analytics = new Fn.Analytics();
analytics.preProcess(new Fn.Dependency(orgunit, bussinessAfterOrgunitProcess));
analytics.get().then(results => {});
You can invoke multiple processes
var orgunit = new Fn.IdentifiableObject('organisationUnits');
orgunit.where('id', 'in', ['Rp268JB6Ne4', 'Rp268JB6Ne2']);
var analytics = new Fn.Analytics();
analytics.setPeriod('2016').setOrgUnit('Rp268JB6Ne4;Rp268JB6Ne2');
var multiProcesses = Fn.all([orgunit, analytics]);
multiProcesses.postProcess(res => {
//res[0] is from orgunit
//res[1] is from analytics
return [res[1], res[0]];
});
multiProcesses.get().then(results => {});
With microservice architecture, function indicators have been designed to be a collection of loosely coupled services,which alows continous delivery and deployment of service, re-usable accross dhis2 instances and implementations.
Functions analytics microservice design has been implemented to run on both client-side as well as service server side implementation.
For detailed documentation please visit the documentation page.