diff options
| author | Raphael Kabo <raphaelkabo@hey.com> | 2023-10-08 12:37:48 +0100 | 
|---|---|---|
| committer | Raphael Kabo <raphaelkabo@hey.com> | 2023-10-08 12:37:48 +0100 | 
| commit | 6ab556eb9adc0f02a279b8f89bc9309734525522 (patch) | |
| tree | 568f95dfb8ec3fbb293fef0597dccd751c348f2d /src | |
| parent | 6b220e094f215c488eb5102e25506f5b3d371245 (diff) | |
Refactor: import event form
Diffstat (limited to 'src')
| -rwxr-xr-x | src/routes.js | 115 | ||||
| -rw-r--r-- | src/routes/event.ts | 126 | 
2 files changed, 126 insertions, 115 deletions
diff --git a/src/routes.js b/src/routes.js index 96420c7..65a2934 100755 --- a/src/routes.js +++ b/src/routes.js @@ -183,121 +183,6 @@ schedule.scheduleJob("59 23 * * *", function (fireDate) {  });  // BACKEND ROUTES -router.post("/importevent", (req, res) => { -    let eventID = nanoid(); -    let editToken = randomstring.generate(); -    if (req.files && Object.keys(req.files).length !== 0) { -        let iCalObject = ical.parseICS( -            req.files.icsImportControl.data.toString("utf8"), -        ); -        let importedEventData = iCalObject[Object.keys(iCalObject)]; - -        let creatorEmail; -        if (req.body.creatorEmail) { -            creatorEmail = req.body.creatorEmail; -        } else if (importedEventData.organizer) { -            creatorEmail = importedEventData.organizer.val.replace( -                "MAILTO:", -                "", -            ); -        } - -        const event = new Event({ -            id: eventID, -            type: "public", -            name: importedEventData.summary, -            location: importedEventData.location, -            start: importedEventData.start, -            end: importedEventData.end, -            timezone: -                typeof importedEventData.start.tz !== "undefined" -                    ? importedEventData.start.tz -                    : "Etc/UTC", -            description: importedEventData.description, -            image: "", -            creatorEmail: creatorEmail, -            url: "", -            hostName: importedEventData.organizer -                ? importedEventData.organizer.params.CN.replace(/["]+/g, "") -                : "", -            viewPassword: "", -            editPassword: "", -            editToken: editToken, -            usersCanAttend: false, -            showUsersList: false, -            usersCanComment: false, -            firstLoad: true, -        }); -        event -            .save() -            .then(() => { -                addToLog( -                    "createEvent", -                    "success", -                    "Event " + eventID + " created", -                ); -                // Send email with edit link -                if (creatorEmail && sendEmails) { -                    req.app.get("hbsInstance").renderView( -                        "./views/emails/createevent.handlebars", -                        { -                            eventID, -                            editToken, -                            siteName, -                            siteLogo, -                            domain, -                            cache: true, -                            layout: "email.handlebars", -                        }, -                        function (err, html) { -                            const msg = { -                                to: req.body.creatorEmail, -                                from: { -                                    name: siteName, -                                    email: contactEmail, -                                    address: contactEmail, -                                }, -                                subject: `${siteName}: ${importedEventData.summary}`, -                                html, -                            }; -                            switch (mailService) { -                                case "sendgrid": -                                    sgMail.send(msg).catch((e) => { -                                        console.error(e.toString()); -                                        res.status(500).end(); -                                    }); -                                    break; -                                case "nodemailer": -                                    nodemailerTransporter -                                        .sendMail(msg) -                                        .catch((e) => { -                                            console.error(e.toString()); -                                            res.status(500).end(); -                                        }); -                                    break; -                            } -                        }, -                    ); -                } -                res.writeHead(302, { -                    Location: "/" + eventID + "?e=" + editToken, -                }); -                res.end(); -            }) -            .catch((err) => { -                res.send("Database error, please try again :("); -                addToLog( -                    "createEvent", -                    "error", -                    "Attempt to create event failed with error: " + err, -                ); -            }); -    } else { -        console.log("Files array is empty!"); -        res.status(500).end(); -    } -}); -  router.post("/verifytoken/event/:eventID", (req, res) => {      Event.findOne({          id: req.params.eventID, diff --git a/src/routes/event.ts b/src/routes/event.ts index be27fd4..2245009 100644 --- a/src/routes/event.ts +++ b/src/routes/event.ts @@ -25,6 +25,7 @@ import {  import getConfig from "../lib/config.js";  import { sendEmailFromTemplate } from "../lib/email.js";  import crypto from "crypto"; +import ical from "ical";  const config = getConfig(); @@ -42,6 +43,17 @@ const upload = multer({          cb(null, true);      },  }); +const icsUpload = multer({ +    storage: storage, +    limits: { fileSize: 10 * 1024 * 1024 }, +    fileFilter: function (_, file, cb) { +        const filetype = "text/calendar"; +        if (file.mimetype !== filetype) { +            return cb(new Error("Only ICS files are allowed.")); +        } +        cb(null, true); +    }, +});  const router = Router(); @@ -84,6 +96,7 @@ router.post(                      );                  });          } +          const startUTC = moment.tz(eventData.eventStart, eventData.timezone);          const endUTC = moment.tz(eventData.eventEnd, eventData.timezone);          let eventGroup; @@ -511,4 +524,117 @@ router.put(      },  ); +router.post( +    "/import/event", +    icsUpload.single("icsImportControl"), +    async (req: Request, res: Response) => { +        if (!req.file) { +            return res.status(400).json({ +                errors: [ +                    { +                        message: "No file was provided.", +                    }, +                ], +            }); +        } + +        let eventID = generateEventID(); +        let editToken = generateEditToken(); + +        let iCalObject = ical.parseICS(req.file.buffer.toString("utf8")); + +        let importedEventData = iCalObject[Object.keys(iCalObject)[0]]; + +        let creatorEmail: string | undefined; +        if (req.body.creatorEmail) { +            creatorEmail = req.body.creatorEmail; +        } else if (importedEventData.organizer) { +            if (typeof importedEventData.organizer === "string") { +                creatorEmail = importedEventData.organizer.replace( +                    "MAILTO:", +                    "", +                ); +            } else { +                creatorEmail = importedEventData.organizer.val.replace( +                    "MAILTO:", +                    "", +                ); +            } +        } + +        let hostName: string | undefined; +        if (importedEventData.organizer) { +            if (typeof importedEventData.organizer === "string") { +                hostName = importedEventData.organizer.replace(/["]+/g, ""); +            } else { +                hostName = importedEventData.organizer.params.CN.replace( +                    /["]+/g, +                    "", +                ); +            } +        } + +        const event = new Event({ +            id: eventID, +            type: "public", +            name: importedEventData.summary, +            location: importedEventData.location, +            start: importedEventData.start, +            end: importedEventData.end, +            timezone: "Etc/UTC", // TODO: get timezone from ics file +            description: importedEventData.description, +            image: "", +            creatorEmail, +            url: "", +            hostName, +            viewPassword: "", +            editPassword: "", +            editToken: editToken, +            usersCanAttend: false, +            showUsersList: false, +            usersCanComment: false, +            firstLoad: true, +        }); +        try { +            await event.save(); +            addToLog("createEvent", "success", `Event ${eventID} created`); +            // Send email with edit link +            if (creatorEmail && req.app.locals.sendEmails) { +                sendEmailFromTemplate( +                    creatorEmail, +                    `${importedEventData.summary}`, +                    "createEvent", +                    { +                        eventID, +                        editToken, +                        siteName: config.general.site_name, +                        siteLogo: config.general.email_logo_url, +                        domain: config.general.domain, +                    }, +                    req, +                ); +            } +            return res.json({ +                eventID: eventID, +                editToken: editToken, +                url: `/${eventID}?e=${editToken}`, +            }); +        } catch (err) { +            console.error(err); +            addToLog( +                "createEvent", +                "error", +                "Attempt to create event failed with error: " + err, +            ); +            return res.status(500).json({ +                errors: [ +                    { +                        message: err, +                    }, +                ], +            }); +        } +    }, +); +  export default router;  | 
