summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRaphael Kabo <raphaelkabo@hey.com>2023-10-07 18:48:08 +0100
committerRaphael Kabo <raphaelkabo@hey.com>2023-10-07 18:48:08 +0100
commitb8e424a8602b586bbf346cd27171ede570a54973 (patch)
tree84851929950e5574c4293bd19296a75d08b012a0 /src
parentd584ed85660a91433fffd5e2b0bfa9114114ea37 (diff)
refactor: frontend event group routes
Diffstat (limited to 'src')
-rw-r--r--src/helpers.ts2
-rwxr-xr-xsrc/routes.js239
-rw-r--r--src/routes/frontend.ts183
3 files changed, 183 insertions, 241 deletions
diff --git a/src/helpers.ts b/src/helpers.ts
index 72bbd17..6eda3d0 100644
--- a/src/helpers.ts
+++ b/src/helpers.ts
@@ -21,7 +21,7 @@ export function addToLog(process: string, status: string, message: string) {
});
}
-export function exportIcal(events: IEvent[], calendarName: string) {
+export function exportICal(events: IEvent[], calendarName: string) {
if (!events || events.length < 1) return;
// Create a new icalGenerator... generator
diff --git a/src/routes.js b/src/routes.js
index 94b7477..e4ef3cb 100755
--- a/src/routes.js
+++ b/src/routes.js
@@ -3,9 +3,8 @@ import express from "express";
import { customAlphabet } from "nanoid";
import randomstring from "randomstring";
import { getConfig } from "./lib/config.js";
-import { addToLog, exportIcal } from "./helpers.js";
+import { addToLog } from "./helpers.js";
import moment from "moment-timezone";
-import { marked } from "marked";
import crypto from "crypto";
import request from "request";
import niceware from "niceware";
@@ -23,7 +22,6 @@ import {
import Event from "./models/Event.js";
import EventGroup from "./models/EventGroup.js";
import path from "path";
-import { renderPlain } from "./util/markdown.js";
const config = getConfig();
const domain = config.general.domain;
@@ -184,241 +182,6 @@ schedule.scheduleJob("59 23 * * *", function (fireDate) {
// old (they're not going to become active)
});
-router.get("/group/:eventGroupID", (req, res) => {
- EventGroup.findOne({
- id: req.params.eventGroupID,
- })
- .lean() // Required, see: https://stackoverflow.com/questions/59690923/handlebars-access-has-been-denied-to-resolve-the-property-from-because-it-is
- .then(async (eventGroup) => {
- if (eventGroup) {
- let parsedDescription = marked.parse(eventGroup.description);
- let eventGroupEditToken = eventGroup.editToken;
-
- let escapedName = eventGroup.name.replace(/\s+/g, "+");
-
- let eventGroupHasCoverImage = false;
- if (eventGroup.image) {
- eventGroupHasCoverImage = true;
- } else {
- eventGroupHasCoverImage = false;
- }
- let eventGroupHasHost = false;
- if (eventGroup.hostName) {
- eventGroupHasHost = true;
- } else {
- eventGroupHasHost = false;
- }
-
- let events = await Event.find({ eventGroup: eventGroup._id })
- .lean()
- .sort("start");
-
- events.map((event) => {
- if (
- moment
- .tz(event.end, event.timezone)
- .isSame(event.start, "day")
- ) {
- // Happening during one day
- event.displayDate = moment
- .tz(event.start, event.timezone)
- .format("D MMM YYYY");
- } else {
- event.displayDate =
- moment
- .tz(event.start, event.timezone)
- .format("D MMM YYYY") +
- moment
- .tz(event.end, event.timezone)
- .format(" - D MMM YYYY");
- }
- if (
- moment
- .tz(event.end, event.timezone)
- .isBefore(moment.tz(event.timezone))
- ) {
- event.eventHasConcluded = true;
- } else {
- event.eventHasConcluded = false;
- }
- return (({ id, name, displayDate, eventHasConcluded }) => ({
- id,
- name,
- displayDate,
- eventHasConcluded,
- }))(event);
- });
-
- let upcomingEventsExist = false;
- if (events.some((e) => e.eventHasConcluded === false)) {
- upcomingEventsExist = true;
- }
-
- let firstLoad = false;
- if (eventGroup.firstLoad === true) {
- firstLoad = true;
- EventGroup.findOneAndUpdate(
- { id: req.params.eventGroupID },
- { firstLoad: false },
- function (err, raw) {
- if (err) {
- res.send(err);
- }
- },
- );
- }
- 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 === eventGroupEditToken) {
- editingEnabled = true;
- } else {
- editingEnabled = false;
- }
- }
- }
- let metadata = {
- title: eventGroup.name,
- description: marked
- .parse(eventGroup.description, {
- renderer: renderPlain(),
- })
- .split(" ")
- .splice(0, 40)
- .join(" ")
- .trim(),
- image: eventGroupHasCoverImage
- ? `https://${domain}/events/` + eventGroup.image
- : null,
- url: `https://${domain}/` + req.params.eventID,
- };
- res.set("X-Robots-Tag", "noindex");
- res.render("eventgroup", {
- domain: domain,
- title: eventGroup.name,
- eventGroupData: eventGroup,
- escapedName: escapedName,
- events: events,
- upcomingEventsExist: upcomingEventsExist,
- parsedDescription: parsedDescription,
- editingEnabled: editingEnabled,
- eventGroupHasCoverImage: eventGroupHasCoverImage,
- eventGroupHasHost: eventGroupHasHost,
- firstLoad: firstLoad,
- metadata: metadata,
- });
- } else {
- res.status(404);
- res.render("404", { url: req.url });
- }
- })
- .catch((err) => {
- addToLog(
- "displayEventGroup",
- "error",
- "Attempt to display event group " +
- req.params.eventGroupID +
- " failed with error: " +
- err,
- );
- console.log(err);
- res.status(404);
- res.render("404", { url: req.url });
- return;
- });
-});
-
-router.get("/group/:eventGroupID/feed.ics", (req, res) => {
- EventGroup.findOne({
- id: req.params.eventGroupID,
- })
- .lean() // Required, see: https://stackoverflow.com/questions/59690923/handlebars-access-has-been-denied-to-resolve-the-property-from-because-it-is
- .then(async (eventGroup) => {
- if (eventGroup) {
- let events = await Event.find({ eventGroup: eventGroup._id })
- .lean()
- .sort("start");
- const string = exportIcal(events, eventGroup.name);
- res.set("Content-Type", "text/calendar");
- return res.send(string);
- }
- })
- .catch((err) => {
- addToLog(
- "eventGroupFeed",
- "error",
- "Attempt to display event group feed for " +
- req.params.eventGroupID +
- " failed with error: " +
- err,
- );
- console.log(err);
- res.status(404);
- res.render("404", { url: req.url });
- return;
- });
-});
-
-router.get("/exportevent/:eventID", (req, res) => {
- Event.findOne({
- id: req.params.eventID,
- })
- .populate("eventGroup")
- .then((event) => {
- if (event) {
- const string = exportIcal([event]);
- res.send(string);
- }
- })
- .catch((err) => {
- addToLog(
- "exportEvent",
- "error",
- "Attempt to export event " +
- req.params.eventID +
- " failed with error: " +
- err,
- );
- console.log(err);
- res.status(404);
- res.render("404", { url: req.url });
- return;
- });
-});
-
-router.get("/exportgroup/:eventGroupID", (req, res) => {
- EventGroup.findOne({
- id: req.params.eventGroupID,
- })
- .lean() // Required, see: https://stackoverflow.com/questions/59690923/handlebars-access-has-been-denied-to-resolve-the-property-from-because-it-is
- .then(async (eventGroup) => {
- if (eventGroup) {
- let events = await Event.find({ eventGroup: eventGroup._id })
- .lean()
- .sort("start");
- const string = exportIcal(events);
- res.send(string);
- }
- })
- .catch((err) => {
- addToLog(
- "exportEvent",
- "error",
- "Attempt to export event group " +
- req.params.eventGroupID +
- " failed with error: " +
- err,
- );
- console.log(err);
- res.status(404);
- res.render("404", { url: req.url });
- return;
- });
-});
-
// BACKEND ROUTES
router.post("/importevent", (req, res) => {
let eventID = nanoid();
diff --git a/src/routes/frontend.ts b/src/routes/frontend.ts
index d24210f..56ce4db 100644
--- a/src/routes/frontend.ts
+++ b/src/routes/frontend.ts
@@ -1,11 +1,12 @@
import { Router, Request, Response } from "express";
-import Event from "../models/Event.js";
import moment from "moment-timezone";
import { marked } from "marked";
import { frontendConfig } from "../util/config.js";
import { renderPlain } from "../util/markdown.js";
import getConfig from "../lib/config.js";
-import { addToLog } from "../helpers.js";
+import { addToLog, exportICal } from "../helpers.js";
+import Event from "../models/Event.js";
+import EventGroup from "../models/EventGroup.js";
const config = getConfig();
@@ -230,4 +231,182 @@ router.get("/:eventID", async (req: Request, res: Response) => {
}
});
+router.get("/group/:eventGroupID", async (req: Request, res: Response) => {
+ try {
+ const eventGroup = await EventGroup.findOne({
+ id: req.params.eventGroupID,
+ }).lean();
+
+ if (!eventGroup) {
+ return res.status(404).render("404", { url: req.url });
+ }
+ const parsedDescription = marked.parse(eventGroup.description);
+ const eventGroupEditToken = eventGroup.editToken;
+ const escapedName = eventGroup.name.replace(/\s+/g, "+");
+ const eventGroupHasCoverImage = !!eventGroup.image;
+ const eventGroupHasHost = !!eventGroup.hostName;
+
+ const events = await Event.find({ eventGroup: eventGroup._id })
+ .lean()
+ .sort("start");
+
+ const updatedEvents = events.map((event) => {
+ const startMoment = moment.tz(event.start, event.timezone);
+ const endMoment = moment.tz(event.end, event.timezone);
+ const isSameDay = startMoment.isSame(endMoment, "day");
+
+ return {
+ id: event.id,
+ name: event.name,
+ displayDate: isSameDay
+ ? startMoment.format("D MMM YYYY")
+ : `${startMoment.format("D MMM YYYY")} - ${endMoment.format(
+ "D MMM YYYY",
+ )}`,
+ eventHasConcluded: endMoment.isBefore(
+ moment.tz(event.timezone),
+ ),
+ };
+ });
+
+ const upcomingEventsExist = updatedEvents.some(
+ (e) => !e.eventHasConcluded,
+ );
+
+ let firstLoad = false;
+ if (eventGroup.firstLoad === true) {
+ firstLoad = true;
+ await EventGroup.findOneAndUpdate(
+ { id: req.params.eventGroupID },
+ { firstLoad: false },
+ );
+ }
+
+ let editingEnabled = false;
+ if (Object.keys(req.query).length !== 0) {
+ if (!req.query.e) {
+ editingEnabled = false;
+ } else {
+ editingEnabled = req.query.e === eventGroupEditToken;
+ }
+ }
+
+ const metadata = {
+ title: eventGroup.name,
+ description: marked
+ .parse(eventGroup.description, {
+ renderer: renderPlain(),
+ })
+ .split(" ")
+ .splice(0, 40)
+ .join(" ")
+ .trim(),
+ image: eventGroupHasCoverImage
+ ? `https://${config.general.domain}/events/` + eventGroup.image
+ : null,
+ url: `https://${config.general.domain}/` + req.params.eventID,
+ };
+
+ res.set("X-Robots-Tag", "noindex");
+ res.render("eventgroup", {
+ domain: config.general.domain,
+ title: eventGroup.name,
+ eventGroupData: eventGroup,
+ escapedName: escapedName,
+ events: updatedEvents,
+ upcomingEventsExist: upcomingEventsExist,
+ parsedDescription: parsedDescription,
+ editingEnabled: editingEnabled,
+ eventGroupHasCoverImage: eventGroupHasCoverImage,
+ eventGroupHasHost: eventGroupHasHost,
+ firstLoad: firstLoad,
+ metadata: metadata,
+ });
+ } catch (err) {
+ addToLog(
+ "displayEventGroup",
+ "error",
+ `Attempt to display event group ${req.params.eventGroupID} failed with error: ${err}`,
+ );
+ console.log(err);
+ return res.status(404).render("404", { url: req.url });
+ }
+});
+
+router.get(
+ "/group/:eventGroupID/feed.ics",
+ async (req: Request, res: Response) => {
+ try {
+ const eventGroup = await EventGroup.findOne({
+ id: req.params.eventGroupID,
+ }).lean();
+
+ if (eventGroup) {
+ const events = await Event.find({
+ eventGroup: eventGroup._id,
+ }).sort("start");
+ const string = exportICal(events, eventGroup.name);
+ res.set("Content-Type", "text/calendar");
+ res.send(string);
+ }
+ } catch (err) {
+ addToLog(
+ "eventGroupFeed",
+ "error",
+ `Attempt to display event group feed for ${req.params.eventGroupID} failed with error: ${err}`,
+ );
+ console.log(err);
+ res.status(404).render("404", { url: req.url });
+ }
+ },
+);
+
+router.get("/export/event/:eventID", async (req: Request, res: Response) => {
+ try {
+ const event = await Event.findOne({
+ id: req.params.eventID,
+ }).populate("eventGroup");
+
+ if (event) {
+ const string = exportICal([event], event.name);
+ res.send(string);
+ }
+ } catch (err) {
+ addToLog(
+ "exportEvent",
+ "error",
+ `Attempt to export event ${req.params.eventID} failed with error: ${err}`,
+ );
+ console.log(err);
+ res.status(404).render("404", { url: req.url });
+ }
+});
+
+router.get(
+ "/export/group/:eventGroupID",
+ async (req: Request, res: Response) => {
+ try {
+ const eventGroup = await EventGroup.findOne({
+ id: req.params.eventGroupID,
+ }).lean();
+
+ if (eventGroup) {
+ const events = await Event.find({
+ eventGroup: eventGroup._id,
+ }).sort("start");
+ const string = exportICal(events, eventGroup.name);
+ res.send(string);
+ }
+ } catch (err) {
+ addToLog(
+ "exportEvent",
+ "error",
+ `Attempt to export event group ${req.params.eventGroupID} failed with error: ${err}`,
+ );
+ console.log(err);
+ res.status(404).render("404", { url: req.url });
+ }
+ },
+);
+
export default router;