summaryrefslogtreecommitdiff
path: root/src/routes/frontend.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/routes/frontend.ts')
-rw-r--r--src/routes/frontend.ts382
1 files changed, 193 insertions, 189 deletions
diff --git a/src/routes/frontend.ts b/src/routes/frontend.ts
index 9dea619..71984ec 100644
--- a/src/routes/frontend.ts
+++ b/src/routes/frontend.ts
@@ -11,210 +11,214 @@ const config = getConfig();
const router = Router();
router.get("/", (_: Request, res: Response) => {
- res.render("home", frontendConfig());
+ res.render("home", frontendConfig());
});
router.get("/new", (_: Request, res: Response) => {
- res.render("newevent", {
- title: "New event",
- ...frontendConfig(),
- });
+ res.render("newevent", {
+ title: "New event",
+ ...frontendConfig(),
+ });
});
router.get("/:eventID", async (req: Request, res: Response) => {
- try {
- const event = await Event.findOne({
- id: req.params.eventID,
- })
- .lean() // Required, see: https://stackoverflow.com/questions/59690923/handlebars-access-has-been-denied-to-resolve-the-property-from-because-it-is
- .populate("eventGroup");
- if (!event) {
- res.status(404);
- res.render("404", { url: req.url });
- return;
- }
- const parsedLocation = event.location.replace(/\s+/g, "+");
- let displayDate;
- if (moment.tz(event.end, event.timezone).isSame(event.start, "day")) {
- // Happening during one day
- displayDate =
- moment
- .tz(event.start, event.timezone)
- .format(
- 'dddd D MMMM YYYY [<span class="text-muted">from</span>] h:mm a'
- ) +
- moment
- .tz(event.end, event.timezone)
- .format(
- ' [<span class="text-muted">to</span>] h:mm a [<span class="text-muted">](z)[</span>]'
- );
- } else {
- displayDate =
- moment
- .tz(event.start, event.timezone)
- .format(
- 'dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a'
- ) +
- moment
- .tz(event.end, event.timezone)
- .format(
- ' [<span class="text-muted">–</span>] dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a [<span class="text-muted">](z)[</span>]'
- );
- }
- let eventStartISO = moment.tz(event.start, "Etc/UTC").toISOString();
- let eventEndISO = moment.tz(event.end, "Etc/UTC").toISOString();
- let parsedStart = moment
- .tz(event.start, event.timezone)
- .format("YYYYMMDD[T]HHmmss");
- let parsedEnd = moment
- .tz(event.end, event.timezone)
- .format("YYYYMMDD[T]HHmmss");
- let eventHasConcluded = false;
- if (
- moment.tz(event.end, event.timezone).isBefore(moment.tz(event.timezone))
- ) {
- eventHasConcluded = true;
- }
- let eventHasBegun = false;
- if (
- moment.tz(event.start, event.timezone).isBefore(moment.tz(event.timezone))
- ) {
- eventHasBegun = true;
- }
- let fromNow = moment.tz(event.start, event.timezone).fromNow();
- let parsedDescription = marked.parse(event.description);
- let eventEditToken = event.editToken;
+ try {
+ const event = await Event.findOne({
+ id: req.params.eventID,
+ })
+ .lean() // Required, see: https://stackoverflow.com/questions/59690923/handlebars-access-has-been-denied-to-resolve-the-property-from-because-it-is
+ .populate("eventGroup");
+ if (!event) {
+ res.status(404);
+ res.render("404", { url: req.url });
+ return;
+ }
+ const parsedLocation = event.location.replace(/\s+/g, "+");
+ let displayDate;
+ if (moment.tz(event.end, event.timezone).isSame(event.start, "day")) {
+ // Happening during one day
+ displayDate =
+ moment
+ .tz(event.start, event.timezone)
+ .format(
+ 'dddd D MMMM YYYY [<span class="text-muted">from</span>] h:mm a',
+ ) +
+ moment
+ .tz(event.end, event.timezone)
+ .format(
+ ' [<span class="text-muted">to</span>] h:mm a [<span class="text-muted">](z)[</span>]',
+ );
+ } else {
+ displayDate =
+ moment
+ .tz(event.start, event.timezone)
+ .format(
+ 'dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a',
+ ) +
+ moment
+ .tz(event.end, event.timezone)
+ .format(
+ ' [<span class="text-muted">–</span>] dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a [<span class="text-muted">](z)[</span>]',
+ );
+ }
+ let eventStartISO = moment.tz(event.start, "Etc/UTC").toISOString();
+ let eventEndISO = moment.tz(event.end, "Etc/UTC").toISOString();
+ let parsedStart = moment
+ .tz(event.start, event.timezone)
+ .format("YYYYMMDD[T]HHmmss");
+ let parsedEnd = moment
+ .tz(event.end, event.timezone)
+ .format("YYYYMMDD[T]HHmmss");
+ let eventHasConcluded = false;
+ if (
+ moment
+ .tz(event.end, event.timezone)
+ .isBefore(moment.tz(event.timezone))
+ ) {
+ eventHasConcluded = true;
+ }
+ let eventHasBegun = false;
+ if (
+ moment
+ .tz(event.start, event.timezone)
+ .isBefore(moment.tz(event.timezone))
+ ) {
+ eventHasBegun = true;
+ }
+ let fromNow = moment.tz(event.start, event.timezone).fromNow();
+ let parsedDescription = marked.parse(event.description);
+ let eventEditToken = event.editToken;
- let escapedName = event.name.replace(/\s+/g, "+");
+ let escapedName = event.name.replace(/\s+/g, "+");
- let eventHasCoverImage = false;
- if (event.image) {
- eventHasCoverImage = true;
- } else {
- eventHasCoverImage = false;
- }
- let eventHasHost = false;
- if (event.hostName) {
- eventHasHost = true;
- } else {
- eventHasHost = false;
- }
- let firstLoad = false;
- if (event.firstLoad === true) {
- firstLoad = true;
- await Event.findOneAndUpdate(
- { id: req.params.eventID },
- { firstLoad: false }
- );
- }
- let editingEnabled = false;
- if (Object.keys(req.query).length !== 0) {
- if (!req.query.e) {
- editingEnabled = false;
- console.log("No edit token set");
- } else {
- if (req.query.e === eventEditToken) {
- editingEnabled = true;
+ let eventHasCoverImage = false;
+ if (event.image) {
+ eventHasCoverImage = true;
} else {
- editingEnabled = false;
+ eventHasCoverImage = false;
}
- }
- }
- let eventAttendees = event.attendees
- ?.sort((a, b) => (a.name > b.name ? 1 : b.name > a.name ? -1 : 0))
- .map((el) => {
- if (!el.id) {
- el.id = el._id;
+ let eventHasHost = false;
+ if (event.hostName) {
+ eventHasHost = true;
+ } else {
+ eventHasHost = false;
}
- if (el.number && el.number > 1) {
- el.name = `${el.name} (${el.number} people)`;
+ let firstLoad = false;
+ if (event.firstLoad === true) {
+ firstLoad = true;
+ await Event.findOneAndUpdate(
+ { id: req.params.eventID },
+ { firstLoad: false },
+ );
}
- return el;
- })
- .filter((obj, pos, arr) => {
- return (
- obj.status === "attending" &&
- arr.map((mapObj) => mapObj.id).indexOf(obj.id) === pos
- );
- });
+ let editingEnabled = false;
+ if (Object.keys(req.query).length !== 0) {
+ if (!req.query.e) {
+ editingEnabled = false;
+ console.log("No edit token set");
+ } else {
+ if (req.query.e === eventEditToken) {
+ editingEnabled = true;
+ } else {
+ editingEnabled = false;
+ }
+ }
+ }
+ let eventAttendees = event.attendees
+ ?.sort((a, b) => (a.name > b.name ? 1 : b.name > a.name ? -1 : 0))
+ .map((el) => {
+ if (!el.id) {
+ el.id = el._id;
+ }
+ if (el.number && el.number > 1) {
+ el.name = `${el.name} (${el.number} people)`;
+ }
+ return el;
+ })
+ .filter((obj, pos, arr) => {
+ return (
+ obj.status === "attending" &&
+ arr.map((mapObj) => mapObj.id).indexOf(obj.id) === pos
+ );
+ });
- let spotsRemaining, noMoreSpots;
- let numberOfAttendees =
- eventAttendees?.reduce((acc, attendee) => {
- if (attendee.status === "attending") {
- return acc + (attendee.number || 1);
+ let spotsRemaining, noMoreSpots;
+ let numberOfAttendees =
+ eventAttendees?.reduce((acc, attendee) => {
+ if (attendee.status === "attending") {
+ return acc + (attendee.number || 1);
+ }
+ return acc;
+ }, 0) || 0;
+ if (event.maxAttendees) {
+ spotsRemaining = event.maxAttendees - numberOfAttendees;
+ if (spotsRemaining <= 0) {
+ noMoreSpots = true;
+ }
}
- return acc;
- }, 0) || 0;
- if (event.maxAttendees) {
- spotsRemaining = event.maxAttendees - numberOfAttendees;
- if (spotsRemaining <= 0) {
- noMoreSpots = true;
- }
- }
- let metadata = {
- title: event.name,
- description: marked
- .parse(event.description, { renderer: renderPlain() })
- .split(" ")
- .splice(0, 40)
- .join(" ")
- .trim(),
- image: eventHasCoverImage
- ? `https://${config.general.domain}/events/` + event.image
- : null,
- url: `https://${config.general.domain}/` + req.params.eventID,
- };
- if (
- req.headers.accept &&
- (req.headers.accept.includes("application/activity+json") ||
- req.headers.accept.includes("application/json") ||
- req.headers.accept.includes("application/json+ld"))
- ) {
- res
- .header("Content-Type", "application/activity+json")
- .send(JSON.parse(event.activityPubActor || "{}"));
- } else {
- res.set("X-Robots-Tag", "noindex");
- res.render("event", {
- ...frontendConfig(),
- title: event.name,
- escapedName: escapedName,
- eventData: event,
- eventAttendees: eventAttendees,
- numberOfAttendees,
- spotsRemaining: spotsRemaining,
- noMoreSpots: noMoreSpots,
- eventStartISO: eventStartISO,
- eventEndISO: eventEndISO,
- parsedLocation: parsedLocation,
- parsedStart: parsedStart,
- parsedEnd: parsedEnd,
- displayDate: displayDate,
- fromNow: fromNow,
- timezone: event.timezone,
- parsedDescription: parsedDescription,
- editingEnabled: editingEnabled,
- eventHasCoverImage: eventHasCoverImage,
- eventHasHost: eventHasHost,
- firstLoad: firstLoad,
- eventHasConcluded: eventHasConcluded,
- eventHasBegun: eventHasBegun,
- metadata: metadata,
- });
+ let metadata = {
+ title: event.name,
+ description: marked
+ .parse(event.description, { renderer: renderPlain() })
+ .split(" ")
+ .splice(0, 40)
+ .join(" ")
+ .trim(),
+ image: eventHasCoverImage
+ ? `https://${config.general.domain}/events/` + event.image
+ : null,
+ url: `https://${config.general.domain}/` + req.params.eventID,
+ };
+ if (
+ req.headers.accept &&
+ (req.headers.accept.includes("application/activity+json") ||
+ req.headers.accept.includes("application/json") ||
+ req.headers.accept.includes("application/json+ld"))
+ ) {
+ res.header("Content-Type", "application/activity+json").send(
+ JSON.parse(event.activityPubActor || "{}"),
+ );
+ } else {
+ res.set("X-Robots-Tag", "noindex");
+ res.render("event", {
+ ...frontendConfig(),
+ title: event.name,
+ escapedName: escapedName,
+ eventData: event,
+ eventAttendees: eventAttendees,
+ numberOfAttendees,
+ spotsRemaining: spotsRemaining,
+ noMoreSpots: noMoreSpots,
+ eventStartISO: eventStartISO,
+ eventEndISO: eventEndISO,
+ parsedLocation: parsedLocation,
+ parsedStart: parsedStart,
+ parsedEnd: parsedEnd,
+ displayDate: displayDate,
+ fromNow: fromNow,
+ timezone: event.timezone,
+ parsedDescription: parsedDescription,
+ editingEnabled: editingEnabled,
+ eventHasCoverImage: eventHasCoverImage,
+ eventHasHost: eventHasHost,
+ firstLoad: firstLoad,
+ eventHasConcluded: eventHasConcluded,
+ eventHasBegun: eventHasBegun,
+ metadata: metadata,
+ });
+ }
+ } catch (err) {
+ addToLog(
+ "displayEvent",
+ "error",
+ "Attempt to display event " +
+ req.params.eventID +
+ " failed with error: " +
+ err,
+ );
+ console.log(err);
+ res.status(404).render("404", { url: req.url });
}
- } catch (err) {
- addToLog(
- "displayEvent",
- "error",
- "Attempt to display event " +
- req.params.eventID +
- " failed with error: " +
- err
- );
- console.log(err);
- res.status(404).render("404", { url: req.url });
- }
});
export default router;