UNPKG

@striven-erp/reportbuilder-js

Version:

A node.js Client for aggregating the Striven Report Builder

118 lines (102 loc) 2.68 kB
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;