From 164cf6fd5d4fefa859730d836595abe61a5fa21b Mon Sep 17 00:00:00 2001 From: Yogmatee Roochun <yroochun@ebi.ac.uk> Date: Fri, 15 Mar 2019 14:03:15 +0000 Subject: [PATCH] email - ongoing --- package.json | 1 + server/email/index.js | 8 +++++++ server/email/templates/ftp.js | 6 +++++ server/email/templates/index.js | 2 ++ server/ftp-integration/api.js | 5 +++- server/ftp-integration/taggedXML.js | 28 ++++++++++++++++++++-- server/ftp-integration/toTaggers.js | 36 ++++++++++++++++++++++------- server/utils/files.js | 11 +++++++++ yarn.lock | 2 +- 9 files changed, 87 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index d76ad7013..abd77d4a9 100755 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "request": "^2.88.0", "request-promise": "^4.2.4", "rfr": "^1.2.3", + "rimraf": "^2.6.3", "supertest": "^3.0.0", "tar": "^4.4.8", "tar-fs": "^1.16.3", diff --git a/server/email/index.js b/server/email/index.js index fccad8b35..12a41d9b0 100755 --- a/server/email/index.js +++ b/server/email/index.js @@ -10,6 +10,7 @@ const { removeDupeTemplate, newPackageForTaggingTemplate, processedTaggingFilesTemplate, + errorDevTemplate, bulkUploadTemplate, manuscriptHasBeenPublishedTemplate, finalReviewTemplate, @@ -64,6 +65,12 @@ const processedTaggerEmail = (email, manId, title, packageName) => { sendMail(email, subject, html, null, null, system) } +const errorDevEmail = (email, err) => { + const html = errorDevTemplate(err) + const subject = 'Something went wrong with the FTP utility functions' + sendMail(email, subject, html, null, null, system) +} + const bulkUploaderEmail = (email, message) => { const html = bulkUploadTemplate(message) const subject = 'Error while processing package' @@ -159,6 +166,7 @@ module.exports = { userMessage, taggerEmail, processedTaggerEmail, + errorDevEmail, taggerErrorEmail, bulkUploaderEmail, manuscriptHasBeenPublishedEmail, diff --git a/server/email/templates/ftp.js b/server/email/templates/ftp.js index 2fd0b769b..bc731c4d0 100644 --- a/server/email/templates/ftp.js +++ b/server/email/templates/ftp.js @@ -14,6 +14,11 @@ const processedTaggingFilesTemplate = (manId, title, packageName) => ` <p>Kind regards,</p> <p>The Europe PMC plus system</p> ` +const errorDevTemplate = err => ` + <p>Something went wrong with the FTP utility.<p> + <p>Error: <b>${err}</b> + <p>The Europe PMC plus system</p> + ` const bulkUploadTemplate = message => ` <p>There was an error while processing the package: <b>${message}</b><p> <p>Kind regards,</p> @@ -32,4 +37,5 @@ module.exports = { bulkUploadTemplate, manuscriptHasBeenPublishedTemplate, processedTaggingFilesTemplate, + errorDevTemplate, } diff --git a/server/email/templates/index.js b/server/email/templates/index.js index c05045c08..8e0f62905 100644 --- a/server/email/templates/index.js +++ b/server/email/templates/index.js @@ -9,6 +9,7 @@ const { removeDupeTemplate } = require('./removeDuplicate') const { newPackageForTaggingTemplate, processedTaggingFilesTemplate, + errorDevTemplate, bulkUploadTemplate, manuscriptHasBeenPublishedTemplate, } = require('./ftp') @@ -84,6 +85,7 @@ module.exports = { finalReviewTemplate, newPackageForTaggingTemplate, processedTaggingFilesTemplate, + errorDevTemplate, bulkUploadTemplate, manuscriptHasBeenPublishedTemplate, } diff --git a/server/ftp-integration/api.js b/server/ftp-integration/api.js index 1c78f65ae..3e111967b 100644 --- a/server/ftp-integration/api.js +++ b/server/ftp-integration/api.js @@ -27,7 +27,7 @@ const config = require('config') const rfr = require('rfr') const xsweetConverter = rfr('server/xsweet-conversion') -const { bulkUploaderEmail } = rfr('server/email') +const { bulkUploaderEmail, errorDevEmail } = rfr('server/email') // global.globalPath = '' // global.globalTmpPath = '' // global.manId = '' @@ -42,6 +42,7 @@ const graphqlClient = new ApolloClient({ link, }) const ftpUsers = config.get('users') +const ftpDev = config.get('ftp_devteam') const ignoreTaggerFolder = `${rootPath}${config.get('ftp_tagger').username}/*` const watcher = chokidar.watch(`${rootPath}**/*.tar.gz`, { @@ -91,6 +92,7 @@ process if (err.submitter) { bulkUploaderEmail(err.submitter.email, err.message) } + errorDevEmail(ftpDev.email, err) logger.error('whoops! there was an error', err.stack) tidyUp(err.filePath, err.tmpPath, err.manId, true) }) @@ -98,6 +100,7 @@ process if (reason.submitter) { bulkUploaderEmail(reason.submitter.email, reason.message) } + errorDevEmail(ftpDev.email, reason) logger.error(`Unhandled Rejection at: ${reason.stack || reason}`) tidyUp(reason.filePath, reason.tmpPath, reason.manId, true) }) diff --git a/server/ftp-integration/taggedXML.js b/server/ftp-integration/taggedXML.js index 523ebf2e3..e4056aa6f 100644 --- a/server/ftp-integration/taggedXML.js +++ b/server/ftp-integration/taggedXML.js @@ -10,7 +10,14 @@ const config = require('config') const manuscriptModel = require('../xpub-model/entities/manuscript/data-access') const ftpTagger = config.get('ftp_tagger') -const { processedTaggerEmail, bulkUploaderEmail } = require('../email') +const ftpDev = config.get('ftp_devteam') +const { + processedTaggerEmail, + bulkUploaderEmail, + errorDevEmail, +} = require('../email') + +// const parentRootPath = '/home/yogmatee/projects/PLAY/chokidar/ftp_mock' const parentRootPath = `${process.env.HOME}/${config.get('ftp_directory')}/${ ftpTagger.username @@ -33,6 +40,22 @@ const watcher = chokidar.watch(`${rootPath}**/*.tar.gz`, { }, }) +process + .on('uncaughtException', err => { + if (err.submitter) { + bulkUploaderEmail(err.submitter.email, err.message) + } + errorDevEmail(ftpDev.email, err) + logger.error('whoops! there was an error', err.stack) + }) + .on('unhandledRejection', (reason, promise) => { + if (reason.submitter) { + bulkUploaderEmail(reason.submitter.email, reason.message) + } + errorDevEmail(ftpDev.email, reason) + logger.error(`Unhandled Rejection at: ${reason.stack || reason}`) + }) + watcher .on('add', path => logger.debug(`File ${path} has been added.`)) .on('add', path => processFile(path)) @@ -102,9 +125,10 @@ async function processFile(path) { manuscriptObj[0]['meta,title'], `${path}`, ) + // clean up tmp folder + await files.tidyUp(tmpPath) } catch (err) { logger.error('Error', err.message) - // send email to taggers bulkUploaderEmail(ftpTagger.email, `${path}`) } diff --git a/server/ftp-integration/toTaggers.js b/server/ftp-integration/toTaggers.js index cf5d2cd21..1a5511a33 100755 --- a/server/ftp-integration/toTaggers.js +++ b/server/ftp-integration/toTaggers.js @@ -10,9 +10,10 @@ const config = require('config') const passport = require('passport') const Manuscript = require('../xpub-model/entities/manuscript/data-access') -const { taggerEmail } = rfr('server/email') +const { taggerEmail, errorDevEmail } = rfr('server/email') const pubsweetServer = config.get('pubsweet-server.baseUrl') const ftpTagger = config.get('ftp_tagger') +const ftpDev = config.get('ftp_devteam') const ftpLocation = `${process.env.HOME}/${config.get('ftp_directory')}/${ ftpTagger.username @@ -31,7 +32,7 @@ module.exports = app => { }) } -// createPackageForTaggers('EMS90002') +// createPackageForTaggers('EMS92010') // noinspection JSAnnotator async function createPackageForTaggers(manid) { @@ -64,7 +65,13 @@ function getManuscript(manId) { manuscript.files = manuscript.files.filter(file => !file.deleted) resolve(manuscript) }) - .catch(err => reject(err)) + .catch(err => { + errorDevEmail( + ftpDev.email, + `Issue with retrieving the manuscript with id ${manId}. Error: ${err}`, + ) + reject(err) + }) }) } @@ -80,7 +87,10 @@ function createTempDir(manuscript) { tidyUp(directory) } fs.mkdir(directory, err => { - if (err) reject(err) + if (err) { + errorDevEmail(ftpDev.email, err) + reject(err) + } resolve(directory) }) }) @@ -209,6 +219,7 @@ async function createMetadataXML(tmpPath, manuscript) { return new Promise((resolve, reject) => { fs.writeFile(`${tmpPath}/${manuscript.id}.xml`, xml, err => { if (err) { + errorDevEmail(ftpDev.email, err) reject(err) } resolve(`${manuscript.id}.xml`) @@ -277,6 +288,7 @@ function createManifest(tmpPath, manuscript) { return new Promise((resolve, reject) => { fs.writeFile(`${tmpPath}/manifest.txt`, text, err => { if (err) { + errorDevEmail(ftpDev.email, err) reject(err) } resolve(true) @@ -293,6 +305,7 @@ function compress(tmpPath, manuscript, datedFolder) { exec(cmd, err => { if (err) { // node couldn't execute the command + errorDevEmail(ftpDev.email, err) logger.error(err) reject(err) } @@ -302,10 +315,17 @@ function compress(tmpPath, manuscript, datedFolder) { }) } -process.on('unhandledRejection', (reason, promise) => { - logger.error(`Unhandled Rejection at: ${reason.stack || reason}`) - tidyUp() -}) +process + .on('uncaughtException', err => { + errorDevEmail(ftpDev.email, err) + logger.error('whoops! there was an error', err.stack) + // tidyUp() + }) + .on('unhandledRejection', (reason, promise) => { + errorDevEmail(ftpDev.email, reason) + logger.error(`Unhandled Rejection at: ${reason.stack || reason}`) + // tidyUp() + }) function tidyUp(tmpPath) { try { diff --git a/server/utils/files.js b/server/utils/files.js index 6f8a8dea9..863d5b728 100644 --- a/server/utils/files.js +++ b/server/utils/files.js @@ -6,6 +6,7 @@ const mime = require('mime-types') const download = require('download') const fetch = require('node-fetch') const dateFormat = require('dateformat') +const rimraf = require('rimraf') const { minioClient } = require('express-middleware-minio') @@ -141,6 +142,16 @@ module.exports.readData = function readData(url) { }) } +module.exports.tidyUp = function tidyUp(tmpPath) { + return new Promise((resolve, reject) => { + rimraf(tmpPath, err => { + if (err) reject(err) + logger.info(`successfully deleted ${tmpPath}`) + resolve(true) + }) + }) +} + module.exports.fetchFile = function fetchFile(fileUrl) { return new Promise((resolve, reject) => { fetch(fileUrl, { diff --git a/yarn.lock b/yarn.lock index 6ea08f0d5..12568a880 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12568,7 +12568,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@2.x.x, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: +rimraf@2, rimraf@2.x.x, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== -- GitLab