const axios = require('axios'); const fs = require('fs'); const FormData = require('form-data') const XMLWriter = require('xml-writer'); publishWorkbooks: async (server, siteId, token, workbook, targetEnv) => { // server = Object // siteId = Tableau site id // token // workbook = Object (informations of the workbook in the API of Tableau) // targetEnv = Object /* ========================================== DOWNLOAD WORKBOOK FROM SOURCE ENV ========================================== */ // Download Workbook const downloadWorkbookContent = await axios.get(`${server.url}/api/2.8/sites/${siteId}/workbooks/${workbook.id}/content`, { headers: { 'X-Tableau-Auth': token, 'Content-Type': 'application/octet-stream' }, responseType: 'arraybuffer', }) //'Save file on Disk fs.writeFileSync("/tmp/response.twbx", downloadWorkbookContent.data, "binary") /* ========================================== PUBLISH DATA ON TARGET ENV ========================================== */ // Write the XML request let dsXml = new XMLWriter(); dsXml.startElement('tsRequest') .startElement('workbook') .writeAttribute('name', workbook.name) .startElement('project') .writeAttribute('id', targetEnv.projectId) .endElement() .endElement() .endElement(); // FormData initialization // Append of the different parts const form = new FormData(); form.append('request_payload', dsXml.toString(), { contentType: 'text/xml' }); form.append('tableau_workbook', fs.createReadStream('/tmp/response.twbx'), { contentType: 'application/octet-stream' }); return new Promise((resolve, reject) => { // Submission for upload form.submit( { // Remove any protocol (like http://) from start of server name host: targetEnv.url.replace(/.*?:\/\//g, ""), path: `/api/2.8/sites/${targetEnv.siteId}/workbooks?overwrite=true`, headers: { 'X-Tableau-Auth': targetEnv.token, 'Content-Type': `multipart/mixed; boundary=${form.getBoundary()}` } }, function (err, res) { if (err) { return reject(err); } let str = ''; res.on('data', function (chunk) { str += chunk; }); res.on('end', function () { log.d('Api publishWorkbook - Tableau Server return: status', res.statusCode) resolve(res.statusCode) }); }); // Api publishWorkbook - Upload done }) },