summaryrefslogtreecommitdiff
path: root/src/routes
diff options
context:
space:
mode:
authorRaphael Kabo <raphaelkabo@hey.com>2024-04-21 22:44:22 +0100
committerRaphael Kabo <raphaelkabo@hey.com>2024-05-26 15:55:56 +0100
commitde518b4d2510980750d9c54eda3b0e0fe8d73ecd (patch)
tree69c3fa5464d6f2657bef909c4f9bd057fee3dedb /src/routes
parent6f0721686aea7647554ad0f3ee4f6099bff4ef58 (diff)
feat: unattend events from RSVP email
Diffstat (limited to 'src/routes')
-rw-r--r--src/routes/event.ts42
-rw-r--r--src/routes/frontend.ts2
2 files changed, 44 insertions, 0 deletions
diff --git a/src/routes/event.ts b/src/routes/event.ts
index 3595e0a..1b79f12 100644
--- a/src/routes/event.ts
+++ b/src/routes/event.ts
@@ -6,6 +6,7 @@ import {
generateEditToken,
generateEventID,
generateRSAKeypair,
+ hashString,
} from "../util/generator.js";
import { validateEventData } from "../util/validation.js";
import { addToLog } from "../helpers.js";
@@ -712,4 +713,45 @@ router.delete(
},
);
+// Used to one-click unattend an event from an email.
+router.get(
+ "/event/:eventID/unattend/:removalPasswordHash",
+ async (req: Request, res: Response) => {
+ // Find the attendee by the unattendPasswordHash
+ const event = await Event.findOne({ id: req.params.eventID });
+ if (!event) {
+ return res.redirect("/404");
+ }
+ const attendee = event.attendees?.find(
+ (o) =>
+ hashString(o.removalPassword || "") ===
+ req.params.removalPasswordHash,
+ );
+ if (!attendee) {
+ return res.redirect(`/${req.params.eventID}`);
+ }
+ // Remove the attendee from the event
+ event.attendees = event.attendees?.filter(
+ (o) => o.removalPassword !== attendee.removalPassword,
+ );
+ 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",
+ {
+ 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`);
+ },
+);
+
export default router;
diff --git a/src/routes/frontend.ts b/src/routes/frontend.ts
index 58128a0..4d977d7 100644
--- a/src/routes/frontend.ts
+++ b/src/routes/frontend.ts
@@ -12,6 +12,7 @@ import {
} from "../lib/activitypub.js";
import MagicLink from "../models/MagicLink.js";
import { getConfigMiddleware } from "../lib/middleware.js";
+import { getMessage } from "../util/messages.js";
const router = Router();
@@ -377,6 +378,7 @@ router.get("/:eventID", async (req: Request, res: Response) => {
image: event.image,
editToken: editingEnabled ? eventEditToken : null,
},
+ message: getMessage(req.query.m as string),
});
}
} catch (err) {