diff options
| author | Raphael Kabo <raphaelkabo@hey.com> | 2024-02-25 21:34:33 +0000 | 
|---|---|---|
| committer | Raphael Kabo <raphaelkabo@hey.com> | 2024-02-26 00:11:03 +0000 | 
| commit | b3c9cba6478dc16d135313aa6d0adcc02d67ece6 (patch) | |
| tree | 508ef236dc805b950fedeeca7f8dd3559d66a162 /src/routes | |
| parent | afd9fc4477fff90e5db917f350d99c3d01fba2bd (diff) | |
feat: optional public events/groups
Diffstat (limited to 'src/routes')
| -rw-r--r-- | src/routes/event.ts | 2 | ||||
| -rw-r--r-- | src/routes/frontend.ts | 71 | ||||
| -rw-r--r-- | src/routes/group.ts | 2 | 
3 files changed, 73 insertions, 2 deletions
diff --git a/src/routes/event.ts b/src/routes/event.ts index fb9d8c7..6be5ff8 100644 --- a/src/routes/event.ts +++ b/src/routes/event.ts @@ -140,6 +140,7 @@ router.post(              viewPassword: "", // Backwards compatibility              editPassword: "", // Backwards compatibility              editToken: editToken, +            showOnPublicList: eventData?.publicBoolean,              eventGroup: isPartOfEventGroup ? eventGroup?._id : null,              usersCanAttend: eventData.joinBoolean ? true : false,              showUsersList: false, // Backwards compatibility @@ -371,6 +372,7 @@ router.put(                  url: eventData.eventURL,                  hostName: eventData.hostName,                  image: eventImageFilename, +                showOnPublicList: eventData.publicBoolean,                  usersCanAttend: eventData.joinBoolean,                  showUsersList: false, // Backwards compatibility                  usersCanComment: eventData.interactionBoolean, diff --git a/src/routes/frontend.ts b/src/routes/frontend.ts index 0d8793a..4cdce8a 100644 --- a/src/routes/frontend.ts +++ b/src/routes/frontend.ts @@ -2,7 +2,7 @@ import { Router, Request, Response } from "express";  import moment from "moment-timezone";  import { marked } from "marked";  import { markdownToSanitizedHTML, renderPlain } from "../util/markdown.js"; -import getConfig, { frontendConfig } from "../lib/config.js"; +import getConfig, { frontendConfig, instanceRules } from "../lib/config.js";  import { addToLog, exportICal } from "../helpers.js";  import Event from "../models/Event.js";  import EventGroup, { IEventGroup } from "../models/EventGroup.js"; @@ -16,7 +16,20 @@ const config = getConfig();  const router = Router();  router.get("/", (_: Request, res: Response) => { -    res.render("home", frontendConfig()); +    if (config.general.show_public_event_list) { +        return res.redirect("/events"); +    } +    return res.render("home", { +        ...frontendConfig(), +        instanceRules: instanceRules(), +    }); +}); + +router.get("/about", (_: Request, res: Response) => { +    return res.render("home", { +        ...frontendConfig(), +        instanceRules: instanceRules(), +    });  });  router.get("/new", (_: Request, res: Response) => { @@ -57,6 +70,51 @@ router.get("/new/:magicLinkToken", async (req: Request, res: Response) => {      });  }); +router.get("/events", async (_: Request, res: Response) => { +    if (!config.general.show_public_event_list) { +        return res.status(404).render("404", frontendConfig()); +    } +    const events = await Event.find({ showOnPublicList: true }) +        .populate("eventGroup") +        .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, +            location: event.location, +            displayDate: isSameDay +                ? startMoment.format("D MMM YYYY") +                : `${startMoment.format("D MMM YYYY")} - ${endMoment.format( +                      "D MMM YYYY", +                  )}`, +            eventHasConcluded: endMoment.isBefore(moment.tz(event.timezone)), +            eventGroup: event.eventGroup, +        }; +    }); +    const upcomingEvents = updatedEvents.filter( +        (event) => event.eventHasConcluded === false, +    ); +    const pastEvents = updatedEvents.filter( +        (event) => event.eventHasConcluded === true, +    ); +    const eventGroups = await EventGroup.find({ +        showOnPublicList: true, +    }).lean(); + +    res.render("publicEventList", { +        title: "Public events", +        upcomingEvents: upcomingEvents, +        pastEvents: pastEvents, +        eventGroups: eventGroups, +        ...frontendConfig(), +    }); +}); +  router.get("/:eventID", async (req: Request, res: Response) => {      try {          const event = await Event.findOne({ @@ -266,6 +324,11 @@ router.get("/:eventID", async (req: Request, res: Response) => {                  firstLoad: firstLoad,                  eventHasConcluded: eventHasConcluded,                  eventHasBegun: eventHasBegun, +                eventWillBeDeleted: config.general.delete_after_days > 0, +                daysUntilDeletion: moment +                    .tz(event.end, event.timezone) +                    .add(config.general.delete_after_days, "days") +                    .fromNow(),                  metadata: metadata,                  jsonData: {                      name: event.name, @@ -276,6 +339,7 @@ router.get("/:eventID", async (req: Request, res: Response) => {                      url: event.url,                      hostName: event.hostName,                      creatorEmail: event.creatorEmail, +                    showOnPublicList: event.showOnPublicList,                      eventGroupID: event.eventGroup                          ? (event.eventGroup as unknown as IEventGroup).id                          : null, @@ -337,6 +401,7 @@ router.get("/group/:eventGroupID", async (req: Request, res: Response) => {              return {                  id: event.id,                  name: event.name, +                location: event.location,                  displayDate: isSameDay                      ? startMoment.format("D MMM YYYY")                      : `${startMoment.format("D MMM YYYY")} - ${endMoment.format( @@ -388,6 +453,7 @@ router.get("/group/:eventGroupID", async (req: Request, res: Response) => {          res.set("X-Robots-Tag", "noindex");          res.render("eventgroup", { +            ...frontendConfig(),              domain: config.general.domain,              title: eventGroup.name,              eventGroupData: eventGroup, @@ -409,6 +475,7 @@ router.get("/group/:eventGroupID", async (req: Request, res: Response) => {                  creatorEmail: eventGroup.creatorEmail,                  image: eventGroup.image,                  editToken: editingEnabled ? eventGroupEditToken : null, +                showOnPublicList: eventGroup.showOnPublicList,              },          });      } catch (err) { diff --git a/src/routes/group.ts b/src/routes/group.ts index 34377b0..c006a5d 100644 --- a/src/routes/group.ts +++ b/src/routes/group.ts @@ -81,6 +81,7 @@ router.post(                  hostName: groupData.hostName,                  editToken: editToken,                  firstLoad: true, +                showOnPublicList: groupData.publicBoolean,              });              await eventGroup.save(); @@ -206,6 +207,7 @@ router.put(                  url: req.body.eventGroupURL,                  hostName: req.body.hostName,                  image: eventGroupImageFilename, +                showOnPublicList: groupData.publicBoolean,              };              await EventGroup.findOneAndUpdate(  | 
