diff --git a/packages/component-invite/src/routes/postHandleInvitation.js b/packages/component-invite/src/routes/postHandleInvitation.js index 85fd4151dcd1e929cc6f95b7cafd4435f958c482..893908b6642ff41fa55fbabd0f837d91535a62f8 100644 --- a/packages/component-invite/src/routes/postHandleInvitation.js +++ b/packages/component-invite/src/routes/postHandleInvitation.js @@ -1,6 +1,7 @@ const logger = require('@pubsweet/logger') const helpers = require('../helpers/helpers') const teamHelper = require('../helpers/Team') +const mailService = require('pubsweet-component-mail-service') module.exports = models => async (req, res) => { const { type, accept } = req.body @@ -20,13 +21,13 @@ module.exports = models => async (req, res) => { const { collectionId } = req.params try { - await models.Collection.find(collectionId) - const filteredInvitations = user.invitations.filter( + const collection = await models.Collection.find(collectionId) + const matchingInvitation = user.invitations.find( invitation => invitation.collectionId === collectionId && invitation.type === type, ) - if (filteredInvitations.length === 0) { + if (matchingInvitation === undefined) { res.status(400).json({ error: `Request data does not match any user invitation`, }) @@ -36,11 +37,25 @@ module.exports = models => async (req, res) => { return } - const matchingInvitation = filteredInvitations[0] matchingInvitation.hasAnswer = true if (accept === true) { matchingInvitation.isAccepted = true await user.save() + try { + const users = await models.User.all() + + const eic = users.find(user => user.editorInChief === true) + await mailService.setupHandlingEditorAgreedEmail( + eic.email, + user, + 'handling-editor-agreed', + `${req.protocol}://${req.get('host')}`, + collection.customId, + ) + } catch (e) { + logger.error(e) + return res.status(500).json({ error: 'Mail could not be sent.' }) + } } else { await teamHelper.removeTeamMember( matchingInvitation.teamId, diff --git a/packages/component-invite/src/tests/helpers/Model.js b/packages/component-invite/src/tests/helpers/Model.js index 7ff2e90b59f218c2e37967701d0ea8b70d78c73b..420cc704e1cfb10eaeb4e346648c192054f7b0dc 100644 --- a/packages/component-invite/src/tests/helpers/Model.js +++ b/packages/component-invite/src/tests/helpers/Model.js @@ -16,9 +16,8 @@ const build = () => { Team: {}, } UserMock.find = jest.fn(id => findMock(id, 'users')) - UserMock.findByEmail = jest.fn(email => findByEmailMock(email)) - + UserMock.all = jest.fn(() => Object.values(fixtures.users)) TeamMock.find = jest.fn(id => findMock(id, 'teams')) TeamMock.updateProperties = jest.fn(team => updatePropertiesMock(team, 'teams'), diff --git a/packages/component-invite/src/tests/postHandleInvitation.test.js b/packages/component-invite/src/tests/postHandleInvitation.test.js index ffa1215761d1b0a017f09a71f939dacb2d2a1c3c..e46e584d6980000aa96c3b145ce23d40d4ff130a 100644 --- a/packages/component-invite/src/tests/postHandleInvitation.test.js +++ b/packages/component-invite/src/tests/postHandleInvitation.test.js @@ -8,6 +8,7 @@ const Model = require('./helpers/Model') const models = Model.build() jest.mock('pubsweet-component-mail-service', () => ({ setupAssignEmail: jest.fn(), + setupHandlingEditorAgreedEmail: jest.fn(), })) const notFoundError = new Error() diff --git a/packages/component-mail-service/src/Mail.js b/packages/component-mail-service/src/Mail.js index 11d1f29f20684c90abf2c8e8f0df3e2f3baeb2fc..f7f573102cce617530cb6732e5ae1c1b06aa6448 100644 --- a/packages/component-mail-service/src/Mail.js +++ b/packages/component-mail-service/src/Mail.js @@ -83,6 +83,27 @@ module.exports = { } return Email.send(mailData) }, + setupHandlingEditorAgreedEmail: async ( + toEmail, + user, + emailType, + url, + collectionId, + ) => { + const { htmlBody, textBody } = getEmailBody(emailType, { + url, + name: `${user.firstName} ${user.lastName}`, + collectionId, + }) + const mailData = { + from: config.get('mailer.from'), + to: toEmail, + subject: 'Handling Editor Agreed', + text: textBody, + html: htmlBody, + } + return Email.send(mailData) + }, } const getEmailBody = (emailType, replacements) => { diff --git a/packages/component-mail-service/src/templates/handling-editor-agreed.html b/packages/component-mail-service/src/templates/handling-editor-agreed.html new file mode 100644 index 0000000000000000000000000000000000000000..3f24b1f4216f3d8554def6a0bc63fc80fb4afa36 --- /dev/null +++ b/packages/component-mail-service/src/templates/handling-editor-agreed.html @@ -0,0 +1,232 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html data-editor-version="2" class="sg-campaigns" xmlns="http://www.w3.org/1999/xhtml"> + +<head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1" /> + <!--[if !mso]><!--> + <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> + <!--<![endif]--> + <!--[if (gte mso 9)|(IE)]> + <xml> + <o:OfficeDocumentSettings> + <o:AllowPNG/> + <o:PixelsPerInch>96</o:PixelsPerInch> + </o:OfficeDocumentSettings> + </xml> + <![endif]--> + <!--[if (gte mso 9)|(IE)]> + <style type="text/css"> + body {width: 600px;margin: 0 auto;} + table {border-collapse: collapse;} + table, td {mso-table-lspace: 0pt;mso-table-rspace: 0pt;} + img {-ms-interpolation-mode: bicubic;} + </style> + <![endif]--> + + <style type="text/css"> + body, + p, + div { + font-family: helvetica, arial, sans-serif; + font-size: 14px; + } + + body { + color: #626262; + } + + body a { + color: #0D78F2; + text-decoration: none; + } + + p { + margin: 0; + padding: 0; + } + + table.wrapper { + width: 100% !important; + table-layout: fixed; + -webkit-font-smoothing: antialiased; + -webkit-text-size-adjust: 100%; + -moz-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + } + + img.max-width { + max-width: 100% !important; + } + + .column.of-2 { + width: 50%; + } + + .column.of-3 { + width: 33.333%; + } + + .column.of-4 { + width: 25%; + } + + @media screen and (max-width:480px) { + .preheader .rightColumnContent, + .footer .rightColumnContent { + text-align: left !important; + } + .preheader .rightColumnContent div, + .preheader .rightColumnContent span, + .footer .rightColumnContent div, + .footer .rightColumnContent span { + text-align: left !important; + } + .preheader .rightColumnContent, + .preheader .leftColumnContent { + font-size: 80% !important; + padding: 5px 0; + } + table.wrapper-mobile { + width: 100% !important; + table-layout: fixed; + } + img.max-width { + height: auto !important; + max-width: 480px !important; + } + a.bulletproof-button { + display: block !important; + width: auto !important; + font-size: 80%; + padding-left: 0 !important; + padding-right: 0 !important; + } + .columns { + width: 100% !important; + } + .column { + display: block !important; + width: 100% !important; + padding-left: 0 !important; + padding-right: 0 !important; + margin-left: 0 !important; + margin-right: 0 !important; + } + } + </style> + <!--user entered Head Start--> + + <!--End Head user entered--> +</head> + +<body> + <center class="wrapper" data-link-color="#0D78F2" data-body-style="font-size: 14px; font-family: helvetica,arial,sans-serif; color: #626262; background-color: #F4F4F4;"> + <div class="webkit"> + <table cellpadding="0" cellspacing="0" border="0" width="100%" class="wrapper" bgcolor="#F4F4F4"> + <tr> + <td valign="top" bgcolor="#F4F4F4" width="100%"> + <table width="100%" role="content-container" class="outer" align="center" cellpadding="0" cellspacing="0" border="0"> + <tr> + <td width="100%"> + <table width="100%" cellpadding="0" cellspacing="0" border="0"> + <tr> + <td> + <!--[if mso]> + <center> + <table><tr><td width="600"> + <![endif]--> + <table width="100%" cellpadding="0" cellspacing="0" border="0" style="width: 100%; max-width:600px;" align="center"> + <tr> + <td role="modules-container" style="padding: 0px 0px 0px 0px; color: #626262; text-align: left;" bgcolor="#F4F4F4" width="100%" + align="left"> + + <table class="module preheader preheader-hide" role="module" data-type="preheader" border="0" cellpadding="0" cellspacing="0" + width="100%" style="display: none !important; mso-hide: all; visibility: hidden; opacity: 0; color: transparent; height: 0; width: 0;"> + <tr> + <td role="module-content"> + <p>handling editor agreed</p> + </td> + </tr> + </table> + + <table class="wrapper" role="module" data-type="image" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;"> + <tr> + <td style="font-size:6px;line-height:10px;padding:20px 0px 20px 0px;" valign="top" align="center"> + <img class="max-width" border="0" style="display:block;color:#000000;text-decoration:none;font-family:Helvetica, arial, sans-serif;font-size:16px;max-width:10% !important;width:10%;height:auto !important;" + src="https://marketing-image-production.s3.amazonaws.com/uploads/bb39b20cf15e52c1c0933676e25f2b2402737c6560b8098c204ad6932b84eb2058804376dbc4db138c7a21dcaed9325bde36185648afac5bc97e3d73d4e12718.png" + alt="" width="60"> + </td> + </tr> + </table> + + <table class="module" role="module" data-type="text" border="0" cellpadding="0" cellspacing="0" width="100%" style="table-layout: fixed;"> + <tr> + <td style="padding:30px 23px 0px 23px;background-color:#ffffff;" height="100%" valign="top" bgcolor="#ffffff"> + <h1 style="text-align: center;">{{ name }} has agreed to be Handling Editor on manuscript {{ collectionId }}</h1> + + <div style="text-align: center;">Please click on the link below to access your dashboard.</div> + + <div style="text-align: center;"> </div> + + <div style="text-align: center;"> </div> + + </td> + </tr> + </table> + <table border="0" cellPadding="0" cellSpacing="0" class="module" data-role="module-button" data-type="button" role="module" + style="table-layout:fixed" width="100%"> + <tbody> + <tr> + <td align="center" bgcolor="#FFFFFF" class="outer-td" style="padding:0px 0px 30px 0px;background-color:#FFFFFF"> + <table border="0" cellPadding="0" cellSpacing="0" class="button-css__deep-table___2OZyb wrapper-mobile" + style="text-align:center"> + <tbody> + <tr> + <td align="center" bgcolor="#0d78f2" class="inner-td" style="border-radius:6px;font-size:16px;text-align:center;background-color:inherit"> + <a href="{{ url }}" style="background-color:#0d78f2;border:1px solid #333333;border-color:#0d78f2;border-radius:0px;border-width:1px;color:#ffffff;display:inline-block;font-family:arial,helvetica,sans-serif;font-size:16px;font-weight:normal;letter-spacing:0px;line-height:16px;padding:12px 18px 12px 18px;text-align:center;text-decoration:none" + target="_blank">VIEW DASHBOARD</a> + </td> + </tr> + </tbody> + </table> + </td> + </tr> + </tbody> + </table> + <div data-role="module-unsubscribe" class="module unsubscribe-css__unsubscribe___2CDlR" role="module" + data-type="unsubscribe" style="color:#444444;font-size:12px;line-height:20px;padding:16px 16px 16px 16px;text-align:center"> + <div class="Unsubscribe--addressLine"> + <p class="Unsubscribe--senderName" style="font-family:Arial, Helvetica, sans-serif;font-size:12px;line-height:20px">Hindawi Publishing Corporation</p> + <p style="font-family:Arial, Helvetica, sans-serif;font-size:12px;line-height:20px"> + <span class="Unsubscribe--senderAddress">315 Madison Ave, Third Floor, Suite 3070</span>, + <span class="Unsubscribe--senderCity">NEW YORK</span>, + <span class="Unsubscribe--senderState">NY</span> + <span class="Unsubscribe--senderZip">10017</span> + </p> + </div> + <p style="font-family:Arial, Helvetica, sans-serif;font-size:12px;line-height:20px"> + <a class="Unsubscribe--unsubscribeLink" href="[Unsubscribe]">Unsubscribe</a> + </p> + </div> + </td> + </tr> + </table> + <!--[if mso]> + </td></tr></table> + </center> + <![endif]--> + </td> + </tr> + </table> + </td> + </tr> + </table> + </td> + </tr> + </table> + </div> + </center> +</body> + +</html> \ No newline at end of file diff --git a/packages/component-mail-service/src/templates/handling-editor-agreed.txt b/packages/component-mail-service/src/templates/handling-editor-agreed.txt new file mode 100644 index 0000000000000000000000000000000000000000..550581b4489de9dca0da675eb4c3da2db498d815 --- /dev/null +++ b/packages/component-mail-service/src/templates/handling-editor-agreed.txt @@ -0,0 +1,6 @@ +{{ name }} has agreed to be Handling Editor on manuscript {{ collectionId }} +Please click on the link below to access your dashboard +{{ url }} VIEW DASHBOARD +Hindawi Publishing Corporation +315 Madison Ave, Third Floor, Suite 307 +New York, NY 10017 \ No newline at end of file