From 5f745dc6a52cb623bbf7424df537c724711e6e6a Mon Sep 17 00:00:00 2001
From: Bogdan Cochior <bogdan.cochior@thinslices.com>
Date: Fri, 27 Jul 2018 11:54:51 +0300
Subject: [PATCH] feat(mts): upload package to S3 as backup

---
 packages/component-mts-package/src/AWS.js | 53 +++++++++++++++++++++--
 packages/component-mts-package/src/MTS.js |  6 +--
 2 files changed, 53 insertions(+), 6 deletions(-)

diff --git a/packages/component-mts-package/src/AWS.js b/packages/component-mts-package/src/AWS.js
index f8c9262e7..7a64ffdcd 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 879d07e42..5a69b6598 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 })
   }
 }
 
-- 
GitLab