UNPKG

alphascript-server

Version:

CRUD operations for mongo and other functionalities to get started quickly in any CMS project

116 lines (104 loc) 3.88 kB
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) { //parse parameters if (req.query.query) req.query.query = JSON.parse(req.query.query); //get data list.get(req, function (err, result) { if (err) return res.status(500).send(err); //setup dynamic cols if applicable var items, cols; if (result instanceof Array) { items = result; cols = list.metadata.cols; } else { items = result.items; cols = result.cols; } //setup excel var xlsHeader = {}; cols.forEach(function (col) { xlsHeader[col.field] = col.title; }); 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 pdfCols = cols.map(function (col) { return { id: col.field, header: col.title, width: (842 - 130) / cols.length, padding: [2, 2, 2, 2], }; }); var table = new PdfTable(pdf, { bottomMargin: 30 }); table.setColumnsDefaults({ headerBorder: 'LTBR', headerPadding: [2, 2, 2, 2], border: 'LTBR', align: 'left', }).addColumns(pdfCols).onPageAdded(function (tb) { tb.pdf.image(api.options.logoPath, 75, 30, { height: 45 }); tb.pdf.text(api.options.appName + " " + moment().format('YYYY') + " - Todos os direitos reservados", 75, 77); tb.pdf.text("Listagem parametrizada pelo utilizador a dia " + moment().format('YYYY-MM-DD') + " - " + items.length + " registos", 75, 85); tb.addHeader(); }); pdf.addPage(); pdf.image(api.options.logoPath, 75, 30, { height: 45 }); pdf.text(api.options.appName + " " + moment().format('YYYY') + " - Todos os direitos reservados", 75, 77); pdf.text("Listagem parametrizada pelo utilizador a dia " + moment().format('YYYY-MM-DD') + " - " + items.length + " registos", 75, 85); items = items.map(function (item) { for (var key in item) { if (typeof item[key] === 'undefined') continue; if (!item[key] && item[key] !== 0) 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: items, cols: cols }); } }); }; }, 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); } };