diff --git a/packages/component-mts-package/src/AWS.js b/packages/component-mts-package/src/AWS.js index f8c9262e7a750e935e7c64e36564a51d46b4d48a..7a64ffdcd2c9d1986bb586565118bd3717b4d450 100644 --- a/packages/component-mts-package/src/AWS.js +++ b/packages/component-mts-package/src/AWS.js @@ -8,7 +8,7 @@ const logger = require('@pubsweet/logger') const filterByType = (fileTypes = []) => ({ Metadata: { filetype } }) => fileTypes.length > 0 ? fileTypes.includes(filetype) : true -const zipAWSFiles = (s3Config, archiver = nodeArchiver) => { +const createFilesPackage = (s3Config, archiver = nodeArchiver) => { AWS.config.update({ secretAccessKey: s3Config.secretAccessKey, accessKeyId: s3Config.accessKeyId, @@ -40,8 +40,8 @@ const zipAWSFiles = (s3Config, archiver = nodeArchiver) => { if (s3Files) { const packageOutput = fs.createWriteStream(`${manuscriptName}.zip`) const archive = archiver('zip') - archive.pipe(packageOutput) + archive.pipe(packageOutput) archive.append(xmlFile.content, { name: xmlFile.name }) s3Files.filter(filterByType(fileTypes)).forEach(f => { @@ -52,9 +52,18 @@ const zipAWSFiles = (s3Config, archiver = nodeArchiver) => { name: isManuscript ? `${manuscriptName}.${extension}` : name, }) }) + archive.on('error', err => { throw err }) + archive.on('end', err => { + if (err) throw err + uploadToS3({ + s3, + filename: `${manuscriptName}.zip`, + Bucket: s3Config.bucket, + }) + }) archive.finalize() } } else { @@ -68,4 +77,42 @@ const zipAWSFiles = (s3Config, archiver = nodeArchiver) => { } } -module.exports = zipAWSFiles +const readFile = filename => + new Promise((resolve, reject) => { + fs.readFile(filename, (err, data) => { + if (err) reject(err) + resolve(data) + }) + }) + +const uploadToS3 = async ({ s3, filename, Bucket }) => { + const data = await readFile(filename) + const params = { + Bucket, + Body: data, + Key: `mts/${filename}`, + } + s3.upload(params, (err, data) => { + deleteFile(filename) + if (err) { + throw err + } else { + logger.info(`Successfully uploaded ${filename}`) + } + }) +} + +const deleteFile = filename => { + fs.access(filename, fs.constants.F_OK, err => { + if (err) { + if (err) throw err + } else { + fs.unlink(filename, err => { + if (err) throw err + logger.info(`Deleted ${filename}`) + }) + } + }) +} + +module.exports = createFilesPackage diff --git a/packages/component-mts-package/src/MTS.js b/packages/component-mts-package/src/MTS.js index 879d07e4263d88ab60c89a628a7afa9b0ab8a24c..5a69b65989e93114a3524fe888828a7c0023d386 100644 --- a/packages/component-mts-package/src/MTS.js +++ b/packages/component-mts-package/src/MTS.js @@ -1,7 +1,7 @@ const convert = require('xml-js') const { set, get } = require('lodash') -const zipAWSFiles = require('./AWS') +const createFilesPackage = require('./AWS') const mts = require('./mts-json-template') const { defaultConfig, @@ -206,9 +206,9 @@ class MTS { return this.convertToXML(this.composeJson(fragment)) } - createMTSPackage(fragment = {}) { + async createMTSPackage(fragment = {}) { const xmlFile = this.convertFragmentToXML(fragment) - zipAWSFiles(this.s3Config)({ fragment, xmlFile }) + await createFilesPackage(this.s3Config)({ fragment, xmlFile }) } }