diff options
author | Raphael Kabo <mail@raphaelkabo.com> | 2022-04-25 19:03:24 +0100 |
---|---|---|
committer | Raphael Kabo <mail@raphaelkabo.com> | 2022-04-25 19:03:24 +0100 |
commit | 1c8348d553988f5474c8d7896c2804dc1d62159a (patch) | |
tree | 16990fae56e848e430312c2238be89268f937a75 /routes.js | |
parent | 168c2430e1e727429b76871cc32a9951e4391658 (diff) |
feat: Add subscribe to group functionality
Diffstat (limited to 'routes.js')
-rwxr-xr-x | routes.js | 118 |
1 files changed, 118 insertions, 0 deletions
@@ -741,6 +741,46 @@ router.post('/newevent', async (req, res) => { } }); } + // If the event was added to a group, send an email to any group + // subscribers + if (event.eventGroup && sendEmails) { + EventGroup.findOne({ _id: event.eventGroup._id }) + .then((eventGroup) => { + const subscribers = eventGroup.subscribers.reduce((acc, current) => { + if (acc.includes(current.email)) { + return acc; + } + return [ current.email, ...acc ]; + }, []); + subscribers.forEach(emailAddress => { + req.app.get('hbsInstance').renderView('./views/emails/eventgroupupdated.handlebars', { siteName, siteLogo, domain, eventID: req.params.eventID, eventGroupName: eventGroup.name, eventName: event.name, eventID: event.id, eventGroupID: eventGroup.id, emailAddress: encodeURIComponent(emailAddress), cache: true, layout: 'email.handlebars' }, function (err, html) { + const msg = { + to: emailAddress, + from: { + name: siteName, + email: contactEmail, + }, + subject: `${siteName}: New event in ${eventGroup.name}`, + html, + }; + switch (mailService) { + case 'sendgrid': + sgMail.send(msg).catch(e => { + console.error(e.toString()); + res.status(500).end(); + }); + break; + case 'nodemailer': + nodemailerTransporter.sendMail(msg).catch(e => { + console.error(e.toString()); + res.status(500).end(); + }); + break; + } + }); + }); + }); + } res.writeHead(302, { 'Location': '/' + eventID + '?e=' + editToken }); @@ -1533,6 +1573,84 @@ router.post('/removeattendee/:eventID/:attendeeID', (req, res) => { }); }); +/* + * Create an email subscription on an event group. + */ +router.post('/subscribe/:eventGroupID', (req, res) => { + const subscriber = { + email: req.body.emailAddress, + }; + if (!subscriber.email) { + return res.sendStatus(500); + } + + EventGroup.findOne(({ + id: req.params.eventGroupID, + })) + .then((eventGroup) => { + if (!eventGroup) { + return res.sendStatus(404); + } + eventGroup.subscribers.push(subscriber); + eventGroup.save(); + if (sendEmails) { + req.app.get('hbsInstance').renderView('./views/emails/subscribed.handlebars', { eventGroupName: eventGroup.name, eventGroupID: eventGroup.id, emailAddress: encodeURIComponent(subscriber.email), siteName, siteLogo, domain, cache: true, layout: 'email.handlebars' }, function (err, html) { + const msg = { + to: subscriber.email, + from: { + name: siteName, + email: contactEmail, + }, + subject: `${siteName}: You have subscribed to an event group`, + html, + }; + switch (mailService) { + case 'sendgrid': + sgMail.send(msg).catch(e => { + console.error(e.toString()); + res.status(500).end(); + }); + break; + case 'nodemailer': + nodemailerTransporter.sendMail(msg).catch(e => { + console.error(e.toString()); + res.status(500).end(); + }); + break; + } + }); + } + return res.redirect(`/group/${eventGroup.id}`) + }) + .catch((error) => { + addToLog("addSubscription", "error", "Attempt to subscribe " + req.body.emailAddress + " to event group " + req.params.eventGroupID + " failed with error: " + error); + return res.sendStatus(500); + }); +}); + +/* + * Delete an existing email subscription on an event group. + */ +router.get('/unsubscribe/:eventGroupID', (req, res) => { + const email = req.query.email; + console.log(email); + if (!email) { + return res.sendStatus(500); + } + + EventGroup.update( + { id: req.params.eventGroupID }, + { $pull: { subscribers: { email } } } + ) + .then(response => { + return res.redirect('/'); + }) + .catch((error) => { + addToLog("removeSubscription", "error", "Attempt to unsubscribe " + req.query.email + " from event group " + req.params.eventGroupID + " failed with error: " + error); + return res.sendStatus(500); + }); +}); + router.post('/post/comment/:eventID', (req, res) => { let commentID = nanoid(); const newComment = { |