diff --git a/api/cloud_api/email_templates/membershipConfirmationCode.js b/api/cloud_api/email_templates/membershipConfirmationCode.js
new file mode 100644
index 000000000..ff02e9d0f
--- /dev/null
+++ b/api/cloud_api/email_templates/membershipConfirmationCode.js
@@ -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: `
+
+ Hi,
+ Thank you for signing up for membership!
+ Please use the below confirmation code when you
+ visit your profile page on the
+ SCE website to verify your membership:
${confirmCode}
+
+ `
+ });
+ });
+}
+module.exports = { membershipConfirmationCode };
diff --git a/api/cloud_api/routes/Mailer.js b/api/cloud_api/routes/Mailer.js
index dca18e3be..605359f29 100644
--- a/api/cloud_api/routes/Mailer.js
+++ b/api/cloud_api/routes/Mailer.js
@@ -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');
@@ -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;
diff --git a/api/main_endpoints/util/emailHelpers.js b/api/main_endpoints/util/emailHelpers.js
index f9251f951..9742ff80a 100644
--- a/api/main_endpoints/util/emailHelpers.js
+++ b/api/main_endpoints/util/emailHelpers.js
@@ -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 };