Skip to content

Commit

Permalink
feat: parse average times to human readable format
Browse files Browse the repository at this point in the history
close #34
  • Loading branch information
BenMaruchu committed Aug 19, 2019
1 parent 85685ef commit e200149
Show file tree
Hide file tree
Showing 6 changed files with 307 additions and 19 deletions.
9 changes: 7 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 15 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,12 @@
"chore:deps": "ncu -u && npm install --save",
"lint:config": "eslint --print-config rollup.config.js"
},
"keywords": ["anzalab", "majifix", "analytics", "isomophic"],
"keywords": [
"anzalab",
"majifix",
"analytics",
"isomophic"
],
"repository": {
"type": "git",
"url": "git+https://github.com/anzalab/majifix-analytics.git"
Expand Down Expand Up @@ -83,7 +88,8 @@
"@lykmapipo/env": "^0.12.1",
"@lykmapipo/express-common": "^0.17.9",
"@lykmapipo/mongoose-common": "^0.25.9",
"lodash": "^4.17.15"
"lodash": "^4.17.15",
"parse-ms": "^2.1.0"
},
"engines": {
"node": ">=12.4.0",
Expand All @@ -95,10 +101,15 @@
}
},
"commitlint": {
"extends": ["@commitlint/config-conventional"]
"extends": [
"@commitlint/config-conventional"
]
},
"lint-staged": {
"src/**/*.js": ["npm run lint", "git add -A"]
"src/**/*.js": [
"npm run lint",
"git add -A"
]
},
"husky": {
"hooks": {
Expand Down
8 changes: 8 additions & 0 deletions src/base/facets.js
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,8 @@ export const SERVICE_TYPE_FACET = {
pending: { $sum: '$pending' },
resolved: { $sum: '$resolved' },
unattended: { $sum: '$unattended' },
averageResolveTime: { $avg: '$ttr.milliseconds' },
averageAttendTime: { $avg: '$call.duration.milliseconds' },
},
},
{
Expand All @@ -227,6 +229,8 @@ export const SERVICE_TYPE_FACET = {
pending: 1,
resolved: 1,
unattended: 1,
averageAttendTime: 1,
averageResolveTime: 1,
},
},
],
Expand Down Expand Up @@ -263,6 +267,8 @@ export const REPORTING_METHOD_FACET = {
count: { $sum: 1 },
pending: { $sum: '$pending' },
resolved: { $sum: '$resolved' },
averageResolveTime: { $avg: '$ttr.milliseconds' },
averageAttendTime: { $avg: '$call.duration.milliseconds' },
},
},
{
Expand All @@ -271,6 +277,8 @@ export const REPORTING_METHOD_FACET = {
count: 1,
pending: 1,
resolved: 1,
averageResolveTime: 1,
averageAttendTime: 1,
},
},
{ $sort: { count: -1 } },
Expand Down
23 changes: 10 additions & 13 deletions src/http.router.js
Original file line number Diff line number Diff line change
Expand Up @@ -394,13 +394,13 @@
*/

/* dependencies */
import _ from 'lodash';
import merge from 'lodash/merge';
import { Router } from '@lykmapipo/express-common';
import { getString } from '@lykmapipo/env';
import getOverviewReport from './reports/overview';
import getPerformanceReport from './reports/performance';
import getOperatorPerformanceReport from './reports/operator';
import { normalizeResultsForReports } from './util';
import { prepareReportResponse } from './util';

/* local constants */
const API_VERSION = getString('API_VERSION', '1.0.0');
Expand Down Expand Up @@ -429,16 +429,15 @@ const router = new Router({
* @apiUse AuthorizationHeaderErrorExample
*/
router.get(PATH_OVERVIEW, (request, response, next) => {
const options = _.merge({}, request.mquery);
const options = merge({}, request.mquery);

const filter = options.filter || {};

getOverviewReport(filter, (error, results) => {
const data = normalizeResultsForReports(results);

if (error) {
next(error);
} else {
const data = prepareReportResponse(results);
response.status(200);
response.json(data);
}
Expand All @@ -462,20 +461,19 @@ router.get(PATH_OVERVIEW, (request, response, next) => {
* @apiUse AuthorizationHeaderErrorExample
*/
router.get(PATH_PERFORMANCE, (request, response, next) => {
const options = _.merge({}, request.mquery);
const options = merge({}, request.mquery);

let filter = options.filter || {};

if (request.params.id) {
filter = _.merge({}, filter, { jurisdiction: request.params.id });
filter = merge({}, filter, { jurisdiction: request.params.id });
}

getPerformanceReport(filter, (error, results) => {
const data = normalizeResultsForReports(results);

if (error) {
next(error);
} else {
const data = prepareReportResponse(results);
response.status(200);
response.json(data);
}
Expand All @@ -501,20 +499,19 @@ router.get(PATH_PERFORMANCE, (request, response, next) => {
* @apiUse AuthorizationHeaderErrorExample
*/
router.get(PATH_OPERATOR_PERFORMANCE, (request, response, next) => {
const options = _.merge({}, request.mquery);
const options = merge({}, request.mquery);

let filter = options.filter || {};

if (request.params.id) {
filter = _.merge({}, filter, { operator: request.params.id });
filter = merge({}, filter, { operator: request.params.id });
}

getOperatorPerformanceReport(filter, (error, results) => {
const data = normalizeResultsForReports(results);

if (error) {
next(error);
} else {
const data = prepareReportResponse(results);
response.status(200);
response.json(data);
}
Expand Down
92 changes: 92 additions & 0 deletions src/util.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import head from 'lodash/head';
import merge from 'lodash/merge';
import map from 'lodash/map';
import parseMs from 'parse-ms';

/**
* @function
Expand Down Expand Up @@ -42,3 +44,93 @@ export const normalizeResultsForAggregations = results => {

return merge({}, defaultResults, { data: results });
};

/**
* @function
* @name normalizeTime
* @description Normalize average times which are in milliseconds to a human
* readable object
*
* @param {number} time Time in milliseconds
* @returns {object} time object that have days,hours,minutes, seconds and e.t.c
*
* @version 0.1.0
* @since 0.2.0
*/
export const normalizeTime = time => {
const averageTime = time >= 0 ? time : -time;

return parseMs(averageTime);
};

/**
* @function
* @name normalizeObjectTimes
* @description Normalize times in a provided object (item)
*
* @param {object} item Object with times to be normalized
* @returns {object} Object with averageResolve time and averageAttend Time parse
*
* @version 0.1.0
* @since 0.2.0
*/
export const normalizeObjectTimes = item => {
const normalizeObject = {};

normalizeObject.averageResolveTime = normalizeTime(item.averageResolveTime);

normalizeObject.averageAttendTime = normalizeTime(item.averageAttendTime);

return { ...item, ...normalizeObject };
};

/**
* @function
* @name prepareReportResponse
* @description Prepare response for Reports by normalizing response shape and average times
*
* @param {object} results Aggregation results
* @returns {object} Normalized response object
*
* @version 0.1.0
* @since 0.2.0
*/
export const prepareReportResponse = results => {
const defaultResults = {
data: {},
};

const data = head(results);

data.overall = head(data.overall);

if (data.overall) {
data.overall = normalizeObjectTimes(data.overall);
}

if (data.jurisdictions) {
data.jurisdictions = map(data.jurisdictions, normalizeObjectTimes);
}

if (data.priorities) {
data.priorities = map(data.priorities, normalizeObjectTimes);
}

if (data.services) {
data.services = map(data.services, normalizeObjectTimes);
}

if (data.groups) {
data.groups = map(data.groups, normalizeObjectTimes);
}

if (data.types) {
data.types = map(data.types, normalizeObjectTimes);
}

if (data.methods) {
data.methods = map(data.methods, normalizeObjectTimes);
}

return { ...defaultResults, data };
};
Loading

0 comments on commit e200149

Please sign in to comment.