Initial
This commit is contained in:
80
server/services/importExport.js
Normal file
80
server/services/importExport.js
Normal file
@@ -0,0 +1,80 @@
|
||||
const path = require('path');
|
||||
const readXlsxFile = require('read-excel-file/node');
|
||||
const writeXlsxFile = require('write-excel-file/node');
|
||||
const Papa = require('papaparse');
|
||||
const { XMLBuilder, XMLParser } = require('fast-xml-parser');
|
||||
const { now } = require('../db');
|
||||
const { assetExportRows } = require('./assets');
|
||||
|
||||
async function rowsFromImport(format, buffer) {
|
||||
const text = buffer.toString('utf8');
|
||||
if (format === 'json') {
|
||||
const parsed = JSON.parse(text);
|
||||
return Array.isArray(parsed) ? parsed : parsed.assets || [];
|
||||
}
|
||||
if (format === 'xml') {
|
||||
const parsed = new XMLParser({ ignoreAttributes: false }).parse(text);
|
||||
const assets = parsed.assets?.asset || parsed.MixedAssets?.assets?.asset || [];
|
||||
return Array.isArray(assets) ? assets : [assets];
|
||||
}
|
||||
if (format === 'xlsx' || format === 'xls') {
|
||||
const rows = await readXlsxFile(buffer);
|
||||
const headers = (rows.shift() || []).map((header) => String(header || '').trim());
|
||||
return rows.map((row) => Object.fromEntries(headers.map((header, index) => [header, row[index]])));
|
||||
}
|
||||
return Papa.parse(text, { header: true, skipEmptyLines: true }).data;
|
||||
}
|
||||
|
||||
async function assetExport(format) {
|
||||
const rows = assetExportRows();
|
||||
if (format === 'csv') {
|
||||
return {
|
||||
contentType: 'text/csv',
|
||||
filename: 'mixedassets-assets.csv',
|
||||
body: Papa.unparse(rows)
|
||||
};
|
||||
}
|
||||
if (format === 'xlsx') {
|
||||
const columns = Object.keys(rows[0] || {
|
||||
asset_id: '',
|
||||
description: '',
|
||||
category: '',
|
||||
status: '',
|
||||
acquisition_cost: '',
|
||||
in_service_date: ''
|
||||
});
|
||||
const sheetData = [
|
||||
columns.map((column) => ({ value: column, fontWeight: 'bold' })),
|
||||
...rows.map((row) => columns.map((column) => ({
|
||||
value: typeof row[column] === 'object' && row[column] !== null ? JSON.stringify(row[column]) : row[column]
|
||||
})))
|
||||
];
|
||||
return {
|
||||
contentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
filename: 'mixedassets-assets.xlsx',
|
||||
body: await writeXlsxFile(sheetData).toBuffer()
|
||||
};
|
||||
}
|
||||
if (format === 'xml') {
|
||||
return {
|
||||
contentType: 'application/xml',
|
||||
filename: 'mixedassets-assets.xml',
|
||||
body: new XMLBuilder({ format: true }).build({ assets: { asset: rows } })
|
||||
};
|
||||
}
|
||||
return {
|
||||
contentType: 'application/json',
|
||||
filename: 'mixedassets-assets.json',
|
||||
body: JSON.stringify({ exportedAt: now(), assets: rows })
|
||||
};
|
||||
}
|
||||
|
||||
function extensionForUpload(fileName) {
|
||||
return path.extname(fileName).replace('.', '').toLowerCase() || 'csv';
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
assetExport,
|
||||
extensionForUpload,
|
||||
rowsFromImport
|
||||
};
|
||||
Reference in New Issue
Block a user