diff options
Diffstat (limited to 'src/routes')
-rw-r--r-- | src/routes/event.ts | 193 | ||||
-rw-r--r-- | src/routes/frontend.ts | 5 | ||||
-rw-r--r-- | src/routes/group.ts | 28 | ||||
-rw-r--r-- | src/routes/magicLink.ts | 20 |
4 files changed, 100 insertions, 146 deletions
diff --git a/src/routes/event.ts b/src/routes/event.ts index de5cb4c..ee45d96 100644 --- a/src/routes/event.ts +++ b/src/routes/event.ts @@ -22,14 +22,13 @@ import { updateActivityPubActor, updateActivityPubEvent, } from "../activitypub.js"; -import { sendEmailFromTemplate } from "../lib/email.js"; import crypto from "crypto"; import ical from "ical"; import { markdownToSanitizedHTML } from "../util/markdown.js"; import { checkMagicLink, getConfigMiddleware } from "../lib/middleware.js"; import { getConfig } from "../lib/config.js"; -const config = getConfig(); +const config = getConfig(); const storage = multer.memoryStorage(); // Accept only JPEG, GIF or PNG images, up to 10MB @@ -80,8 +79,8 @@ router.post( }); } - let eventID = generateEventID(); - let editToken = generateEditToken(); + const eventID = generateEventID(); + const editToken = generateEditToken(); let eventImageFilename; let isPartOfEventGroup = false; @@ -125,7 +124,7 @@ router.post( } // generate RSA keypair for ActivityPub - let { publicKey, privateKey } = generateRSAKeypair(); + const { publicKey, privateKey } = generateRSAKeypair(); const event = new Event({ id: eventID, @@ -193,25 +192,20 @@ router.post( const savedEvent = await event.save(); addToLog("createEvent", "success", "Event " + eventID + "created"); // Send email with edit link - if (eventData.creatorEmail && req.app.locals.sendEmails) { - sendEmailFromTemplate( - eventData.creatorEmail, - "", - `${eventData.eventName}`, - "createEvent", - { + if (eventData.creatorEmail) { + req.emailService.sendEmailFromTemplate({ + to: eventData.creatorEmail, + subject: eventData.eventName, + templateName: "createEvent", + templateData: { eventID, editToken, - siteName: res.locals.config?.general.site_name, - siteLogo: res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, - }, - req, - ); + } + }); } // If the event was added to a group, send an email to any group // subscribers - if (event.eventGroup && req.app.locals.sendEmails) { + if (event.eventGroup) { try { const eventGroup = await EventGroup.findOne({ _id: event.eventGroup.toString(), @@ -231,24 +225,18 @@ router.post( [] as string[], ); subscribers?.forEach((emailAddress) => { - sendEmailFromTemplate( - emailAddress, - "", - `New event in ${eventGroup.name}`, - "eventGroupUpdated", - { - siteName: res.locals.config?.general.site_name, - siteLogo: - res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, + req.emailService.sendEmailFromTemplate({ + to: emailAddress, + subject: `New event in ${eventGroup.name}`, + templateName: "eventGroupUpdated", + templateData: { eventGroupName: eventGroup.name, eventName: event.name, eventID: event.id, eventGroupID: eventGroup.id, emailAddress: encodeURIComponent(emailAddress), - }, - req, - ); + } + }); }); } catch (err) { console.error(err); @@ -256,7 +244,7 @@ router.post( "createEvent", "error", "Attempt to send event group emails failed with error: " + - err, + err, ); } } @@ -332,7 +320,7 @@ router.put( } // Token matches // If there is a new image, upload that first - let eventID = req.params.eventID; + const eventID = req.params.eventID; let eventImageFilename = event.image; if (req.file?.buffer) { Jimp.read(req.file.buffer) @@ -388,24 +376,24 @@ router.put( eventGroup: isPartOfEventGroup ? eventGroup?._id : null, activityPubActor: event.activityPubActor ? updateActivityPubActor( - JSON.parse(event.activityPubActor), - eventData.eventDescription, - eventData.eventName, - eventData.eventLocation, - eventImageFilename, - startUTC, - endUTC, - eventData.timezone, - ) + JSON.parse(event.activityPubActor), + eventData.eventDescription, + eventData.eventName, + eventData.eventLocation, + eventImageFilename, + startUTC, + endUTC, + eventData.timezone, + ) : undefined, activityPubEvent: event.activityPubEvent ? updateActivityPubEvent( - JSON.parse(event.activityPubEvent), - eventData.eventName, - startUTC, - endUTC, - eventData.timezone, - ) + JSON.parse(event.activityPubEvent), + eventData.eventName, + startUTC, + endUTC, + eventData.timezone, + ) : undefined, }; let diffText = @@ -452,7 +440,7 @@ router.put( "Event " + req.params.eventID + " edited", ); // send update to ActivityPub subscribers - let attendees = updatedEventObject.attendees?.filter((el) => el.id); + const attendees = updatedEventObject.attendees?.filter((el) => el.id); // broadcast an identical message to all followers, will show in home timeline const guidObject = crypto.randomBytes(16).toString("hex"); const jsonObject = { @@ -492,26 +480,20 @@ router.put( } } // Send update to all attendees - if (req.app.locals.sendEmails) { - const attendeeEmails = event.attendees - ?.filter((o) => o.status === "attending" && o.email) - .map((o) => o.email); - if (attendeeEmails?.length) { - sendEmailFromTemplate( - config.general.email, - attendeeEmails.join(","), - `${event.name} was just edited`, - "editEvent", - { - diffText, - eventID: req.params.eventID, - siteName: res.locals.config?.general.site_name, - siteLogo: res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, - }, - req, - ); - } + const attendeeEmails = event.attendees + ?.filter((o) => o.status === "attending" && o.email) + .map((o) => o.email!); + if (attendeeEmails?.length) { + req.emailService.sendEmailFromTemplate({ + to: config.general.email, + bcc: attendeeEmails, + subject: `${event.name} was just edited`, + templateName: "editEvent", + templateData: { + diffText, + eventID: req.params.eventID, + }, + }); } res.sendStatus(200); } catch (err) { @@ -520,9 +502,9 @@ router.put( "editEvent", "error", "Attempt to edit event " + - req.params.eventID + - " failed with error: " + - err, + req.params.eventID + + " failed with error: " + + err, ); return res.status(500).json({ errors: [ @@ -550,12 +532,12 @@ router.post( }); } - let eventID = generateEventID(); - let editToken = generateEditToken(); + const eventID = generateEventID(); + const editToken = generateEditToken(); - let iCalObject = ical.parseICS(req.file.buffer.toString("utf8")); + const iCalObject = ical.parseICS(req.file.buffer.toString("utf8")); - let importedEventData = iCalObject[Object.keys(iCalObject)[0]]; + const importedEventData = iCalObject[Object.keys(iCalObject)[0]]; let creatorEmail: string | undefined; if (req.body.creatorEmail) { @@ -611,21 +593,16 @@ router.post( await event.save(); addToLog("createEvent", "success", `Event ${eventID} created`); // Send email with edit link - if (creatorEmail && req.app.locals.sendEmails) { - sendEmailFromTemplate( - creatorEmail, - "", - `${importedEventData.summary}`, - "createEvent", - { + if (creatorEmail) { + req.emailService.sendEmailFromTemplate({ + to: creatorEmail, + subject: importedEventData.summary || "", + templateName: "createEvent", + templateData: { eventID, editToken, - siteName: res.locals.config?.general.site_name, - siteLogo: res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, }, - req, - ); + }); } return res.json({ eventID: eventID, @@ -692,20 +669,15 @@ router.delete( "success", `Attendee removed self from event ${req.params.eventID}`, ); - if (attendeeEmail && req.app.locals.sendEmails) { - await sendEmailFromTemplate( - attendeeEmail, - "", - "You have been removed from an event", - "unattendEvent", - { + if (attendeeEmail) { + await req.emailService.sendEmailFromTemplate({ + to: attendeeEmail, + subject: "You have been removed from an event", + templateName: "unattendEvent", + templateData: { eventID: req.params.eventID, - siteName: res.locals.config?.general.site_name, - siteLogo: res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, }, - req, - ); + }); } res.sendStatus(200); } catch (e) { @@ -744,20 +716,15 @@ router.get( ); await event.save(); // Send email to the attendee - if (req.app.locals.sendEmails && attendee.email) { - sendEmailFromTemplate( - attendee.email, - "", - `You have been removed from ${event.name}`, - "unattendEvent", - { + if (attendee.email) { + req.emailService.sendEmailFromTemplate({ + to: attendee.email, + subject: `You have been removed from ${event.name}`, + templateName: "unattendEvent", + templateData: { event, - siteName: res.locals.config?.general.site_name, - siteLogo: res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, }, - req, - ); + }); } return res.redirect(`/${req.params.eventID}?m=unattend`); }, diff --git a/src/routes/frontend.ts b/src/routes/frontend.ts index 14bb779..1b95763 100644 --- a/src/routes/frontend.ts +++ b/src/routes/frontend.ts @@ -1,5 +1,4 @@ import { Router, Request, Response } from "express"; -import fs from "fs"; import moment from "moment-timezone"; import { marked } from "marked"; import { markdownToSanitizedHTML, renderPlain } from "../util/markdown.js"; @@ -25,7 +24,7 @@ const router = Router(); // Add config middleware to all routes router.use(getConfigMiddleware); -router.get("/", (_: Request, res: Response) => { +router.get("/", (_, res) => { if (res.locals.config?.general.show_public_event_list) { return res.redirect("/events"); } @@ -44,7 +43,7 @@ router.get("/about", (_: Request, res: Response) => { }); }); -router.get("/new", (req: Request, res: Response) => { +router.get("/new", (_: Request, res: Response) => { if (res.locals.config?.general.creator_email_addresses?.length) { return res.render("createEventMagicLink", frontendConfig(res)); } diff --git a/src/routes/group.ts b/src/routes/group.ts index 9f4105c..cc53976 100644 --- a/src/routes/group.ts +++ b/src/routes/group.ts @@ -5,7 +5,6 @@ import { validateGroupData } from "../util/validation.js"; import Jimp from "jimp"; import { addToLog } from "../helpers.js"; import EventGroup from "../models/EventGroup.js"; -import { sendEmailFromTemplate } from "../lib/email.js"; import { marked } from "marked"; import { renderPlain } from "../util/markdown.js"; import { checkMagicLink, getConfigMiddleware } from "../lib/middleware.js"; @@ -92,21 +91,16 @@ router.post( ); // Send email with edit link - if (groupData.creatorEmail && req.app.locals.sendEmails) { - sendEmailFromTemplate( - groupData.creatorEmail, - "", - `${eventGroup.name}`, - "createEventGroup", - { + if (groupData.creatorEmail) { + req.emailService.sendEmailFromTemplate({ + to: groupData.creatorEmail, + subject: eventGroup.name, + templateName: "createEventGroup", + templateData: { eventGroupID: eventGroup.id, editToken: eventGroup.editToken, - siteName: res.locals.config?.general.site_name, - siteLogo: res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, }, - req, - ); + }); } res.status(200).json({ @@ -182,7 +176,7 @@ router.put( } // Token matches // If there is a new image, upload that first - let eventGroupID = req.params.eventGroupID; + const eventGroupID = req.params.eventGroupID; let eventGroupImageFilename = eventGroup.image; if (req.file?.buffer) { Jimp.read(req.file.buffer) @@ -228,9 +222,9 @@ router.put( "editEventGroup", "error", "Attempt to edit event group " + - req.params.eventGroupID + - " failed with error: " + - err, + req.params.eventGroupID + + " failed with error: " + + err, ); return res.status(500).json({ errors: [ diff --git a/src/routes/magicLink.ts b/src/routes/magicLink.ts index b4afca6..e0a6310 100644 --- a/src/routes/magicLink.ts +++ b/src/routes/magicLink.ts @@ -1,6 +1,5 @@ import { Router, Request, Response } from "express"; import { frontendConfig } from "../lib/config.js"; -import { sendEmailFromTemplate } from "../lib/email.js"; import { generateMagicLinkToken } from "../util/generator.js"; import MagicLink from "../models/MagicLink.js"; import { getConfigMiddleware } from "../lib/middleware.js"; @@ -48,19 +47,14 @@ router.post("/magic-link/event/create", async (req: Request, res: Response) => { // Take this opportunity to delete any expired magic links await MagicLink.deleteMany({ expiryTime: { $lt: new Date() } }); - sendEmailFromTemplate( - email, - "", - `Magic link to create an event`, - "createEventMagicLink", - { - token, - siteName: res.locals.config?.general.site_name, - siteLogo: res.locals.config?.general.email_logo_url, - domain: res.locals.config?.general.domain, + req.emailService.sendEmailFromTemplate({ + to: email, + subject: "Magic link to create an event", + templateName: "createEventMagicLink", + templateData: { + token }, - req, - ); + }); res.render("createEventMagicLink", { ...frontendConfig(res), message: { |