diff options
| author | Raphael Kabo <raphaelkabo@hey.com> | 2023-10-07 18:48:08 +0100 | 
|---|---|---|
| committer | Raphael Kabo <raphaelkabo@hey.com> | 2023-10-07 18:48:08 +0100 | 
| commit | b8e424a8602b586bbf346cd27171ede570a54973 (patch) | |
| tree | 84851929950e5574c4293bd19296a75d08b012a0 /src | |
| parent | d584ed85660a91433fffd5e2b0bfa9114114ea37 (diff) | |
refactor: frontend event group routes
Diffstat (limited to 'src')
| -rw-r--r-- | src/helpers.ts | 2 | ||||
| -rwxr-xr-x | src/routes.js | 239 | ||||
| -rw-r--r-- | src/routes/frontend.ts | 183 | 
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;  | 
