Skip to content
Snippets Groups Projects
Commit f807ac82 authored by Sebastian Mihalache's avatar Sebastian Mihalache
Browse files

feat(component-manuscript-manager): send emails after HE revisions

parent d9e575ad
No related branches found
No related tags found
1 merge request!10Sprint #12
......@@ -256,10 +256,7 @@ module.exports = {
meta = { privateNote: '' },
}) => {
let subject, textBody
const privateNoteText =
meta.privateNote !== undefined
? `Private note: "${meta.privateNote}"`
: ''
const emailTemplate = 'notification'
const replacements = {
detailsUrl: helpers.createUrl(
......@@ -375,10 +372,8 @@ module.exports = {
replacements.signatureName
}`
break
case 'after-he-recommendation':
subject = `${
meta.collection.customId
}: Manuscript Recommendation Submitted`
case 'agreed-reviewers-after-recommendation':
subject = meta.emailSubject
replacements.hasLink = false
replacements.previewText =
'a manuscript has received a recommendation based on reviews'
......@@ -402,15 +397,29 @@ module.exports = {
replacements.previewText =
'a handling editor has submitted a recommendation'
replacements.intro = `Dear Dr. ${meta.eicName}`
replacements.paragraph = `It is my recommendation, based on the reviews I have received for the manuscript titled "${
replacements.paragraph = meta.paragraph
replacements.beforeAnchor =
'For more information about what is required, please visit the '
replacements.signatureName = meta.handlingEditorName
textBody = `${replacements.intro} ${replacements.paragraph} ${
replacements.beforeAnchor
} ${replacements.detailsUrl} ${replacements.afterAnchor} ${
replacements.signatureName
}`
break
case 'author-request-to-revision':
subject = `${meta.collection.customId}: Manuscript Recommendation`
replacements.previewText =
'a handling editor has submitted a recommendation'
replacements.intro = `Dear Dr. ${meta.fragment.authorName}`
replacements.paragraph = `In order for the manuscript titled "${
meta.fragment.title
}" by ${meta.fragment.authorName}, that ${
meta.heRecommendation
}. <br/><br/>
${privateNoteText}<br/><br/>`
}" by ${
meta.fragment.authorName
} to proceed to publication, there needs to be a revision. <br/><br/>
${meta.authorNoteText}<br/><br/>`
replacements.beforeAnchor =
'For more information, and to see the full review, please visit the '
'For more information about what is required, please visit the '
replacements.signatureName = meta.handlingEditorName
textBody = `${replacements.intro} ${replacements.paragraph} ${
replacements.beforeAnchor
......
......@@ -3,7 +3,10 @@ const last = require('lodash/last')
const statuses = config.get('statuses')
const updateStatus = async (collection, newStatus) => {
const updateStatusByRecommendation = async (collection, recommendation) => {
let newStatus = 'pendingApproval'
if (['minor', 'major'].includes(recommendation))
newStatus = 'revisionRequested'
collection.status = newStatus
collection.visibleStatus = statuses[collection.status].private
await collection.save()
......@@ -22,15 +25,14 @@ const getFragmentAndAuthorData = async ({
const submittingAuthorData = authors.find(
author => author.isSubmitting === true,
)
const author = await UserModel.find(submittingAuthorData.userId)
const authorName = `${author.firstName} ${author.lastName}`
const submittingAuthor = await UserModel.find(submittingAuthorData.userId)
const authorsPromises = authors.map(async author => {
const user = await UserModel.find(author.userId)
return `${user.firstName} ${user.lastName}`
})
const authorsList = await Promise.all(authorsPromises)
const { id } = fragment
return { title, authorName, id, abstract, authorsList }
return { title, submittingAuthor, id, abstract, authorsList }
}
const getAgreedReviewerInvitation = (invitations = []) =>
......@@ -42,7 +44,7 @@ const getAgreedReviewerInvitation = (invitations = []) =>
)
module.exports = {
updateStatus,
updateStatusByRecommendation,
getFragmentAndAuthorData,
getAgreedReviewerInvitation,
}
......@@ -41,13 +41,14 @@ const setupReviewSubmittedEmailData = async ({
})
}
const setupAfterRecommendationEmailData = async ({
const setupAgreedReviewersEmailData = async ({
baseUrl,
fragment: { title, authorName },
collection,
mailService,
UserModel,
FragmentModel,
recommendation,
}) => {
const agreedReviewerInvitations = collectionHelper.getAgreedReviewerInvitation(
collection.invitations,
......@@ -64,16 +65,20 @@ const setupAfterRecommendationEmailData = async ({
})
let users = await Promise.all(userPromises)
users = users.filter(Boolean)
const subject = `${collection.customId}: Manuscript ${getSubject(
recommendation,
)}`
users.forEach(user =>
mailService.sendNotificationEmail({
toEmail: user.email,
user,
emailType: 'after-he-recommendation',
emailType: 'agreed-reviewers-after-recommendation',
meta: {
collection: { customId: collection.customId },
fragment: { title, authorName },
handlingEditorName: collection.handlingEditor.name,
baseUrl,
emailSubject: subject,
},
}),
)
......@@ -85,15 +90,34 @@ const setupEiCRecommendationEmailData = async ({
fragment: { id, title, authorName },
collection,
mailService,
publish,
recommendation,
comments,
}) => {
// to do: get private note from recommendation
const privateNote = comments.find(comm => comm.public === false)
const content = get(privateNote, 'content')
const heRecommendation = publish
? 'we should proceed to publication'
: 'we should reject it for publication'
const privateNoteText =
content !== undefined ? `Private note: "${content}"` : ''
let paragraph
const heRecommendation = getHeRecommendation(recommendation)
switch (heRecommendation) {
case 'publish':
paragraph = `It is my recommendation, based on the reviews I have received for the manuscript titled "${title}" by ${authorName}, that we should proceed to publication. <br/><br/>
${privateNoteText}<br/><br/>`
break
case 'reject':
paragraph = `It is my recommendation, based on the reviews I have received for the manuscript titled "${title}" by ${authorName}, that we should reject it for publication. <br/><br/>
${privateNoteText}<br/><br/>`
break
case 'revision':
paragraph = `In order for the manuscript titled "${title}" by ${authorName} to proceed to publication, there needs to be a revision. <br/><br/>
${privateNoteText}<br/><br/>`
break
default:
throw new Error('undefined he recommentation type')
}
const eic = await getEditorInChief(UserModel)
const toEmail = eic.email
await mailService.sendNotificationEmail({
......@@ -101,19 +125,63 @@ const setupEiCRecommendationEmailData = async ({
emailType: 'eic-recommendation',
meta: {
collection: { customId: collection.customId, id: collection.id },
fragment: { id, title, authorName },
fragment: { id },
handlingEditorName: collection.handlingEditor.name,
baseUrl,
eicName: `${eic.firstName} ${eic.lastName}`,
heRecommendation,
privateNote: content,
paragraph,
},
})
}
const setupAuthorRequestToRevisionEmailData = async ({
baseUrl,
UserModel,
fragment: { id, title, submittingAuthor },
collection,
mailService,
comments,
}) => {
const authorNote = comments.find(comm => comm.public === true)
const content = get(authorNote, 'content')
const authorNoteText =
content !== undefined ? `Reason & Details: "${content}"` : ''
await mailService.sendNotificationEmail({
toEmail: submittingAuthor.email,
emailType: 'author-request-to-revision',
meta: {
collection: { customId: collection.customId, id: collection.id },
fragment: {
id,
title,
authorName: `${submittingAuthor.firstName} ${
submittingAuthor.lastName
}`,
},
handlingEditorName: collection.handlingEditor.name,
baseUrl,
authorNoteText,
},
})
}
const getSubject = recommendation =>
['minor', 'major'].includes(recommendation)
? 'Revision Requested'
: 'Recommendation Submitted'
const getHeRecommendation = recommendation => {
let heRecommendation = recommendation === 'reject' ? 'reject' : 'publish'
if (['minor', 'major'].includes(recommendation)) {
heRecommendation = 'revision'
}
return heRecommendation
}
module.exports = {
getEditorInChief,
setupReviewSubmittedEmailData,
setupAfterRecommendationEmailData,
setupAgreedReviewersEmailData,
setupEiCRecommendationEmailData,
setupAuthorRequestToRevisionEmailData,
}
......@@ -53,44 +53,52 @@ module.exports = models => async (req, res) => {
newRecommendation.recommendation = recommendation || undefined
newRecommendation.comments = comments || undefined
if (
['reject', 'publish'].includes(recommendation) &&
recommendationType === 'editorRecommendation'
) {
if (recommendationType === 'editorRecommendation') {
await collectionHelper.updateStatusByRecommendation(
collection,
recommendation,
)
const {
title,
authorName,
submittingAuthor,
id,
} = await collectionHelper.getFragmentAndAuthorData({
UserModel: models.User,
FragmentModel: models.Fragment,
collection,
})
const authorName = `${submittingAuthor.firstName} ${
submittingAuthor.lastName
}`
const baseUrl = helpers.getBaseUrl(req)
await userHelper.setupAfterRecommendationEmailData({
await userHelper.setupAgreedReviewersEmailData({
baseUrl,
UserModel: models.User,
FragmentModel: models.Fragment,
collection,
mailService,
fragment: { title, authorName },
recommendation,
})
await collectionHelper.updateStatus(collection, 'pendingApproval')
await userHelper.setupEiCRecommendationEmailData({
baseUrl,
UserModel: models.User,
collection,
mailService,
publish: recommendation === 'publish',
recommendation,
fragment: { title, id, authorName },
comments: newRecommendation.comments,
})
await userHelper.setupAuthorRequestToRevisionEmailData({
baseUrl,
UserModel: models.User,
collection,
mailService,
recommendation,
fragment: { title, id, submittingAuthor },
comments: newRecommendation.comments,
})
}
if (
['minor', 'major'].includes(recommendation) &&
recommendationType === 'editorRecommendation'
)
await collectionHelper.updateStatus(collection, 'revisionRequested')
fragment.recommendations.push(newRecommendation)
await fragment.save()
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment