Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions api/cloud_api/email_templates/membershipConfirmationCode.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
function membershipConfirmationCode(user, recipient, confirmCode) {
return new Promise((resolve, reject) => {
return resolve({
from: user,
to: recipient,
subject: 'SCE Membership Confirmation',
generateTextFromHTML: true,
html: `
<p>
Hi, <br />
Thank you for signing up for membership! <br />
Please use the below confirmation code when you
visit your profile page on the
SCE website to verify your membership: <br /> <b>${confirmCode}</b>
</p>
`
});
});
}
module.exports = { membershipConfirmationCode };
52 changes: 51 additions & 1 deletion api/cloud_api/routes/Mailer.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ const { verification } = require('../email_templates/verification');
const { passwordReset } = require('../email_templates/passwordReset');
const { blastEmail } = require('../email_templates/blastEmail');
const { unsubscribeEmail } = require('../email_templates/unsubscribeEmail');
const { membershipConfirmationCode } = require('../email_templates/membershipConfirmationCode');
const {
OK,
BAD_REQUEST
BAD_REQUEST,
SERVER_ERROR
} = require('../../util/constants').STATUS_CODES;
const logger = require('../../util/logger');
const { googleApiKeys } = require('../../config/config.json');
Expand Down Expand Up @@ -134,4 +136,52 @@ router.post('/sendUnsubscribeEmail', async (req, res) => {
return res.sendStatus(OK);
});

router.post('/sendMembershipConfirmationCode', async (req, res) => {
if (!ENABLED && process.env.NODE_ENV !== 'test') {
return res.sendStatus(OK);
}
const scopes = ['https://mail.google.com/'];
const pathToToken = __dirname + '/../../config/token.json';
const apiHandler = new SceGoogleApiHandler(scopes, pathToToken);
const tokenJson = await apiHandler.checkIfTokenFileExists();

if (tokenJson) {
if (apiHandler.checkIfTokenIsExpired(tokenJson)) {
logger.warn('refreshing token');
MetricsHandler.gcpRefreshTokenLastUpdated.set(Math.floor(Date.now() / 1000));
apiHandler.refreshToken();
}
} else {
logger.warn('getting new token! ', { tokenJson });
apiHandler.getNewToken();
}

const { recipientEmail, confirmationCode } = req.body;

if (!recipientEmail || !confirmationCode) {
logger.warn('Missing recipientEmail or confirmationCode', { body: req.body });
return res.status(BAD_REQUEST).json({
error: 'recipientEmail and confirmationCode are required',
});
}

await membershipConfirmationCode(USER, recipientEmail, confirmationCode)
.then((template) => {
apiHandler
.sendEmail(template)
.then((_) => {
res.sendStatus(OK);
MetricsHandler.emailSent.inc({ type: 'membershipConfirmationCode' });
})
.catch((err) => {
logger.error('unable to send confirmation code: ', err);
res.sendStatus(SERVER_ERROR);
});
})
.catch((err) => {
logger.error('unable to generate member confirmation email template: ', err);
res.sendStatus(SERVER_ERROR);
});
});

module.exports = router;
14 changes: 13 additions & 1 deletion api/main_endpoints/util/emailHelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,16 @@ async function sendPasswordReset(resetToken, email) {
});
}

module.exports = { sendUnsubscribeEmail, sendVerificationEmail, sendPasswordReset };
async function membershipConfirmationCode(confirmCode, email) {
return new Promise((resolve) => {
axios
.post(`${MAILER_API_URL}/Mailer/sendMembershipConfirmationCode`, {
recipientEmail: email,
confirmationCode: confirmCode
})
.then(() => resolve(true))
.catch(() => resolve(false));
});
}

module.exports = { sendUnsubscribeEmail, sendVerificationEmail, sendPasswordReset, membershipConfirmationCode };