Skip to content
Snippets Groups Projects
Commit db28c72f authored by Andrei Cioromila's avatar Andrei Cioromila
Browse files

refactor(collectionsInvitations): extract methods to send he and eic notification

parent 62b43f33
No related branches found
No related tags found
3 merge requests!160Update staging with master features,!156Develop,!149Hin 1089
const config = require('config')
const { services } = require('pubsweet-component-helper-service')
const { getEmailCopy } = require('./emailCopy')
const unsubscribeSlug = config.get('unsubscribe.url')
module.exports = {
sendInvitedHEEmail: ({
email,
eicName,
baseUrl,
customId,
titleText,
isCanceled,
handlingEditor,
}) => {
email.toUser = {
email: handlingEditor.email,
}
email.content.subject = isCanceled
? `${customId}: Editor invitation cancelled`
: `${customId}: Invitation to edit a manuscript`
email.content.unsubscribeLink = services.createUrl(
baseUrl,
unsubscribeSlug,
{
id: handlingEditor.id,
token: handlingEditor.accessTokens.unsubscribe,
},
)
const { html, text } = email.getNotificationBody({
emailBodyProps: getEmailCopy({
titleText,
targetUserName: eicName,
emailType: isCanceled ? 'he-revoked' : 'he-assigned',
}),
})
email.sendEmail({ html, text })
},
sendEiCEmail: async ({
eic,
email,
baseUrl,
customId,
comments,
titleText,
isAccepted,
targetUserName,
}) => {
email.content.subject = isAccepted
? `${customId}: Editor invitation accepted`
: `${customId}: Editor invitation declined`
const emailType = isAccepted ? 'he-accepted' : 'he-declined'
email.toUser = {
email: eic.email,
}
email.content.unsubscribeLink = services.createUrl(baseUrl)
const { html, text } = email.getNotificationBody({
emailBodyProps: getEmailCopy({
comments,
emailType,
titleText,
targetUserName,
}),
})
email.sendEmail({ html, text })
},
}
...@@ -10,19 +10,20 @@ const { ...@@ -10,19 +10,20 @@ const {
Fragment, Fragment,
} = require('pubsweet-component-helper-service') } = require('pubsweet-component-helper-service')
const { sendInvitedHEEmail, sendEiCEmail } = require('./helpers') const { getEmailCopy } = require('./emailCopy')
const unsubscribeSlug = config.get('unsubscribe.url')
module.exports = { module.exports = {
async sendNotifications({ sendInvitedHEEmail: async ({
reason, reason,
baseUrl, baseUrl,
invitedHE, invitedHE,
collection, collection,
isEiC = false,
isCanceled = false, isCanceled = false,
isAccepted = false, isAccepted = false,
models: { User: UserModel, Fragment: FragmentModel }, models: { User: UserModel, Fragment: FragmentModel },
}) { }) => {
const fragmentId = last(collection.fragments) const fragmentId = last(collection.fragments)
const fragment = await FragmentModel.find(fragmentId) const fragment = await FragmentModel.find(fragmentId)
const fragmentHelper = new Fragment({ fragment }) const fragmentHelper = new Fragment({ fragment })
...@@ -41,40 +42,97 @@ module.exports = { ...@@ -41,40 +42,97 @@ module.exports = {
const eicName = `${eic.firstName} ${eic.lastName}` const eicName = `${eic.firstName} ${eic.lastName}`
const { customId } = collection const { customId } = collection
const { paragraph, ...bodyProps } = getEmailCopy({
titleText,
targetUserName: eicName,
emailType: isCanceled ? 'he-revoked' : 'he-assigned',
})
const email = new Email({ const email = new Email({
type: 'user', type: 'user',
fromEmail: `${journalName} <${staffEmail}>`, fromEmail: `${journalName} <${staffEmail}>`,
toUser: {
email: invitedHE.email,
},
content: {
subject: isCanceled
? `${customId}: Editor invitation cancelled`
: `${customId}: Invitation to edit a manuscript`,
paragraph,
signatureName: eicName,
ctaLink: services.createUrl(
baseUrl,
`/projects/${collection.id}/versions/${fragment.id}/details`,
),
ctaText: 'MANUSCRIPT DETAILS',
unsubscribeLink: services.createUrl(baseUrl, unsubscribeSlug, {
id: invitedHE.id,
token: invitedHE.accessTokens.unsubscribe,
}),
},
bodyProps,
})
email.sendEmail()
},
sendEiCEmail: async ({
reason,
baseUrl,
invitedHE,
collection,
isCanceled = false,
isAccepted = false,
models: { User: UserModel, Fragment: FragmentModel },
}) => {
const fragmentId = last(collection.fragments)
const fragment = await FragmentModel.find(fragmentId)
const fragmentHelper = new Fragment({ fragment })
const { title } = await fragmentHelper.getFragmentData()
const { submittingAuthor } = await fragmentHelper.getAuthorData({
UserModel,
})
const titleText = `the manuscript titled "${title}" by ${
submittingAuthor.firstName
} ${submittingAuthor.lastName}`
const userHelper = new User({ UserModel })
const eics = await userHelper.getEditorsInChief()
const eic = eics[0]
const eicName = `${eic.firstName} ${eic.lastName}`
const { customId } = collection
const emailType = isAccepted ? 'he-accepted' : 'he-declined'
const { paragraph, ...bodyProps } = getEmailCopy({
emailType,
titleText,
comments: reason ? `Reason: "${reason}"` : '',
targetUserName: `${invitedHE.lastName}`,
})
const email = new Email({
type: 'user',
fromEmail: `${journalName} <${staffEmail}>`,
toUser: {
email: eic.email,
},
content: { content: {
subject: isAccepted
? `${customId}: Editor invitation accepted`
: `${customId}: Editor invitation declined`,
paragraph,
signatureName: eicName, signatureName: eicName,
ctaLink: services.createUrl( ctaLink: services.createUrl(
baseUrl, baseUrl,
`/projects/${collection.id}/versions/${fragment.id}/details`, `/projects/${collection.id}/versions/${fragment.id}/details`,
), ),
ctaText: 'MANUSCRIPT DETAILS', ctaText: 'MANUSCRIPT DETAILS',
unsubscribeLink: services.createUrl(baseUrl),
}, },
bodyProps,
}) })
if (isEiC) { email.sendEmail()
sendInvitedHEEmail({
email,
baseUrl,
eicName,
customId,
titleText,
isCanceled,
handlingEditor: invitedHE,
})
} else {
sendEiCEmail({
eic,
email,
baseUrl,
customId,
titleText,
isAccepted,
comments: reason ? `Reason: "${reason}"` : '',
targetUserName: `${invitedHE.lastName}`,
})
}
}, },
} }
...@@ -10,8 +10,7 @@ module.exports = models => async (req, res) => { ...@@ -10,8 +10,7 @@ module.exports = models => async (req, res) => {
const { collectionId, invitationId } = req.params const { collectionId, invitationId } = req.params
const { isAccepted, reason } = req.body const { isAccepted, reason } = req.body
const UserModel = models.User const user = await models.User.find(req.user)
const user = await UserModel.find(req.user)
try { try {
const collection = await models.Collection.find(collectionId) const collection = await models.Collection.find(collectionId)
...@@ -53,7 +52,7 @@ module.exports = models => async (req, res) => { ...@@ -53,7 +52,7 @@ module.exports = models => async (req, res) => {
await collection.save() await collection.save()
notifications.sendNotifications({ notifications.sendEiCEmail({
models, models,
reason, reason,
collection, collection,
......
...@@ -21,8 +21,7 @@ module.exports = models => async (req, res) => { ...@@ -21,8 +21,7 @@ module.exports = models => async (req, res) => {
error: `Role ${role} is invalid. Only handlingEditor is allowed.`, error: `Role ${role} is invalid. Only handlingEditor is allowed.`,
}) })
const UserModel = models.User const reqUser = await models.User.find(req.user)
const reqUser = await UserModel.find(req.user)
if (email === reqUser.email && !reqUser.admin) { if (email === reqUser.email && !reqUser.admin) {
logger.error(`${reqUser.email} tried to invite his own email`) logger.error(`${reqUser.email} tried to invite his own email`)
...@@ -68,7 +67,7 @@ module.exports = models => async (req, res) => { ...@@ -68,7 +67,7 @@ module.exports = models => async (req, res) => {
const invitationHelper = new Invitation({ role }) const invitationHelper = new Invitation({ role })
try { try {
const user = await UserModel.findByEmail(email) const user = await models.User.findByEmail(email)
invitationHelper.userId = user.id invitationHelper.userId = user.id
let invitation = invitationHelper.getInvitation({ let invitation = invitationHelper.getInvitation({
invitations: collection.invitations, invitations: collection.invitations,
...@@ -92,10 +91,9 @@ module.exports = models => async (req, res) => { ...@@ -92,10 +91,9 @@ module.exports = models => async (req, res) => {
await collection.save() await collection.save()
await collectionHelper.addHandlingEditor({ user, invitation }) await collectionHelper.addHandlingEditor({ user, invitation })
notifications.sendNotifications({ notifications.sendInvitedHEEmail({
models, models,
collection, collection,
isEiC: true,
invitedHE: user, invitedHE: user,
baseUrl: services.getBaseUrl(req), baseUrl: services.getBaseUrl(req),
}) })
......
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