@tasolutions/express-core
Version:
All libs for express
76 lines (65 loc) • 2.96 kB
JavaScript
const Response = require('../../utils/v1Response');
const queryUtil = require('../../utils/query.util');
const { mapHeadersToQuery, headersToInclude } = require('../../utils/requestHeader');
const excel = require('exceljs');
module.exports = {
/**
* This crud exportToExcel
*/
exportToExcel: async (req, res, Collection, configs) => {
try {
await mapHeadersToQuery(req, Collection);
const sort = queryUtil.getSort(req);
const query = await queryUtil.getQuery(Collection, req);
if (req.query.search) {
query = queryUtil.search(Collection, req.query.search);
}
const populate = req.headers['x-populate'] ? req.headers['x-populate'].split(',') : queryUtil.populateField(Collection);
const results = await Collection.find(query).populate(populate).sort(sort);
const workbook = new excel.Workbook();
const worksheet = workbook.addWorksheet('Data');
const generateHeaders = (schema, prefix = '') => {
const headers = [];
for (const path in schema.paths) {
const fieldSchema = schema.paths[path];
if (fieldSchema.instance === 'ObjectID' && fieldSchema.options.ref) {
const refSchema = mongoose.model(fieldSchema.options.ref).schema;
const refHeaders = generateHeaders(refSchema, `${prefix}${path}.`);
headers.push(...refHeaders);
} else {
headers.push(`${prefix}${path}`);
}
}
return headers;
};
const headers = configs && Array.isArray(configs.includeFields) && configs.includeFields.length > 0 ? headersToInclude(Collection.schema, configs.includeFields) : generateHeaders(Collection.schema);
worksheet.columns = headers.map((key) => {
return { header: key, key: key };
});
results.forEach((item) => {
const rowData = {};
headers.forEach((key) => {
rowData[key] = deepGet(item, key);
});
worksheet.addRow(rowData);
});
const buffer = await workbook.xlsx.writeBuffer();
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.setHeader('Content-Disposition', `attachment; filename=${Collection.modelName}.xlsx`);
res.send(buffer);
} catch (e) {
return Response.error(req, res, e);
}
}
}
const deepGet = (obj, path) => {
const keys = path.split('.');
let value = obj;
for (const key of keys) {
if (!value || typeof value !== 'object') {
return undefined;
}
value = value[key];
}
return value;
};