Skip to content
Snippets Groups Projects
Commit 0cc29d90 authored by Sebastian's avatar Sebastian
Browse files

feat(component-invite): agree to work as HE

parent b0f7914f
No related branches found
No related tags found
No related merge requests found
const logger = require('@pubsweet/logger') const logger = require('@pubsweet/logger')
const helpers = require('../helpers/helpers') const helpers = require('../helpers/helpers')
const teamHelper = require('../helpers/Team') const teamHelper = require('../helpers/Team')
const mailService = require('pubsweet-component-mail-service')
module.exports = models => async (req, res) => { module.exports = models => async (req, res) => {
const { type, accept } = req.body const { type, accept } = req.body
...@@ -20,13 +21,13 @@ module.exports = models => async (req, res) => { ...@@ -20,13 +21,13 @@ module.exports = models => async (req, res) => {
const { collectionId } = req.params const { collectionId } = req.params
try { try {
await models.Collection.find(collectionId) const collection = await models.Collection.find(collectionId)
const filteredInvitations = user.invitations.filter( const matchingInvitation = user.invitations.find(
invitation => invitation =>
invitation.collectionId === collectionId && invitation.type === type, invitation.collectionId === collectionId && invitation.type === type,
) )
if (filteredInvitations.length === 0) { if (matchingInvitation === undefined) {
res.status(400).json({ res.status(400).json({
error: `Request data does not match any user invitation`, error: `Request data does not match any user invitation`,
}) })
...@@ -36,11 +37,25 @@ module.exports = models => async (req, res) => { ...@@ -36,11 +37,25 @@ module.exports = models => async (req, res) => {
return return
} }
const matchingInvitation = filteredInvitations[0]
matchingInvitation.hasAnswer = true matchingInvitation.hasAnswer = true
if (accept === true) { if (accept === true) {
matchingInvitation.isAccepted = true matchingInvitation.isAccepted = true
await user.save() 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 { } else {
await teamHelper.removeTeamMember( await teamHelper.removeTeamMember(
matchingInvitation.teamId, matchingInvitation.teamId,
......
...@@ -16,9 +16,8 @@ const build = () => { ...@@ -16,9 +16,8 @@ const build = () => {
Team: {}, Team: {},
} }
UserMock.find = jest.fn(id => findMock(id, 'users')) UserMock.find = jest.fn(id => findMock(id, 'users'))
UserMock.findByEmail = jest.fn(email => findByEmailMock(email)) UserMock.findByEmail = jest.fn(email => findByEmailMock(email))
UserMock.all = jest.fn(() => Object.values(fixtures.users))
TeamMock.find = jest.fn(id => findMock(id, 'teams')) TeamMock.find = jest.fn(id => findMock(id, 'teams'))
TeamMock.updateProperties = jest.fn(team => TeamMock.updateProperties = jest.fn(team =>
updatePropertiesMock(team, 'teams'), updatePropertiesMock(team, 'teams'),
......
...@@ -8,6 +8,7 @@ const Model = require('./helpers/Model') ...@@ -8,6 +8,7 @@ const Model = require('./helpers/Model')
const models = Model.build() const models = Model.build()
jest.mock('pubsweet-component-mail-service', () => ({ jest.mock('pubsweet-component-mail-service', () => ({
setupAssignEmail: jest.fn(), setupAssignEmail: jest.fn(),
setupHandlingEditorAgreedEmail: jest.fn(),
})) }))
const notFoundError = new Error() const notFoundError = new Error()
......
...@@ -83,6 +83,27 @@ module.exports = { ...@@ -83,6 +83,27 @@ module.exports = {
} }
return Email.send(mailData) 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) => { const getEmailBody = (emailType, replacements) => {
......
<!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;">&nbsp;</div>
<div style="text-align: center;">&nbsp;</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
{{ 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
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