diff --git a/packages/component-helper-service/src/services/Fragment.js b/packages/component-helper-service/src/services/Fragment.js index 4b9e5edd4fefe8c3864698ba2ea205be4c3ecbac..17fdd5939e33b5f958a4081ae857c910142b6e96 100644 --- a/packages/component-helper-service/src/services/Fragment.js +++ b/packages/component-helper-service/src/services/Fragment.js @@ -1,6 +1,9 @@ const { get, remove } = require('lodash') +const config = require('config') const User = require('./User') +const { recommendations: confRecommendations } = config + class Fragment { constructor({ fragment }) { this.fragment = fragment @@ -146,6 +149,50 @@ class Fragment { rec => rec.recommendationType === 'review' && rec.submittedOn, ) } + + async getReviewersAndEditorsData({ collection, UserModel }) { + const { recommendations } = this.fragment + const revAndEditorData = await Promise.all( + recommendations.map(async rec => { + const user = await UserModel.find(rec.userId) + + let assignmentDate, submissionDate, isReviewer + + if (rec.recommendationType === confRecommendations.type.editor) { + if (user.id === collection.handlingEditor.id) { + const editorInvitation = collection.invitations.find( + inv => inv.userId === user.id, + ) + assignmentDate = editorInvitation.respondedOn + } else { + assignmentDate = this.fragment.submitted + } + + isReviewer = false + } else { + const reviewerInvitation = this.fragment.invitations.find( + inv => inv.userId === user.id, + ) + assignmentDate = reviewerInvitation.respondedOn + submissionDate = rec.createdOn + isReviewer = true + } + + return { + isReviewer, + submissionDate, + assignmentDate, + email: user.email, + title: user.title, + recommendation: rec, + lastName: user.lastName, + firstName: user.firstName, + } + }), + ) + + return revAndEditorData + } } module.exports = Fragment diff --git a/packages/component-manuscript-manager/src/routes/fragments/post.js b/packages/component-manuscript-manager/src/routes/fragments/post.js index 7b541025809ee4dea338b7f5cd6f2136e47dd034..66360a6f3b5848ab5d618565bfc177af379bfd30 100644 --- a/packages/component-manuscript-manager/src/routes/fragments/post.js +++ b/packages/component-manuscript-manager/src/routes/fragments/post.js @@ -13,10 +13,10 @@ const { features = {} } = config const sendMTSPackage = async (collection, fragment) => { const s3Config = get(config, 'pubsweet-component-aws-s3', {}) const mtsConfig = get(config, 'mts-service', {}) - const MTSService = require('pubsweet-component-mts-package') + const { sendPackage } = require('pubsweet-component-mts-package') const { journal, xmlParser, ftp } = mtsConfig - const MTS = new MTSService(journal, xmlParser, s3Config, ftp) + // const MTS = new MTSService(journal, xmlParser, s3Config, ftp) const packageFragment = { ...fragment, metadata: { @@ -25,7 +25,14 @@ const sendMTSPackage = async (collection, fragment) => { }, } - await MTS.sendPackage({ fragment: packageFragment }) + // await MTS.sendPackage({ fragment: packageFragment }) + await sendPackage({ + s3Config, + ftpConfig: ftp, + config: journal, + options: xmlParser, + fragment: packageFragment, + }) } module.exports = models => async (req, res) => { diff --git a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js index f5c5ccc81d4eae507099fb2f74081df3b09056d6..80fc1588c6078179f2f2b5883bf0e8967be37794 100644 --- a/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js +++ b/packages/component-manuscript-manager/src/routes/fragmentsRecommendations/post.js @@ -51,13 +51,13 @@ module.exports = models => async (req, res) => { error: 'Unauthorized.', }) + const fragmentHelper = new Fragment({ fragment }) if ( recommendation === recommendations.publish && recommendationType === recommendations.type.editor && collection.handlingEditor && collection.handlingEditor.id === req.user ) { - const fragmentHelper = new Fragment({ fragment }) if (!fragmentHelper.hasReviewReport()) { return res .status(400) @@ -94,7 +94,17 @@ module.exports = models => async (req, res) => { // the manuscript has not yet passed through the EQA process so we need to upload it to the FTP server if (isEditorInChief && recommendation === 'publish' && !hasEQA) { if (features.mts) { - await sendMTSPackage({ collection, fragment, isEQA: true }) + const fragmentUsers = await fragmentHelper.getReviewersAndEditorsData({ + collection, + UserModel: models.User, + }) + + await sendMTSPackage({ + collection, + fragment, + isEQA: true, + fragmentUsers, + }) } collection.status = 'inQA' @@ -168,7 +178,12 @@ module.exports = models => async (req, res) => { return res.status(200).json(newRecommendation) } -const sendMTSPackage = async ({ collection, fragment, isEQA = false }) => { +const sendMTSPackage = async ({ + fragment, + collection, + isEQA = false, + fragmentUsers = [], +}) => { const s3Config = get(config, 'pubsweet-component-aws-s3', {}) const mtsConfig = get(config, 'mts-service', {}) const { sendPackage } = require('pubsweet-component-mts-package') @@ -185,6 +200,7 @@ const sendMTSPackage = async ({ collection, fragment, isEQA = false }) => { await sendPackage({ isEQA, s3Config, + fragmentUsers, ftpConfig: ftp, config: journal, options: xmlParser, diff --git a/packages/component-mts-package/src/MTS.js b/packages/component-mts-package/src/MTS.js index f0fc9d0c705373f7941192ea108edca483ebdd6b..6199218055dd68d9803115ae62d6ca9ab51e9a39 100644 --- a/packages/component-mts-package/src/MTS.js +++ b/packages/component-mts-package/src/MTS.js @@ -15,12 +15,19 @@ module.exports = { sendPackage({ fragment = {}, isEQA = false, + fragmentUsers = [], config = defaultConfig, s3Config = defaultS3Config, ftpConfig = defaultFTPConfig, options = defaultParseXmlOptions, }) { - const composedJson = composeJson({ fragment, config, options }) + const composedJson = composeJson({ + isEQA, + config, + options, + fragment, + fragmentUsers, + }) const xmlFile = convertToXML({ options, json: composedJson, diff --git a/packages/component-mts-package/src/helpers.js b/packages/component-mts-package/src/helpers.js index 66a7fa02b11672c3e5f9c07d6e7a50915c34eacb..3490eeb2d7d8b1fa7ddb39f36fe85f1a1d122821 100644 --- a/packages/component-mts-package/src/helpers.js +++ b/packages/component-mts-package/src/helpers.js @@ -8,6 +8,7 @@ const { setHistory, setMetadata, setQuestions, + setReviewers, createFileName, setContributors, } = require('./templateSetters') @@ -26,7 +27,13 @@ module.exports = { content, } }, - composeJson: ({ fragment = {}, config, options }) => { + composeJson: ({ + config, + options, + isEQA = false, + fragment = {}, + fragmentUsers = [], + }) => { const { authors = [], files = [], @@ -36,18 +43,29 @@ module.exports = { } = fragment const jsonTemplate = getJsonTemplate(config) - return { + const fileName = createFileName({ + id: metadata.customId, + prefix: config.prefix, + }) + + let composedJson = { ...jsonTemplate, ...setMetadata({ options, metadata, + fileName, jsonTemplate, - prefix: config.prefix, }), ...setContributors(authors, jsonTemplate), ...setHistory(submitted, jsonTemplate), ...setFiles(files, jsonTemplate), ...setQuestions(conflicts, jsonTemplate), } + + if (isEQA) { + composedJson = setReviewers(fragmentUsers, jsonTemplate) + } + + return composedJson }, } diff --git a/packages/component-mts-package/src/templateSetters.js b/packages/component-mts-package/src/templateSetters.js index 06a21fb58efd00c980332987fecc25372649d15a..4ede2d0289a3453d4f996a9e88edff3b7a051328 100644 --- a/packages/component-mts-package/src/templateSetters.js +++ b/packages/component-mts-package/src/templateSetters.js @@ -8,8 +8,7 @@ const manuscriptTypes = config.get('journalConfig.manuscriptTypes') // const { defaultConfig, defaultParseXmlOptions } = require('../config/default') module.exports = { - setMetadata({ metadata, jsonTemplate, prefix, options }) { - const fileName = this.createFileName({ id: metadata.customId, prefix }) + setMetadata: ({ metadata, jsonTemplate, options, fileName }) => { const titleGroup = { 'article-title': parseHtml(metadata.title, options), } @@ -227,48 +226,90 @@ module.exports = { return jsonTemplate }, createFileName: ({ id = Date.now(), prefix }) => `${prefix}${id}`, - setReviewers: (reviewers = [], jsonTemplate) => { - const contrib = reviewers.map((rev, i) => ({ - _attributes: { - 'rev-type': 'reviewer', - }, - name: { - surname: { - _text: rev.lastName, + setReviewers: (users = [], jsonTemplate) => { + const xmlReviewers = users.map((user, i) => { + const assigmentDate = new Date(user.assignmentDate) + const revType = user.isReviewer ? 'reviewer' : 'editor' + const revObj = { + _attributes: { + 'rev-type': revType, }, - 'given-names': { - _text: rev.firstName, + name: { + surname: { + _text: user.lastName, + }, + 'given-names': { + _text: user.firstName, + }, + prefix: { + _text: user.title || 'Dr.', + }, }, - prefix: { - _text: rev.title || 'Dr.', + email: { + _text: user.email, }, - }, - email: { - _text: rev.email, - }, - xref: { - _attributes: { - 'ref-type': 'aff', - rid: `aff${i + 1}`, + xref: { + _attributes: { + 'ref-type': 'aff', + rid: `aff${i + 1}`, + }, }, - }, - })) - const aff = reviewers.map((rev, i) => ({ + date: [ + { + _attributes: { + 'date-type': 'assignment', + }, + day: { + _text: assigmentDate.getDate(), + }, + month: { + _text: assigmentDate.getMonth() + 1, + }, + year: { + _text: assigmentDate.getFullYear(), + }, + }, + ], + } + + if (user.recommendation) { + const submissionDate = new Date(user.submissionDate) + revObj.date.push({ + _attributes: { + 'date-type': 'submission', + }, + day: { + _text: submissionDate.getDate(), + }, + month: { + _text: submissionDate.getMonth() + 1, + }, + year: { + _text: submissionDate.getFullYear(), + }, + }) + revObj.comment = user.recommendation.comments.map(comm => ({ + _attributes: { + 'comment-type': comm.public ? 'comment' : 'Confidential', + }, + _text: comm.content, + })) + } + + return revObj + }) + const aff = users.map((user, i) => ({ _attributes: { id: `aff${i + 1}`, }, - country: rev.country || 'UK', + country: user.country || 'UK', 'addr-line': { - _text: rev.affiliation || '', + _text: user.affiliation || '', }, })) - set( - jsonTemplate, - 'article.front.article-meta.contrib-group.contrib', - contrib, - ) - set(jsonTemplate, 'article.front.article-meta.contrib-group.aff', aff) + set(jsonTemplate, 'article.front.rev-group.rev', xmlReviewers) + set(jsonTemplate, 'article.front.rev-group.aff', aff) return jsonTemplate }, diff --git a/packages/component-mts-package/tests/sampleWithReviewers.xml b/packages/component-mts-package/tests/sampleWithReviewers.xml index 9a7c38c5ddd6ea1d7830ecd41d40b26e7052e55f..2f20d2d52f213c7c667012c07f4f26584d006f12 100644 --- a/packages/component-mts-package/tests/sampleWithReviewers.xml +++ b/packages/component-mts-package/tests/sampleWithReviewers.xml @@ -50,7 +50,7 @@ </abstract> <funding-group></funding-group> </article-meta> - <rev-group> + <rev-group> <rev rev-type="reviewer"> <name>