alphascript-server
Version:
CRUD operations for mongo and other functionalities to get started quickly in any CMS project
96 lines (85 loc) • 2.82 kB
JavaScript
var api = require('../../../');
var Q = require('q');
var moment = require('moment');
var PdfTable = require('voilab-pdf-table');
var PdfDocument = require('pdfkit');
module.exports = {
getList: function (listKey) {
var list = api.listMap[listKey];
return function (req, res) {
//setup excel
var xlsHeader = {};
list.metadata.cols.forEach(function (col) {
xlsHeader[col.field] = col.title;
});
//parse parameters
if (req.query.query) req.query.query = JSON.parse(req.query.query);
//get data
list.get(req, function (err, items) {
if (err) return res.status(500).send(err);
if (req.query.xls) {
//on spreadsheet
var xls = { sheets: [] };
var filename = list.metadata.caption + ' ' + moment().format('YYYY-MM-DD') + '.xlsx';
xls.sheets.push({ header: xlsHeader, sheetName: req.params.db, items: items });
res.setHeader('Content-Type', 'application/vnd.openxmlformats');
res.setHeader("Content-Disposition", "attachment; filename=" + filename);
return res.send(api.xlsx.fromJson(xls));
}
else if (req.query.pdf) {
//on pdf
var pdf = new PdfDocument({
autoFirstPage: false,
size: [842, 595],
bufferPages: true,
});
pdf.fontSize(8);
var cols = list.metadata.cols.map(function (col) {
return {
id: col.field,
header: col.title,
width: (842 - 130) / list.metadata.cols.length
};
});
var table = new PdfTable(pdf, { bottomMargin: 30 });
table.setColumnsDefaults({
headerBorder: 'LTBR',
align: 'left'
}).addColumns(cols).onPageAdded(function (tb) {
tb.addHeader();
});
pdf.addPage();
items = items.map(function (item) {
for (var key in item) {
if (typeof item[key] === 'undefined') continue;
if (!item[key]) continue;
if (typeof item[key] !== 'string' && typeof item[key].toString === 'function') {
item[key] = item[key].toString();
}
}
return item;
});
table.addBody(items);
pdf.pipe(res);
return pdf.end();
}
else {
//on screen
return res.json(items);
}
});
};
},
getMetadata: function (req, res) {
var lists = [];
for (var key in api.listMap) {
lists.push(api.listMap[key].metadata);
}
lists.sort(function (a, b) {
if (a.category < b.category) return -1;
if (a.category > b.category) return 1;
return 0;
});
res.json(lists);
}
};