import api from "@flatfile/api";
import { FlatfileListener } from "@flatfile/listener";
import { Builder } from 'xml2js';
import fs from 'fs';
export default function (listener) {
listener.on(
"job:ready",
{ job: "workbook:downloadXML" },
async ({ context: { jobId, workbookId } }) => {
try {
await api.jobs.ack(jobId, {
info: "Starting XML generation...",
progress: 10,
});
// Get workbook and find the target sheet
const workbook = await api.workbooks.get(workbookId);
const sheet = workbook?.data.sheets?.find(sheet => sheet.slug === "customers");
const records = await api.records.get(sheet?.id || "");
await api.jobs.ack(jobId, {
info: "Processing records...",
progress: 30,
});
// Initialize XML builder
const builder = new Builder({
xmldec: { version: '1.0', encoding: 'UTF-8' }
});
// Transform records to structured data
const customers = records.data.records.map(record => {
const values = record.values;
return {
id: values.id?.value || '',
name: values.name?.value || '',
email: values.email?.value || '',
phone: values.phone?.value || '',
address: {
street: values.street?.value || '',
city: values.city?.value || '',
state: values.state?.value || '',
zip: values.zip?.value || ''
}
};
});
// Create XML structure
const xmlObj = {
export: {
$: {
generated: new Date().toISOString(),
recordCount: customers.length
},
customers: {
customer: customers
}
}
};
// Generate XML string
const xml = builder.buildObject(xmlObj);
await api.jobs.ack(jobId, {
info: "Creating XML file...",
progress: 70,
});
// Write XML to temporary file
const fileName = `customer_export_${new Date().toISOString().split('T')[0]}.xml`;
fs.writeFileSync(fileName, xml);
// Upload file to Flatfile
const file = fs.createReadStream(fileName);
const fileUpload = await api.files.upload(file, {
spaceId: workbook.data.spaceId,
environmentId: workbook.data.environmentId,
});
// Complete job with download link
await api.jobs.complete(jobId, {
outcome: {
message: "XML file generated successfully",
next: {
type: "files",
label: "Download XML",
files: [{ fileId: fileUpload?.data?.id }],
},
},
});
// Clean up temporary file
fs.unlinkSync(fileName);
} catch (error) {
await api.jobs.fail(jobId, {
outcome: {
message: `Failed to generate XML: ${error.message}`,
},
});
}
}
);
}