diff options
Diffstat (limited to 'src/routes')
| -rw-r--r-- | src/routes/event.ts | 192 | ||||
| -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, 99 insertions, 146 deletions
diff --git a/src/routes/event.ts b/src/routes/event.ts index 2116df8..84a7c6b 100644 --- a/src/routes/event.ts +++ b/src/routes/event.ts @@ -22,7 +22,6 @@ 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"; @@ -32,7 +31,6 @@ import i18next from "i18next";  moment.locale(i18next.language);   const config = getConfig(); -  const storage = multer.memoryStorage();  // Accept only JPEG, GIF or PNG images, up to 10MB  const upload = multer({ @@ -82,8 +80,8 @@ router.post(              });          } -        let eventID = generateEventID(); -        let editToken = generateEditToken(); +        const eventID = generateEventID(); +        const editToken = generateEditToken();          let eventImageFilename;          let isPartOfEventGroup = false; @@ -127,7 +125,7 @@ router.post(          }          // generate RSA keypair for ActivityPub -        let { publicKey, privateKey } = generateRSAKeypair(); +        const { publicKey, privateKey } = generateRSAKeypair();          const event = new Event({              id: eventID, @@ -195,25 +193,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(), @@ -233,24 +226,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); @@ -258,7 +245,7 @@ router.post(                          "createEvent",                          "error",                          "Attempt to send event group emails failed with error: " + -                            err, +                        err,                      );                  }              } @@ -334,7 +321,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) @@ -390,24 +377,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 = @@ -454,7 +441,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 = { @@ -494,26 +481,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(","), -                        i18next.t("routes.event.editedsubject", { eventname: event.name}), -                        "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: i18next.t("routes.event.editedsubject", { eventname: event.name}), +                    templateName: "editEvent", +                    templateData: { +                        diffText, +                        eventID: req.params.eventID, +                    }, +                });              }              res.sendStatus(200);          } catch (err) { @@ -522,9 +503,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: [ @@ -552,12 +533,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) { @@ -613,21 +594,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, @@ -694,20 +670,15 @@ router.delete(                  "success",                  `Attendee removed self from event ${req.params.eventID}`,              ); -            if (attendeeEmail && req.app.locals.sendEmails) { -                await sendEmailFromTemplate( -                    attendeeEmail, -                    "", -                    i18next.t("routes.removeeventattendeesubject"), -                    "unattendEvent", -                    { +            if (attendeeEmail) { +                await req.emailService.sendEmailFromTemplate({ +                    to: attendeeEmail, +                    subject: i18next.t("routes.removeeventattendeesubject"), +                    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) { @@ -746,20 +717,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 16a44c8..a64bce4 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"; @@ -26,7 +25,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");      } @@ -45,7 +44,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 14312c1..1e0f87b 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"; @@ -49,19 +48,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, -        "", -        i18next.t("routes.magiclink.mailsubject"), -        "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: i18next.t("routes.magiclink.mailsubject"), +        templateName: "createEventMagicLink", +        templateData: { +            token          }, -        req, -    ); +    });      res.render("createEventMagicLink", {          ...frontendConfig(res),          message: {  | 
