summaryrefslogtreecommitdiff
path: root/src/routes/event.ts
diff options
context:
space:
mode:
authorRaphael Kabo <mail@raphaelkabo.com>2025-05-28 18:32:47 +0100
committerRaphael Kabo <mail@raphaelkabo.com>2025-05-28 18:32:47 +0100
commita6f8ec770d06ce33042ed3f222cba786897e0233 (patch)
treea060e72668de41fcbeae5e891ee86b096b096f26 /src/routes/event.ts
parent08fa2f616c90e59066d0308097c65c424b5b4a88 (diff)
parentfd637b405c8784a07dabd54b10fda98ad9f4a4ad (diff)
Merge remote-tracking branch 'origin/main' into clearer-editing-mode
Diffstat (limited to 'src/routes/event.ts')
-rw-r--r--src/routes/event.ts212
1 files changed, 90 insertions, 122 deletions
diff --git a/src/routes/event.ts b/src/routes/event.ts
index de5cb4c..84a7c6b 100644
--- a/src/routes/event.ts
+++ b/src/routes/event.ts
@@ -22,15 +22,15 @@ 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";
+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({
@@ -80,8 +80,8 @@ router.post(
});
}
- let eventID = generateEventID();
- let editToken = generateEditToken();
+ const eventID = generateEventID();
+ const editToken = generateEditToken();
let eventImageFilename;
let isPartOfEventGroup = false;
@@ -125,7 +125,7 @@ router.post(
}
// generate RSA keypair for ActivityPub
- let { publicKey, privateKey } = generateRSAKeypair();
+ const { publicKey, privateKey } = generateRSAKeypair();
const event = new Event({
id: eventID,
@@ -193,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(),
@@ -231,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);
@@ -256,7 +245,7 @@ router.post(
"createEvent",
"error",
"Attempt to send event group emails failed with error: " +
- err,
+ err,
);
}
}
@@ -332,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)
@@ -388,54 +377,54 @@ 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 =
- "<p>This event was just updated with new information.</p><ul>";
+ "<p>" + i18next.t("routes.event.difftext") + "</p><ul>";
let displayDate;
if (event.name !== updatedEvent.name) {
- diffText += `<li>the event name changed to ${updatedEvent.name}</li>`;
+ diffText += `<li>` + i18next.t("routes.event.namechanged", { eventname: updatedEvent.name} ) + `</li>`;
}
if (event.location !== updatedEvent.location) {
- diffText += `<li>the location changed to ${updatedEvent.location}</li>`;
+ diffText += `<li>` + i18next.t("routes.event.locationchanged", { location: updatedEvent.location} ) + `</li>`;
}
if (
event.start.toISOString() !== updatedEvent.start.toISOString()
) {
displayDate = moment
.tz(updatedEvent.start, updatedEvent.timezone)
- .format("dddd D MMMM YYYY h:mm a");
- diffText += `<li>the start time changed to ${displayDate}</li>`;
+ .format(i18next.t("common.datetimeformat"));
+ diffText += `<li>` + i18next.t("routes.event.starttimechanged", { starttime: displayDate }) + `</li>`;
}
if (event.end.toISOString() !== updatedEvent.end.toISOString()) {
displayDate = moment
.tz(updatedEvent.end, updatedEvent.timezone)
- .format("dddd D MMMM YYYY h:mm a");
- diffText += `<li>the end time changed to ${displayDate}</li>`;
+ .format(i18next.t("common.datetimeformat"));
+ diffText += `<li>` + i18next.t("routes.event.endtimechanged", { endtime: displayDate }) + `</li>`;
}
if (event.timezone !== updatedEvent.timezone) {
- diffText += `<li>the time zone changed to ${updatedEvent.timezone}</li>`;
+ diffText += `<li>` + i18next.t("routes.event.timezonechanged", { timezone: updatedEvent.timezone }) + `</li>`;
}
if (event.description !== updatedEvent.description) {
- diffText += `<li>the event description changed</li>`;
+ diffText += `<li>` + i18next.t("routes.event.descriptionchanged") + `</li>`;
}
diffText += `</ul>`;
const updatedEventObject = await Event.findOneAndUpdate(
@@ -452,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 = {
@@ -492,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(","),
- `${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: i18next.t("routes.event.editedsubject", { eventname: event.name}),
+ templateName: "editEvent",
+ templateData: {
+ diffText,
+ eventID: req.params.eventID,
+ },
+ });
}
res.sendStatus(200);
} catch (err) {
@@ -520,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: [
@@ -550,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) {
@@ -611,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,
@@ -692,20 +670,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: 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) {
@@ -744,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`);
},