@fabrix/spool-analytics
Version:
Spool: Analytics for Fabrix
98 lines (97 loc) • 3.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const common_1 = require("@fabrix/fabrix/dist/common");
const errors_1 = require("@fabrix/spool-sequelize/dist/errors");
const moment = require("moment");
const lodash_1 = require("lodash");
class AnalyticsService extends common_1.FabrixService {
build() {
const analytics = [];
for (const analytic in this.app.analytics) {
if (!this.app.analytics.hasOwnProperty(analytic)) {
continue;
}
if (!this.app.analytics[analytic].hasOwnProperty('build')) {
continue;
}
analytics.push(this.app.analytics[analytic]);
}
return Promise.all(analytics.map(analytic => {
return analytic.build();
}))
.then(results => {
this.app.log.info(results);
return;
});
}
findOne(params) {
}
findCompare(params) {
const Analytics = this.app.models['Analytic'];
const name = params.name;
return Analytics.findAll({
where: {
name: name
},
limit: 2,
order: [['created_at', 'DESC']]
})
.then(analytics => {
if (analytics.length === 0) {
throw new errors_1.ModelError('E_NOT_FOUND', `${name} not found`);
}
if (analytics.length === 1) {
analytics = [...analytics, ...analytics];
}
if (!analytics[0].group_label) {
const trend = this.trendGroup(analytics[0].data, analytics[1].data);
Object.assign(analytics[0], {
trend: trend,
trend_range: 2,
trend_date_range: [analytics[0].end, analytics[1].start],
});
}
else {
const trend = analytics[0].data.map((d, i) => {
return this.trendGroup(analytics[0].data[i], analytics[1].data[i]);
});
Object.assign(analytics[0], {
trend: trend,
trend_range: 2,
trend_date_range: [analytics[0].end, analytics[1].start],
});
}
return analytics[0];
});
}
trendGroup(group1 = [], group2 = []) {
const trend = [];
group1.forEach((d, i) => {
if (lodash_1.isNumber(d)) {
trend.push(d - (group2[i] || 0));
}
else {
trend.push(d);
}
});
return trend;
}
findGroup(params, query) {
const Analytics = this.app.models['Analytic'];
const start = moment(query.start);
const end = moment(query.end || Date.now());
const name = params.name;
return Analytics.findAll({
where: {
name: name,
start: {
$gte: start.format('YYYY-MM-DD HH:mm:ss')
},
end: {
$gte: end.format('YYYY-MM-DD HH:mm:ss')
}
}
});
}
}
exports.AnalyticsService = AnalyticsService;