const config = require('config') const { last } = require('lodash') const Email = require('@pubsweet/component-email-templating') const { name: journalName, staffEmail } = config.get('journal') const { User, services, Fragment, } = require('pubsweet-component-helper-service') const { getEmailCopy } = require('./emailCopy') const unsubscribeSlug = config.get('unsubscribe.url') module.exports = { sendInvitedHEEmail: async ({ baseUrl, invitedHE, collection, isCanceled = 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 { paragraph, ...bodyProps } = getEmailCopy({ titleText, targetUserName: eicName, emailType: isCanceled ? 'he-revoked' : 'he-assigned', }) const email = new Email({ type: 'user', 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, }) return email.sendEmail() }, notifyAuthorWhenHERemoved: async ({ baseUrl, collection, models: { User: UserModel, Fragment: FragmentModel }, }) => { const fragmentId = last(collection.fragments) const fragment = await FragmentModel.find(fragmentId) const fragmentHelper = new Fragment({ fragment }) const { title: titleText } = await fragmentHelper.getFragmentData() const { submittingAuthor } = await fragmentHelper.getAuthorData({ UserModel, }) const submittingAuthorName = `${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 { paragraph, ...bodyProps } = getEmailCopy({ titleText, targetUserName: submittingAuthorName, emailType: 'author-he-removed', }) const email = new Email({ type: 'user', fromEmail: `${eicName} <${staffEmail}>`, toUser: { email: submittingAuthor.email, name: submittingAuthorName, }, content: { subject: `${customId}: Your manuscript's editor was changed`, paragraph, signatureName: eicName, signatureJournal: journalName, unsubscribeLink: services.createUrl(baseUrl, unsubscribeSlug, { id: submittingAuthor.id, token: submittingAuthor.accessTokens.unsubscribe, }), }, bodyProps, }) return email.sendEmail() }, sendEiCEmail: async ({ reason, baseUrl, invitedHE, collection, 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: { subject: isAccepted ? `${customId}: Editor invitation accepted` : `${customId}: Editor invitation declined`, paragraph, signatureName: eicName, ctaLink: services.createUrl( baseUrl, `/projects/${collection.id}/versions/${fragment.id}/details`, ), ctaText: 'MANUSCRIPT DETAILS', unsubscribeLink: services.createUrl(baseUrl), }, bodyProps, }) return email.sendEmail() }, }