@striven-erp/reportbuilder-js
Version:
A node.js Client for aggregating the Striven Report Builder
118 lines (102 loc) • 2.68 kB
JavaScript
const axios = require('axios');
const fs = require('fs');
class ReportBuilder {
constructor(data = []) {
this.data = data;
}
/**
* Returns the ReportBuilder Data
* @return {Array} ReportBuilder Data
*/
getData() {
return this.data;
}
/**
* Write report data to a json file
* @param {String} Name of the json file
* @returns {Promise} Resolves path to the directory
*/
toJson(filename) {
const file =
filename.split('.').pop() === 'json' ? filename : `${filename}.json`;
return new Promise((resolve, reject) => {
fs.writeFile(file, JSON.stringify(this.data), err => {
err ? reject(err) : resolve(file);
});
});
}
/**
* Map over the report builder data
* @param {Function} Map handler
* @returns {Array} Array of updated report builder data
*/
map(handler = d => d) {
const data = this.data.map(handler);
this.data = data;
return data;
}
}
/*
* Creates a report builder instance
* @param {String} URL for the Striven Report Builder API
* @returns {ReportBuilder} An instance of the ReportBuilder
*/
const reportbuilder = report => {
function validateReport() {
var pattern = new RegExp(
'^(https?:\\/\\/)?' +
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' +
'((\\d{1,3}\\.){3}\\d{1,3}))' +
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' +
'(\\?[;&a-z\\d%_.~+=-]*)?' +
'(\\#[-a-z\\d_]*)?$',
'i',
);
if (
!!pattern.test(report) &&
report.includes('striven') &&
report.includes('custom-report')
) {
return true;
} else {
return false;
}
}
return new Promise((resolve, reject) => {
function buildReport() {
function getNextPage(page, data = []) {
let addData = data;
axios
.get(page)
.then(res => {
const {nextPage, data} = res.data;
data && (addData = [...addData, ...data]);
if (nextPage) {
return getNextPage(nextPage, addData);
} else {
resolve(new ReportBuilder(addData));
return true;
}
})
.catch(err => reject(err));
}
axios
.get(report)
.then(res => {
const {data, nextPage} = res.data;
if (nextPage) {
getNextPage(nextPage, data);
} else {
resolve(new ReportBuilder(data));
}
})
.catch(err => reject(err));
}
if (report && validateReport()) {
buildReport();
} else {
reject('Invalid report.');
}
});
};
module.exports = reportbuilder;