summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/routes.js115
-rw-r--r--src/routes/event.ts126
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;