diff options
author | Darius Kazemi <darius.kazemi@gmail.com> | 2020-01-24 16:16:27 -0800 |
---|---|---|
committer | Darius Kazemi <darius.kazemi@gmail.com> | 2020-01-24 16:16:27 -0800 |
commit | a390b02416777b045f03a286bfbb02ac369571e6 (patch) | |
tree | 8e690cf7a80635685b258eb6a4b2a1ca3f79ab36 /routes.js | |
parent | 111406040ec9f7f48b28077c8eea95a792b14cc7 (diff) |
Converting all tabs to two-spaces
Diffstat (limited to 'routes.js')
-rwxr-xr-x | routes.js | 1764 |
1 files changed, 882 insertions, 882 deletions
@@ -70,17 +70,17 @@ function render_plain () { render.image = function (href, title, text) { return ''; }; - render.br = function () { + render.br = function () { return ''; - }; + }; return render; } const ical = require('ical'); const icalGenerator = require('ical-generator'); const cal = icalGenerator({ - domain: domain, - name: siteName + domain: domain, + name: siteName }); const sgMail = require('@sendgrid/mail'); @@ -89,8 +89,8 @@ const apiCredentials = require('./config/api.js'); let sendEmails = false; if (apiCredentials.sendgrid) { // Only set up Sendgrid if an API key is set - sgMail.setApiKey(apiCredentials.sendgrid); - sendEmails = true; + sgMail.setApiKey(apiCredentials.sendgrid); + sendEmails = true; } const fileUpload = require('express-fileupload'); @@ -103,20 +103,20 @@ router.use(fileUpload()); const schedule = require('node-schedule'); const deleteOldEvents = schedule.scheduleJob('59 23 * * *', function(fireDate){ - const too_old = moment.tz('Etc/UTC').subtract(7, 'days').toDate(); - console.log("Old event deletion running! Deleting all events concluding before ", too_old); - - Event.find({ end: { $lte: too_old } }).then((oldEvents) => { - oldEvents.forEach(event => { - if (event.image){ - fs.unlink(global.appRoot + '/public/events/' + event.image, (err) => { - if (err) { - addToLog("deleteOldEvents", "error", "Attempt to delete event image for old event "+event.id+" failed with error: " + err); - } - // Image removed - addToLog("deleteOldEvents", "error", "Image deleted for old event "+event.id); - }) - } + const too_old = moment.tz('Etc/UTC').subtract(7, 'days').toDate(); + console.log("Old event deletion running! Deleting all events concluding before ", too_old); + + Event.find({ end: { $lte: too_old } }).then((oldEvents) => { + oldEvents.forEach(event => { + if (event.image){ + fs.unlink(global.appRoot + '/public/events/' + event.image, (err) => { + if (err) { + addToLog("deleteOldEvents", "error", "Attempt to delete event image for old event "+event.id+" failed with error: " + err); + } + // Image removed + addToLog("deleteOldEvents", "error", "Image deleted for old event "+event.id); + }) + } // broadcast a Delete profile message to all followers so that at least Mastodon servers will delete their local profile information const guidUpdateObject = crypto.randomBytes(16).toString('hex'); const jsonUpdateObject = JSON.parse(event.activityPubActor); @@ -132,10 +132,10 @@ const deleteOldEvents = schedule.scheduleJob('59 23 * * *', function(fireDate){ }); }); }); - }) - }).catch((err) => { - addToLog("deleteOldEvents", "error", "Attempt to delete old event "+event.id+" failed with error: " + err); - }); + }) + }).catch((err) => { + addToLog("deleteOldEvents", "error", "Attempt to delete old event "+event.id+" failed with error: " + err); + }); }); // FRONTEND ROUTES @@ -149,57 +149,57 @@ router.get('/', (req, res) => { }); router.get('/new', (req, res) => { - res.render('home'); + res.render('home'); }); //router.get('/login', (req, res) => { -// res.render('admin'); +// res.render('admin'); //}) //router.get('/login', (req, res) => { -// res.render('login'); +// res.render('login'); //}); // //router.get('/register', (req, res) => { -// res.render('register'); +// res.render('register'); //}); router.get('/new/event', (req, res) => { - res.render('newevent', { + res.render('newevent', { domain: domain, email: contactEmail, siteName: siteName, }); }); router.get('/new/event/public', (req, res) => { - let isPrivate = false; - let isPublic = true; - let isOrganisation = false; - let isUnknownType = false; -// let eventType = req.params.eventType; -// if (eventType == "private"){ -// isPrivate = true; -// } -// else if (eventType == "public"){ -// isPublic = true; -// } -// else if (eventType == "organisation"){ -// isOrganisation = true; -// } -// else { -// isUnknownType = true; -// } - res.render('newevent', { - title: 'New event', - isPrivate: isPrivate, - isPublic: isPublic, - isOrganisation: isOrganisation, - isUnknownType: isUnknownType, - eventType: 'public', + let isPrivate = false; + let isPublic = true; + let isOrganisation = false; + let isUnknownType = false; +// let eventType = req.params.eventType; +// if (eventType == "private"){ +// isPrivate = true; +// } +// else if (eventType == "public"){ +// isPublic = true; +// } +// else if (eventType == "organisation"){ +// isOrganisation = true; +// } +// else { +// isUnknownType = true; +// } + res.render('newevent', { + title: 'New event', + isPrivate: isPrivate, + isPublic: isPublic, + isOrganisation: isOrganisation, + isUnknownType: isUnknownType, + eventType: 'public', domain: domain, email: contactEmail, siteName: siteName, - }); + }); }) // return the JSON for the featured/pinned post for this event @@ -285,78 +285,78 @@ router.get('/.well-known/webfinger', (req, res) => { }); router.get('/:eventID', (req, res) => { - Event.findOne({ - id: req.params.eventID - }) - .populate('eventGroup') - .then((event) => { - if (event) { - const parsedLocation = event.location.replace(/\s+/g, '+'); - let displayDate; - if (moment.tz(event.end, event.timezone).isSame(event.start, 'day')){ - // Happening during one day - displayDate = moment.tz(event.start, event.timezone).format('dddd D MMMM YYYY [<span class="text-muted">from</span>] h:mm a') + moment.tz(event.end, event.timezone).format(' [<span class="text-muted">to</span>] h:mm a [<span class="text-muted">](z)[</span>]'); - } - else { - displayDate = moment.tz(event.start, event.timezone).format('dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a') + moment.tz(event.end, event.timezone).format(' [<span class="text-muted">–</span>] dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a [<span class="text-muted">](z)[</span>]'); - } - let eventStartISO = moment.tz(event.start, "Etc/UTC").toISOString(); - let eventEndISO = moment.tz(event.end, "Etc/UTC").toISOString(); - let parsedStart = moment.tz(event.start, event.timezone).format('YYYYMMDD[T]HHmmss'); - let parsedEnd = moment.tz(event.end, event.timezone).format('YYYYMMDD[T]HHmmss'); - let eventHasConcluded = false; - if (moment.tz(event.end, event.timezone).isBefore(moment.tz(event.timezone))){ - eventHasConcluded = true; - } - let eventHasBegun = false; - if (moment.tz(event.start, event.timezone).isBefore(moment.tz(event.timezone))){ - eventHasBegun = true; - } - let fromNow = moment.tz(event.start, event.timezone).fromNow(); - let parsedDescription = marked(event.description); - let eventEditToken = event.editToken; - - let escapedName = event.name.replace(/\s+/g, '+'); - - let eventHasCoverImage = false; - if( event.image ) { - eventHasCoverImage = true; - } - else { - eventHasCoverImage = false; - } - let eventHasHost = false; - if( event.hostName ) { - eventHasHost = true; - } - else { - eventHasHost = false; - } - let firstLoad = false; - if (event.firstLoad === true) { - firstLoad = true; - Event.findOneAndUpdate({id: req.params.eventID}, {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 === eventEditToken){ - editingEnabled = true; - } - else { - editingEnabled = false; - } - } - } - let eventAttendees = event.attendees.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)) + Event.findOne({ + id: req.params.eventID + }) + .populate('eventGroup') + .then((event) => { + if (event) { + const parsedLocation = event.location.replace(/\s+/g, '+'); + let displayDate; + if (moment.tz(event.end, event.timezone).isSame(event.start, 'day')){ + // Happening during one day + displayDate = moment.tz(event.start, event.timezone).format('dddd D MMMM YYYY [<span class="text-muted">from</span>] h:mm a') + moment.tz(event.end, event.timezone).format(' [<span class="text-muted">to</span>] h:mm a [<span class="text-muted">](z)[</span>]'); + } + else { + displayDate = moment.tz(event.start, event.timezone).format('dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a') + moment.tz(event.end, event.timezone).format(' [<span class="text-muted">–</span>] dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a [<span class="text-muted">](z)[</span>]'); + } + let eventStartISO = moment.tz(event.start, "Etc/UTC").toISOString(); + let eventEndISO = moment.tz(event.end, "Etc/UTC").toISOString(); + let parsedStart = moment.tz(event.start, event.timezone).format('YYYYMMDD[T]HHmmss'); + let parsedEnd = moment.tz(event.end, event.timezone).format('YYYYMMDD[T]HHmmss'); + let eventHasConcluded = false; + if (moment.tz(event.end, event.timezone).isBefore(moment.tz(event.timezone))){ + eventHasConcluded = true; + } + let eventHasBegun = false; + if (moment.tz(event.start, event.timezone).isBefore(moment.tz(event.timezone))){ + eventHasBegun = true; + } + let fromNow = moment.tz(event.start, event.timezone).fromNow(); + let parsedDescription = marked(event.description); + let eventEditToken = event.editToken; + + let escapedName = event.name.replace(/\s+/g, '+'); + + let eventHasCoverImage = false; + if( event.image ) { + eventHasCoverImage = true; + } + else { + eventHasCoverImage = false; + } + let eventHasHost = false; + if( event.hostName ) { + eventHasHost = true; + } + else { + eventHasHost = false; + } + let firstLoad = false; + if (event.firstLoad === true) { + firstLoad = true; + Event.findOneAndUpdate({id: req.params.eventID}, {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 === eventEditToken){ + editingEnabled = true; + } + else { + editingEnabled = false; + } + } + } + let eventAttendees = event.attendees.sort((a,b) => (a.name > b.name) ? 1 : ((b.name > a.name) ? -1 : 0)) .map(el => { if (!el.id) { el.id = el._id; @@ -373,13 +373,13 @@ router.get('/:eventID', (req, res) => { if (spotsRemaining <= 0) { noMoreSpots = true; } - } - let metadata = { - title: event.name, - description: marked(event.description, { renderer: render_plain()}).split(" ").splice(0,40).join(" ").trim(), - image: (eventHasCoverImage ? `https://${domain}/events/` + event.image : null), - url: `https://${domain}/` + req.params.eventID - }; + } + let metadata = { + title: event.name, + description: marked(event.description, { renderer: render_plain()}).split(" ").splice(0,40).join(" ").trim(), + image: (eventHasCoverImage ? `https://${domain}/events/` + event.image : null), + url: `https://${domain}/` + req.params.eventID + }; if (req.headers.accept && (req.headers.accept.includes('application/activity+json') || req.headers.accept.includes('application/json') || req.headers.accept.includes('application/json+ld'))) { res.json(JSON.parse(event.activityPubActor)); } @@ -393,8 +393,8 @@ router.get('/:eventID', (req, res) => { escapedName: escapedName, eventData: event, eventAttendees: eventAttendees, - spotsRemaining: spotsRemaining, - noMoreSpots: noMoreSpots, + spotsRemaining: spotsRemaining, + noMoreSpots: noMoreSpots, eventStartISO: eventStartISO, eventEndISO: eventEndISO, parsedLocation: parsedLocation, @@ -414,30 +414,30 @@ router.get('/:eventID', (req, res) => { siteName: siteName }) } - } - else { - res.status(404); - res.render('404', { url: req.url }); - } - - }) - .catch((err) => { - addToLog("displayEvent", "error", "Attempt to display event " + req.params.eventID + " failed with error: " + err); - console.log(err) - res.status(404); - res.render('404', { url: req.url }); - return; - }); + } + else { + res.status(404); + res.render('404', { url: req.url }); + } + + }) + .catch((err) => { + addToLog("displayEvent", "error", "Attempt to display event " + req.params.eventID + " failed with error: " + err); + console.log(err) + res.status(404); + res.render('404', { url: req.url }); + return; + }); }) router.get('/:eventID/followers', (req, res) => { if (!isFederated) return res.sendStatus(404); const eventID = req.params.eventID; - Event.findOne({ - id: eventID - }) - .then((event) => { - if (event) { + Event.findOne({ + id: eventID + }) + .then((event) => { + if (event) { const followers = event.followers.map(el => el.actorId); let followersCollection = { "type": "OrderedCollection", @@ -461,148 +461,148 @@ router.get('/:eventID/followers', (req, res) => { }) router.get('/group/:eventGroupID', (req, res) => { - EventGroup.findOne({ - id: req.params.eventGroupID - }) - .then(async (eventGroup) => { - if (eventGroup) { - let parsedDescription = marked(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}).sort('start') - - events.forEach(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; - } - }) - - 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(eventGroup.description, { renderer: render_plain()}).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', { + EventGroup.findOne({ + id: req.params.eventGroupID + }) + .then(async (eventGroup) => { + if (eventGroup) { + let parsedDescription = marked(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}).sort('start') + + events.forEach(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; + } + }) + + 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(eventGroup.description, { renderer: render_plain()}).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; - }); + 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('/exportevent/:eventID', (req, res) => { - Event.findOne({ - id: req.params.eventID - }) - .populate('eventGroup') - .then((event) => { - if (event) { - const icalEvent = cal.createEvent({ - start: moment.tz(event.start, event.timezone), - end: moment.tz(event.start, event.timezone), - timezone: event.timezone, - timestamp: moment(), - summary: event.name, - description: event.description, - organizer: { - name: event.hostName ? event.hostName : "Anonymous", - email: event.creatorEmail - }, - location: event.location, - url: 'https://gath.io/' + event.id - }); - - let string = cal.toString(); - console.log(string) - 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; - }); + Event.findOne({ + id: req.params.eventID + }) + .populate('eventGroup') + .then((event) => { + if (event) { + const icalEvent = cal.createEvent({ + start: moment.tz(event.start, event.timezone), + end: moment.tz(event.start, event.timezone), + timezone: event.timezone, + timestamp: moment(), + summary: event.name, + description: event.description, + organizer: { + name: event.hostName ? event.hostName : "Anonymous", + email: event.creatorEmail + }, + location: event.location, + url: 'https://gath.io/' + event.id + }); + + let string = cal.toString(); + console.log(string) + 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; + }); }) // BACKEND ROUTES @@ -615,73 +615,73 @@ router.get('/exportevent/:eventID', (req, res) => { router.post('/newevent', async (req, res) => { - let eventID = shortid.generate(); + let eventID = shortid.generate(); // this is a hack, activitypub does not like "-" in ids so we are essentially going // to have a 63-character alphabet instead of a 64-character one eventID = eventID.replace(/-/g,'_'); - let editToken = randomstring.generate(); - let eventImageFilename = ""; - let isPartOfEventGroup = false; - if (req.files && Object.keys(req.files).length !== 0) { - let eventImageBuffer = req.files.imageUpload.data; - Jimp.read(eventImageBuffer, (err, img) => { - if (err) addToLog("Jimp", "error", "Attempt to edit image failed with error: " + err); - img - .resize(920, Jimp.AUTO) // resize - .quality(80) // set JPEG quality - .write('./public/events/' + eventID + '.jpg'); // save - }); - eventImageFilename = eventID + '.jpg'; - } - let startUTC = moment.tz(req.body.eventStart, 'D MMMM YYYY, hh:mm a', req.body.timezone); - let endUTC = moment.tz(req.body.eventEnd, 'D MMMM YYYY, hh:mm a', req.body.timezone); - let eventGroup; - if (req.body.eventGroupCheckbox) { - eventGroup = await EventGroup.findOne({ - id: req.body.eventGroupID, - editToken: req.body.eventGroupEditToken - }) - if (eventGroup) { - isPartOfEventGroup = true; - } - } + let editToken = randomstring.generate(); + let eventImageFilename = ""; + let isPartOfEventGroup = false; + if (req.files && Object.keys(req.files).length !== 0) { + let eventImageBuffer = req.files.imageUpload.data; + Jimp.read(eventImageBuffer, (err, img) => { + if (err) addToLog("Jimp", "error", "Attempt to edit image failed with error: " + err); + img + .resize(920, Jimp.AUTO) // resize + .quality(80) // set JPEG quality + .write('./public/events/' + eventID + '.jpg'); // save + }); + eventImageFilename = eventID + '.jpg'; + } + let startUTC = moment.tz(req.body.eventStart, 'D MMMM YYYY, hh:mm a', req.body.timezone); + let endUTC = moment.tz(req.body.eventEnd, 'D MMMM YYYY, hh:mm a', req.body.timezone); + let eventGroup; + if (req.body.eventGroupCheckbox) { + eventGroup = await EventGroup.findOne({ + id: req.body.eventGroupID, + editToken: req.body.eventGroupEditToken + }) + if (eventGroup) { + isPartOfEventGroup = true; + } + } // generate RSA keypair for ActivityPub let pair = generateRSAKeypair(); - const event = new Event({ - id: eventID, - type: req.body.eventType, - name: req.body.eventName, - location: req.body.eventLocation, - start: startUTC, - end: endUTC, - timezone: req.body.timezone, - description: req.body.eventDescription, - image: eventImageFilename, - creatorEmail: req.body.creatorEmail, - url: req.body.eventURL, - hostName: req.body.hostName, - viewPassword: req.body.viewPassword, - editPassword: req.body.editPassword, - editToken: editToken, - eventGroup: isPartOfEventGroup ? eventGroup._id : null, - usersCanAttend: req.body.joinCheckbox ? true : false, - showUsersList: req.body.guestlistCheckbox ? true : false, - usersCanComment: req.body.interactionCheckbox ? true : false, - maxAttendees: req.body.maxAttendees, - firstLoad: true, + const event = new Event({ + id: eventID, + type: req.body.eventType, + name: req.body.eventName, + location: req.body.eventLocation, + start: startUTC, + end: endUTC, + timezone: req.body.timezone, + description: req.body.eventDescription, + image: eventImageFilename, + creatorEmail: req.body.creatorEmail, + url: req.body.eventURL, + hostName: req.body.hostName, + viewPassword: req.body.viewPassword, + editPassword: req.body.editPassword, + editToken: editToken, + eventGroup: isPartOfEventGroup ? eventGroup._id : null, + usersCanAttend: req.body.joinCheckbox ? true : false, + showUsersList: req.body.guestlistCheckbox ? true : false, + usersCanComment: req.body.interactionCheckbox ? true : false, + maxAttendees: req.body.maxAttendees, + firstLoad: true, activityPubActor: ap.createActivityPubActor(eventID, domain, pair.public, marked(req.body.eventDescription), req.body.eventName, req.body.eventLocation, eventImageFilename, startUTC, endUTC, req.body.timezone), activityPubEvent: ap.createActivityPubEvent(req.body.eventName, startUTC, endUTC, req.body.timezone, req.body.eventDescription, req.body.eventLocation), activityPubMessages: [ { id: `https://${domain}/${eventID}/m/featuredPost`, content: JSON.stringify(ap.createFeaturedPost(eventID, req.body.eventName, startUTC, endUTC, req.body.timezone, req.body.eventDescription, req.body.eventLocation)) } ], publicKey: pair.public, privateKey: pair.private - }); - event.save() - .then((event) => { - addToLog("createEvent", "success", "Event " + eventID + "created"); - // Send email with edit link - if (sendEmails) { + }); + event.save() + .then((event) => { + addToLog("createEvent", "success", "Event " + eventID + "created"); + // Send email with edit link + if (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, @@ -697,117 +697,117 @@ router.post('/newevent', async (req, res) => { res.status(500).end(); }); }); - } - res.writeHead(302, { - 'Location': '/' + eventID + '?e=' + editToken - }); - res.end(); - }) - .catch((err) => { res.status(500).send('Database error, please try again :( - ' + err); addToLog("createEvent", "error", "Attempt to create event failed with error: " + err);}); + } + res.writeHead(302, { + 'Location': '/' + eventID + '?e=' + editToken + }); + res.end(); + }) + .catch((err) => { res.status(500).send('Database error, please try again :( - ' + err); addToLog("createEvent", "error", "Attempt to create event failed with error: " + err);}); }); router.post('/importevent', (req, res) => { - let eventID = shortid.generate(); - 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:", ""); - } else { - res.status(500).send("Please supply an email address on the previous page."); - } - - 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 (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, - }, - subject: `${siteName}: ${importedEventData.summary}`, - html, - }; - sgMail.send(msg).catch(e => { - console.error(e.toString()); - res.status(500).end(); - }); - }); - } - 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(); - } + let eventID = shortid.generate(); + 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:", ""); + } else { + res.status(500).send("Please supply an email address on the previous page."); + } + + 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 (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, + }, + subject: `${siteName}: ${importedEventData.summary}`, + html, + }; + sgMail.send(msg).catch(e => { + console.error(e.toString()); + res.status(500).end(); + }); + }); + } + 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('/neweventgroup', (req, res) => { - let eventGroupID = shortid.generate(); - let editToken = randomstring.generate(); - let eventGroupImageFilename = ""; - if (req.files && Object.keys(req.files).length !== 0) { - let eventImageBuffer = req.files.imageUpload.data; - Jimp.read(eventImageBuffer, (err, img) => { - if (err) addToLog("Jimp", "error", "Attempt to edit image failed with error: " + err); - img - .resize(920, Jimp.AUTO) // resize - .quality(80) // set JPEG quality - .write('./public/events/' + eventGroupID + '.jpg'); // save - }); - eventGroupImageFilename = eventGroupID + '.jpg'; - } - const eventGroup = new EventGroup({ - id: eventGroupID, - name: req.body.eventGroupName, - description: req.body.eventGroupDescription, - image: eventGroupImageFilename, - creatorEmail: req.body.creatorEmail, - url: req.body.eventGroupURL, - hostName: req.body.hostName, - editToken: editToken, - firstLoad: true - }); - eventGroup.save() - .then(() => { - addToLog("createEventGroup", "success", "Event group " + eventGroupID + " created"); - // Send email with edit link - if (sendEmails) { + let eventGroupID = shortid.generate(); + let editToken = randomstring.generate(); + let eventGroupImageFilename = ""; + if (req.files && Object.keys(req.files).length !== 0) { + let eventImageBuffer = req.files.imageUpload.data; + Jimp.read(eventImageBuffer, (err, img) => { + if (err) addToLog("Jimp", "error", "Attempt to edit image failed with error: " + err); + img + .resize(920, Jimp.AUTO) // resize + .quality(80) // set JPEG quality + .write('./public/events/' + eventGroupID + '.jpg'); // save + }); + eventGroupImageFilename = eventGroupID + '.jpg'; + } + const eventGroup = new EventGroup({ + id: eventGroupID, + name: req.body.eventGroupName, + description: req.body.eventGroupDescription, + image: eventGroupImageFilename, + creatorEmail: req.body.creatorEmail, + url: req.body.eventGroupURL, + hostName: req.body.hostName, + editToken: editToken, + firstLoad: true + }); + eventGroup.save() + .then(() => { + addToLog("createEventGroup", "success", "Event group " + eventGroupID + " created"); + // Send email with edit link + if (sendEmails) { req.app.get('hbsInstance').renderView('./views/emails/createeventgroup.handlebars', {eventGroupID, editToken, siteName, siteLogo, domain, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: req.body.creatorEmail, @@ -823,71 +823,71 @@ router.post('/neweventgroup', (req, res) => { res.status(500).end(); }); }); - } - res.writeHead(302, { - 'Location': '/group/' + eventGroupID + '?e=' + editToken - }); - res.end(); - }) - .catch((err) => { res.send('Database error, please try again :( - ' + err); addToLog("createEvent", "error", "Attempt to create event failed with error: " + err);}); + } + res.writeHead(302, { + 'Location': '/group/' + eventGroupID + '?e=' + editToken + }); + res.end(); + }) + .catch((err) => { res.send('Database error, please try again :( - ' + err); addToLog("createEvent", "error", "Attempt to create event failed with error: " + err);}); }); router.post('/editevent/:eventID/:editToken', (req, res) => { - console.log(req.body); - let submittedEditToken = req.params.editToken; - Event.findOne(({ - id: req.params.eventID, - })) - .then(async (event) => { - if (event.editToken === submittedEditToken) { - // Token matches - - // If there is a new image, upload that first - let eventID = req.params.eventID; - let eventImageFilename = event.image; - if (req.files && Object.keys(req.files).length !== 0) { - let eventImageBuffer = req.files.imageUpload.data; - Jimp.read(eventImageBuffer, (err, img) => { - if (err) throw err; - img - .resize(920, Jimp.AUTO) // resize - .quality(80) // set JPEG - .write('./public/events/' + eventID + '.jpg'); // save - }); - eventImageFilename = eventID + '.jpg'; - } - let startUTC = moment.tz(req.body.eventStart, 'D MMMM YYYY, hh:mm a', req.body.timezone); - let endUTC = moment.tz(req.body.eventEnd, 'D MMMM YYYY, hh:mm a', req.body.timezone); - - let isPartOfEventGroup = false; + console.log(req.body); + let submittedEditToken = req.params.editToken; + Event.findOne(({ + id: req.params.eventID, + })) + .then(async (event) => { + if (event.editToken === submittedEditToken) { + // Token matches + + // If there is a new image, upload that first + let eventID = req.params.eventID; + let eventImageFilename = event.image; + if (req.files && Object.keys(req.files).length !== 0) { + let eventImageBuffer = req.files.imageUpload.data; + Jimp.read(eventImageBuffer, (err, img) => { + if (err) throw err; + img + .resize(920, Jimp.AUTO) // resize + .quality(80) // set JPEG + .write('./public/events/' + eventID + '.jpg'); // save + }); + eventImageFilename = eventID + '.jpg'; + } + let startUTC = moment.tz(req.body.eventStart, 'D MMMM YYYY, hh:mm a', req.body.timezone); + let endUTC = moment.tz(req.body.eventEnd, 'D MMMM YYYY, hh:mm a', req.body.timezone); + + let isPartOfEventGroup = false; let eventGroup; - if (req.body.eventGroupCheckbox) { - eventGroup = await EventGroup.findOne({ - id: req.body.eventGroupID, - editToken: req.body.eventGroupEditToken - }) - if (eventGroup) { - isPartOfEventGroup = true; - } - } - const updatedEvent = { - name: req.body.eventName, - location: req.body.eventLocation, - start: startUTC, - end: endUTC, - timezone: req.body.timezone, - description: req.body.eventDescription, - url: req.body.eventURL, - hostName: req.body.hostName, - image: eventImageFilename, - usersCanAttend: req.body.joinCheckbox ? true : false, - showUsersList: req.body.guestlistCheckbox ? true : false, - usersCanComment: req.body.interactionCheckbox ? true : false, - maxAttendees: req.body.maxAttendeesCheckbox ? req.body.maxAttendees : null, - eventGroup: isPartOfEventGroup ? eventGroup._id : null, + if (req.body.eventGroupCheckbox) { + eventGroup = await EventGroup.findOne({ + id: req.body.eventGroupID, + editToken: req.body.eventGroupEditToken + }) + if (eventGroup) { + isPartOfEventGroup = true; + } + } + const updatedEvent = { + name: req.body.eventName, + location: req.body.eventLocation, + start: startUTC, + end: endUTC, + timezone: req.body.timezone, + description: req.body.eventDescription, + url: req.body.eventURL, + hostName: req.body.hostName, + image: eventImageFilename, + usersCanAttend: req.body.joinCheckbox ? true : false, + showUsersList: req.body.guestlistCheckbox ? true : false, + usersCanComment: req.body.interactionCheckbox ? true : false, + maxAttendees: req.body.maxAttendeesCheckbox ? req.body.maxAttendees : null, + eventGroup: isPartOfEventGroup ? eventGroup._id : null, activityPubActor: ap.updateActivityPubActor(JSON.parse(event.activityPubActor), req.body.eventDescription, req.body.eventName, req.body.eventLocation, eventImageFilename, startUTC, endUTC, req.body.timezone), activityPubEvent: ap.updateActivityPubEvent(JSON.parse(event.activityPubEvent), req.body.eventName, req.body.startUTC, req.body.endUTC, req.body.timezone), - } + } let diffText = '<p>This event was just updated with new information.</p><ul>'; let displayDate; if (event.name !== updatedEvent.name) { @@ -912,14 +912,14 @@ router.post('/editevent/:eventID/:editToken', (req, res) => { diffText += `<li>the event description changed</li>`; } diffText += `</ul>`; - Event.findOneAndUpdate({id: req.params.eventID}, updatedEvent, function(err, raw) { - if (err) { - addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: " + err); - res.send(err); - } - }) - .then(() => { - addToLog("editEvent", "success", "Event " + req.params.eventID + " edited"); + Event.findOneAndUpdate({id: req.params.eventID}, updatedEvent, function(err, raw) { + if (err) { + addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: " + err); + res.send(err); + } + }) + .then(() => { + addToLog("editEvent", "success", "Event " + req.params.eventID + " edited"); // send update to ActivityPub subscribers Event.findOne({id: req.params.eventID}, function(err,event) { if (!event) return; @@ -957,11 +957,11 @@ router.post('/editevent/:eventID/:editToken', (req, res) => { } } }) - if (sendEmails) { - Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { - let attendeeEmails = ids; - if (!error && attendeeEmails !== ""){ - console.log("Sending emails to: " + attendeeEmails); + if (sendEmails) { + Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { + let attendeeEmails = ids; + if (!error && attendeeEmails !== ""){ + console.log("Sending emails to: " + attendeeEmails); req.app.get('hbsInstance').renderView('./views/emails/editevent.handlebars', {diffText, eventID: req.params.eventID, siteName, siteLogo, domain, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: attendeeEmails, @@ -977,130 +977,130 @@ router.post('/editevent/:eventID/:editToken', (req, res) => { res.status(500).end(); }); }); - } - else { - console.log("Nothing to send!"); - } - }) - } - res.writeHead(302, { - 'Location': '/' + req.params.eventID + '?e=' + req.params.editToken - }); - res.end(); - }) - .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: " + err);}); - } - else { - // Token doesn't match - res.send('Sorry! Something went wrong'); - addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: token does not match"); - } - }) - .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: " + err);}); + } + else { + console.log("Nothing to send!"); + } + }) + } + res.writeHead(302, { + 'Location': '/' + req.params.eventID + '?e=' + req.params.editToken + }); + res.end(); + }) + .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: " + err);}); + } + else { + // Token doesn't match + res.send('Sorry! Something went wrong'); + addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: token does not match"); + } + }) + .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEvent", "error", "Attempt to edit event " + req.params.eventID + " failed with error: " + err);}); }); router.post('/editeventgroup/:eventGroupID/:editToken', (req, res) => { - let submittedEditToken = req.params.editToken; - EventGroup.findOne(({ - id: req.params.eventGroupID, - })) - .then((eventGroup) => { - if (eventGroup.editToken === submittedEditToken) { - // Token matches - - // If there is a new image, upload that first - let eventGroupID = req.params.eventGroupID; - let eventGroupImageFilename = eventGroup.image; - if (req.files && Object.keys(req.files).length !== 0) { - let eventImageBuffer = req.files.eventGroupImageUpload.data; - Jimp.read(eventImageBuffer, (err, img) => { - if (err) throw err; - img - .resize(920, Jimp.AUTO) // resize - .quality(80) // set JPEG - .write('./public/events/' + eventGroupID + '.jpg'); // save - }); - eventGroupImageFilename = eventGroupID + '.jpg'; - } - const updatedEventGroup = { - name: req.body.eventGroupName, - description: req.body.eventGroupDescription, - url: req.body.eventGroupURL, - hostName: req.body.hostName, - image: eventGroupImageFilename - } - EventGroup.findOneAndUpdate({id: req.params.eventGroupID}, updatedEventGroup, function(err, raw) { - if (err) { - addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: " + err); - res.send(err); - } - }) - .then(() => { - addToLog("editEventGroup", "success", "Event group " + req.params.eventGroupID + " edited"); - res.writeHead(302, { - 'Location': '/group/' + req.params.eventGroupID + '?e=' + req.params.editToken - }); - res.end(); - }) - .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: " + err);}); - } - else { - // Token doesn't match - res.send('Sorry! Something went wrong'); - addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: token does not match"); - } - }) - .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: " + err);}); + let submittedEditToken = req.params.editToken; + EventGroup.findOne(({ + id: req.params.eventGroupID, + })) + .then((eventGroup) => { + if (eventGroup.editToken === submittedEditToken) { + // Token matches + + // If there is a new image, upload that first + let eventGroupID = req.params.eventGroupID; + let eventGroupImageFilename = eventGroup.image; + if (req.files && Object.keys(req.files).length !== 0) { + let eventImageBuffer = req.files.eventGroupImageUpload.data; + Jimp.read(eventImageBuffer, (err, img) => { + if (err) throw err; + img + .resize(920, Jimp.AUTO) // resize + .quality(80) // set JPEG + .write('./public/events/' + eventGroupID + '.jpg'); // save + }); + eventGroupImageFilename = eventGroupID + '.jpg'; + } + const updatedEventGroup = { + name: req.body.eventGroupName, + description: req.body.eventGroupDescription, + url: req.body.eventGroupURL, + hostName: req.body.hostName, + image: eventGroupImageFilename + } + EventGroup.findOneAndUpdate({id: req.params.eventGroupID}, updatedEventGroup, function(err, raw) { + if (err) { + addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: " + err); + res.send(err); + } + }) + .then(() => { + addToLog("editEventGroup", "success", "Event group " + req.params.eventGroupID + " edited"); + res.writeHead(302, { + 'Location': '/group/' + req.params.eventGroupID + '?e=' + req.params.editToken + }); + res.end(); + }) + .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: " + err);}); + } + else { + // Token doesn't match + res.send('Sorry! Something went wrong'); + addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: token does not match"); + } + }) + .catch((err) => { console.error(err); res.send('Sorry! Something went wrong!'); addToLog("editEventGroup", "error", "Attempt to edit event group " + req.params.eventGroupID + " failed with error: " + err);}); }); router.post('/deleteimage/:eventID/:editToken', (req, res) => { - let submittedEditToken = req.params.editToken; - Event.findOne(({ - id: req.params.eventID, - })) - .then((event) => { - if (event.editToken === submittedEditToken) { - // Token matches - if (event.image){ - eventImage = event.image; - } else { - res.status(500).send('This event doesn\'t have a linked image. What are you even doing'); - } - fs.unlink(global.appRoot + '/public/events/' + eventImage, (err) => { - if (err) { - res.status(500).send(err); - addToLog("deleteEventImage", "error", "Attempt to delete event image for event " + req.params.eventID + " failed with error: " + err); - } - // Image removed - addToLog("deleteEventImage", "success", "Image for event " + req.params.eventID + " deleted"); - event.image = ""; - event.save() - .then(response => { - res.status(200).send('Success'); - }) - .catch(err => { - res.status(500).send(err); - addToLog("deleteEventImage", "error", "Attempt to delete event image for event " + req.params.eventID + " failed with error: " + err); - }) - }); - } - }); + let submittedEditToken = req.params.editToken; + Event.findOne(({ + id: req.params.eventID, + })) + .then((event) => { + if (event.editToken === submittedEditToken) { + // Token matches + if (event.image){ + eventImage = event.image; + } else { + res.status(500).send('This event doesn\'t have a linked image. What are you even doing'); + } + fs.unlink(global.appRoot + '/public/events/' + eventImage, (err) => { + if (err) { + res.status(500).send(err); + addToLog("deleteEventImage", "error", "Attempt to delete event image for event " + req.params.eventID + " failed with error: " + err); + } + // Image removed + addToLog("deleteEventImage", "success", "Image for event " + req.params.eventID + " deleted"); + event.image = ""; + event.save() + .then(response => { + res.status(200).send('Success'); + }) + .catch(err => { + res.status(500).send(err); + addToLog("deleteEventImage", "error", "Attempt to delete event image for event " + req.params.eventID + " failed with error: " + err); + }) + }); + } + }); }); router.post('/deleteevent/:eventID/:editToken', (req, res) => { - let submittedEditToken = req.params.editToken; - let eventImage; - Event.findOne(({ - id: req.params.eventID, - })) - .then((event) => { - if (event.editToken === submittedEditToken) { - // Token matches + let submittedEditToken = req.params.editToken; + let eventImage; + Event.findOne(({ + id: req.params.eventID, + })) + .then((event) => { + if (event.editToken === submittedEditToken) { + // Token matches let eventImage; - if (event.image){ - eventImage = event.image; - } + if (event.image){ + eventImage = event.image; + } // broadcast a Delete profile message to all followers so that at least Mastodon servers will delete their local profile information const guidUpdateObject = crypto.randomBytes(16).toString('hex'); @@ -1132,12 +1132,12 @@ router.post('/deleteevent/:eventID/:editToken', (req, res) => { }) .catch((err) => { res.send('Sorry! Something went wrong (error deleting): ' + err); addToLog("deleteEvent", "error", "Attempt to delete event " + req.params.eventID + " failed with error: " + err);}); }); - // Send emails here otherwise they don't exist lol - if (sendEmails) { - Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { - attendeeEmails = ids; - if (!error){ - console.log("Sending emails to: " + attendeeEmails); + // Send emails here otherwise they don't exist lol + if (sendEmails) { + Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { + attendeeEmails = ids; + if (!error){ + console.log("Sending emails to: " + attendeeEmails); req.app.get('hbsInstance').renderView('./views/emails/deleteevent.handlebars', {siteName, siteLogo, domain, eventName: event.name, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: attendeeEmails, @@ -1159,89 +1159,89 @@ router.post('/deleteevent/:eventID/:editToken', (req, res) => { } }); } - } - else { - // Token doesn't match - res.send('Sorry! Something went wrong'); - addToLog("deleteEvent", "error", "Attempt to delete event " + req.params.eventID + " failed with error: token does not match"); - } - }) - .catch((err) => { res.send('Sorry! Something went wrong: ' + err); addToLog("deleteEvent", "error", "Attempt to delete event " + req.params.eventID + " failed with error: " + err);}); + } + else { + // Token doesn't match + res.send('Sorry! Something went wrong'); + addToLog("deleteEvent", "error", "Attempt to delete event " + req.params.eventID + " failed with error: token does not match"); + } + }) + .catch((err) => { res.send('Sorry! Something went wrong: ' + err); addToLog("deleteEvent", "error", "Attempt to delete event " + req.params.eventID + " failed with error: " + err);}); }); router.post('/deleteeventgroup/:eventGroupID/:editToken', (req, res) => { - let submittedEditToken = req.params.editToken; - EventGroup.findOne(({ - id: req.params.eventGroupID, - })) - .then(async (eventGroup) => { - if (eventGroup.editToken === submittedEditToken) { - // Token matches - - let linkedEvents = await Event.find({eventGroup: eventGroup._id}); - - let linkedEventIDs = linkedEvents.map(event => event._id); - let eventGroupImage = false; - if (eventGroup.image){ - eventGroupImage = eventGroup.image; - } - - EventGroup.deleteOne({id: req.params.eventGroupID}, function(err, raw) { - if (err) { - res.send(err); - addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err); - } - }) - .then(() => { - // Delete image - if (eventGroupImage){ - fs.unlink(global.appRoot + '/public/events/' + eventGroupImage, (err) => { - if (err) { - res.send(err); - addToLog("deleteEventGroup", "error", "Attempt to delete event image for event group " + req.params.eventGroupID + " failed with error: " + err); - } - }) - } - Event.update({_id: {$in: linkedEventIDs}}, { $set: { eventGroup: null } }, { multi: true }) - .then(response => { - console.log(response); - addToLog("deleteEventGroup", "success", "Event group " + req.params.eventGroupID + " deleted"); - res.writeHead(302, { - 'Location': '/' - }); - res.end(); - }) - .catch((err) => { res.send('Sorry! Something went wrong (error deleting): ' + err); addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err);}); - }) - .catch((err) => { res.send('Sorry! Something went wrong (error deleting): ' + err); addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err);}); - } - else { - // Token doesn't match - res.send('Sorry! Something went wrong'); - addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: token does not match"); - } - }) - .catch((err) => { res.send('Sorry! Something went wrong: ' + err); addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err);}); + let submittedEditToken = req.params.editToken; + EventGroup.findOne(({ + id: req.params.eventGroupID, + })) + .then(async (eventGroup) => { + if (eventGroup.editToken === submittedEditToken) { + // Token matches + + let linkedEvents = await Event.find({eventGroup: eventGroup._id}); + + let linkedEventIDs = linkedEvents.map(event => event._id); + let eventGroupImage = false; + if (eventGroup.image){ + eventGroupImage = eventGroup.image; + } + + EventGroup.deleteOne({id: req.params.eventGroupID}, function(err, raw) { + if (err) { + res.send(err); + addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err); + } + }) + .then(() => { + // Delete image + if (eventGroupImage){ + fs.unlink(global.appRoot + '/public/events/' + eventGroupImage, (err) => { + if (err) { + res.send(err); + addToLog("deleteEventGroup", "error", "Attempt to delete event image for event group " + req.params.eventGroupID + " failed with error: " + err); + } + }) + } + Event.update({_id: {$in: linkedEventIDs}}, { $set: { eventGroup: null } }, { multi: true }) + .then(response => { + console.log(response); + addToLog("deleteEventGroup", "success", "Event group " + req.params.eventGroupID + " deleted"); + res.writeHead(302, { + 'Location': '/' + }); + res.end(); + }) + .catch((err) => { res.send('Sorry! Something went wrong (error deleting): ' + err); addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err);}); + }) + .catch((err) => { res.send('Sorry! Something went wrong (error deleting): ' + err); addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err);}); + } + else { + // Token doesn't match + res.send('Sorry! Something went wrong'); + addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: token does not match"); + } + }) + .catch((err) => { res.send('Sorry! Something went wrong: ' + err); addToLog("deleteEventGroup", "error", "Attempt to delete event group " + req.params.eventGroupID + " failed with error: " + err);}); }); router.post('/attendevent/:eventID', (req, res) => { - const newAttendee = { - name: req.body.attendeeName, - status: 'attending', - email: req.body.attendeeEmail, - removalPassword: req.body.removeAttendancePassword - }; - - Event.findOne({ - id: req.params.eventID, - }, function(err,event) { + const newAttendee = { + name: req.body.attendeeName, + status: 'attending', + email: req.body.attendeeEmail, + removalPassword: req.body.removeAttendancePassword + }; + + Event.findOne({ + id: req.params.eventID, + }, function(err,event) { if (!event) return; - event.attendees.push(newAttendee); - event.save() - .then(() => { - addToLog("addEventAttendee", "success", "Attendee added to event " + req.params.eventID); - if (sendEmails) { - if (req.body.attendeeEmail){ + event.attendees.push(newAttendee); + event.save() + .then(() => { + addToLog("addEventAttendee", "success", "Attendee added to event " + req.params.eventID); + if (sendEmails) { + if (req.body.attendeeEmail){ req.app.get('hbsInstance').renderView('./views/emails/addeventattendee.handlebars', {eventID: req.params.eventID, siteName, siteLogo, domain, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: req.body.attendeeEmail, @@ -1257,34 +1257,34 @@ router.post('/attendevent/:eventID', (req, res) => { res.status(500).end(); }); }); - } - } - res.writeHead(302, { - 'Location': '/' + req.params.eventID - }); - res.end(); - }) - .catch((err) => { res.send('Database error, please try again :('); addToLog("addEventAttendee", "error", "Attempt to add attendee to event " + req.params.eventID + " failed with error: " + err); }); - }); + } + } + res.writeHead(302, { + 'Location': '/' + req.params.eventID + }); + res.end(); + }) + .catch((err) => { res.send('Database error, please try again :('); addToLog("addEventAttendee", "error", "Attempt to add attendee to event " + req.params.eventID + " failed with error: " + err); }); + }); }); router.post('/unattendevent/:eventID', (req, res) => { - Event.update( - { id: req.params.eventID }, - { $pull: { attendees: { removalPassword: req.body.removeAttendancePassword } } } - ) - .then(response => { - console.log(response) - addToLog("unattendEvent", "success", "Attendee removed self from event " + req.params.eventID); - if (sendEmails) { - if (req.body.attendeeEmail){ + Event.update( + { id: req.params.eventID }, + { $pull: { attendees: { removalPassword: req.body.removeAttendancePassword } } } + ) + .then(response => { + console.log(response) + addToLog("unattendEvent", "success", "Attendee removed self from event " + req.params.eventID); + if (sendEmails) { + if (req.body.attendeeEmail){ req.app.get('hbsInstance').renderView('./views/emails/unattendevent.handlebars', {eventID: req.params.eventID, siteName, siteLogo, domain, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: req.body.attendeeEmail, from: { name: siteName, email: contactEmail, }, - subject: `${siteName}: You have been removed from an event`, + subject: `${siteName}: You have been removed from an event`, html, }; sgMail.send(msg).catch(e => { @@ -1292,16 +1292,16 @@ router.post('/unattendevent/:eventID', (req, res) => { res.status(500).end(); }); }); - } - } - res.writeHead(302, { - 'Location': '/' + req.params.eventID - }); - res.end(); - }) - .catch((err) => { - res.send('Database error, please try again :('); addToLog("removeEventAttendee", "error", "Attempt to remove attendee from event " + req.params.eventID + " failed with error: " + err); - }); + } + } + res.writeHead(302, { + 'Location': '/' + req.params.eventID + }); + res.end(); + }) + .catch((err) => { + res.send('Database error, please try again :('); addToLog("removeEventAttendee", "error", "Attempt to remove attendee from event " + req.params.eventID + " failed with error: " + err); + }); }); // this is a one-click unattend that requires a secret URL that only the person who RSVPed over @@ -1312,22 +1312,22 @@ router.get('/oneclickunattendevent/:eventID/:attendeeID', (req, res) => { if (req.headers['user-agent'] && req.headers['user-agent'].includes('Mastodon')) { return res.sendStatus(200); } - Event.update( - { id: req.params.eventID }, - { $pull: { attendees: { _id: req.params.attendeeID } } } - ) - .then(response => { - addToLog("oneClickUnattend", "success", "Attendee removed via one click unattend " + req.params.eventID); - if (sendEmails) { + Event.update( + { id: req.params.eventID }, + { $pull: { attendees: { _id: req.params.attendeeID } } } + ) + .then(response => { + addToLog("oneClickUnattend", "success", "Attendee removed via one click unattend " + req.params.eventID); + if (sendEmails) { // currently this is never called because we don't have the email address - if (req.body.attendeeEmail){ + if (req.body.attendeeEmail){ req.app.get('hbsInstance').renderView('./views/emails/removeeventattendee.handlebars', {eventName: req.params.eventName, siteName, domain, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: req.body.attendeeEmail, from: { name: siteName, email: contactEmail, }, - subject: `${siteName}: You have been removed from an event`, + subject: `${siteName}: You have been removed from an event`, html, }; sgMail.send(msg).catch(e => { @@ -1335,36 +1335,36 @@ router.get('/oneclickunattendevent/:eventID/:attendeeID', (req, res) => { res.status(500).end(); }); }); - } - } - res.writeHead(302, { - 'Location': '/' + req.params.eventID - }); - res.end(); - }) - .catch((err) => { - res.send('Database error, please try again :('); addToLog("removeEventAttendee", "error", "Attempt to remove attendee by admin from event " + req.params.eventID + " failed with error: " + err); - }); + } + } + res.writeHead(302, { + 'Location': '/' + req.params.eventID + }); + res.end(); + }) + .catch((err) => { + res.send('Database error, please try again :('); addToLog("removeEventAttendee", "error", "Attempt to remove attendee by admin from event " + req.params.eventID + " failed with error: " + err); + }); }); router.post('/removeattendee/:eventID/:attendeeID', (req, res) => { - Event.update( - { id: req.params.eventID }, - { $pull: { attendees: { _id: req.params.attendeeID } } } - ) - .then(response => { - console.log(response) - addToLog("removeEventAttendee", "success", "Attendee removed by admin from event " + req.params.eventID); - if (sendEmails) { + Event.update( + { id: req.params.eventID }, + { $pull: { attendees: { _id: req.params.attendeeID } } } + ) + .then(response => { + console.log(response) + addToLog("removeEventAttendee", "success", "Attendee removed by admin from event " + req.params.eventID); + if (sendEmails) { // currently this is never called because we don't have the email address - if (req.body.attendeeEmail){ + if (req.body.attendeeEmail){ req.app.get('hbsInstance').renderView('./views/emails/removeeventattendee.handlebars', {eventName: req.params.eventName, siteName, siteLogo, domain, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: req.body.attendeeEmail, from: { name: siteName, email: contactEmail, }, - subject: `${siteName}: You have been removed from an event`, + subject: `${siteName}: You have been removed from an event`, html, }; sgMail.send(msg).catch(e => { @@ -1372,35 +1372,35 @@ router.post('/removeattendee/:eventID/:attendeeID', (req, res) => { res.status(500).end(); }); }); - } - } - res.writeHead(302, { - 'Location': '/' + req.params.eventID - }); - res.end(); - }) - .catch((err) => { - res.send('Database error, please try again :('); addToLog("removeEventAttendee", "error", "Attempt to remove attendee by admin from event " + req.params.eventID + " failed with error: " + err); - }); + } + } + res.writeHead(302, { + 'Location': '/' + req.params.eventID + }); + res.end(); + }) + .catch((err) => { + res.send('Database error, please try again :('); addToLog("removeEventAttendee", "error", "Attempt to remove attendee by admin from event " + req.params.eventID + " failed with error: " + err); + }); }); router.post('/post/comment/:eventID', (req, res) => { - let commentID = shortid.generate(); - const newComment = { - id: commentID, - author: req.body.commentAuthor, - content: req.body.commentContent, - timestamp: moment() - }; - - Event.findOne({ - id: req.params.eventID, - }, function(err,event) { + let commentID = shortid.generate(); + const newComment = { + id: commentID, + author: req.body.commentAuthor, + content: req.body.commentContent, + timestamp: moment() + }; + + Event.findOne({ + id: req.params.eventID, + }, function(err,event) { if (!event) return; - event.comments.push(newComment); - event.save() - .then(() => { - addToLog("addEventComment", "success", "Comment added to event " + req.params.eventID); + event.comments.push(newComment); + event.save() + .then(() => { + addToLog("addEventComment", "success", "Comment added to event " + req.params.eventID); // broadcast an identical message to all followers, will show in their home timeline // and in the home timeline of the event const guidObject = crypto.randomBytes(16).toString('hex'); @@ -1413,11 +1413,11 @@ router.post('/post/comment/:eventID', (req, res) => { "content": `<p>${req.body.commentAuthor} commented: ${req.body.commentContent}.</p><p><a href="https://${domain}/${req.params.eventID}/">See the full conversation here.</a></p>`, } ap.broadcastCreateMessage(jsonObject, event.followers, req.params.eventID) - if (sendEmails) { - Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { - let attendeeEmails = ids; - if (!error){ - console.log("Sending emails to: " + attendeeEmails); + if (sendEmails) { + Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { + let attendeeEmails = ids; + if (!error){ + console.log("Sending emails to: " + attendeeEmails); req.app.get('hbsInstance').renderView('./views/emails/addeventcomment.handlebars', {siteName, siteLogo, domain, eventID: req.params.eventID, commentAuthor: req.body.commentAuthor, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: attendeeEmails, @@ -1433,39 +1433,39 @@ router.post('/post/comment/:eventID', (req, res) => { res.status(500).end(); }); }); - } - else { - console.log("Nothing to send!"); - } - }); - } - res.writeHead(302, { - 'Location': '/' + req.params.eventID - }); - res.end(); - }) - .catch((err) => { res.send('Database error, please try again :(' + err); addToLog("addEventComment", "error", "Attempt to add comment to event " + req.params.eventID + " failed with error: " + err); }); - }); + } + else { + console.log("Nothing to send!"); + } + }); + } + res.writeHead(302, { + 'Location': '/' + req.params.eventID + }); + res.end(); + }) + .catch((err) => { res.send('Database error, please try again :(' + err); addToLog("addEventComment", "error", "Attempt to add comment to event " + req.params.eventID + " failed with error: " + err); }); + }); }); router.post('/post/reply/:eventID/:commentID', (req, res) => { - let replyID = shortid.generate(); - let commentID = req.params.commentID; - const newReply = { - id: replyID, - author: req.body.replyAuthor, - content: req.body.replyContent, - timestamp: moment() - }; - Event.findOne({ - id: req.params.eventID, - }, function(err,event) { + let replyID = shortid.generate(); + let commentID = req.params.commentID; + const newReply = { + id: replyID, + author: req.body.replyAuthor, + content: req.body.replyContent, + timestamp: moment() + }; + Event.findOne({ + id: req.params.eventID, + }, function(err,event) { if (!event) return; - var parentComment = event.comments.id(commentID); - parentComment.replies.push(newReply); - event.save() - .then(() => { - addToLog("addEventReply", "success", "Reply added to comment " + commentID + " in event " + req.params.eventID); + var parentComment = event.comments.id(commentID); + parentComment.replies.push(newReply); + event.save() + .then(() => { + addToLog("addEventReply", "success", "Reply added to comment " + commentID + " in event " + req.params.eventID); // broadcast an identical message to all followers, will show in their home timeline const guidObject = crypto.randomBytes(16).toString('hex'); const jsonObject = { @@ -1477,11 +1477,11 @@ router.post('/post/reply/:eventID/:commentID', (req, res) => { "content": `<p>${req.body.replyAuthor} commented: ${req.body.replyContent}</p><p><a href="https://${domain}/${req.params.eventID}/">See the full conversation here.</a></p>`, } ap.broadcastCreateMessage(jsonObject, event.followers, req.params.eventID) - if (sendEmails) { - Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { - let attendeeEmails = ids; - if (!error){ - console.log("Sending emails to: " + attendeeEmails); + if (sendEmails) { + Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) { + let attendeeEmails = ids; + if (!error){ + console.log("Sending emails to: " + attendeeEmails); req.app.get('hbsInstance').renderView('./views/emails/addeventcomment.handlebars', {siteName, siteLogo, domain, eventID: req.params.eventID, commentAuthor: req.body.replyAuthor, cache: true, layout: 'email.handlebars'}, function(err, html) { const msg = { to: attendeeEmails, @@ -1497,47 +1497,47 @@ router.post('/post/reply/:eventID/:commentID', (req, res) => { res.status(500).end(); }); }); - } - else { - console.log("Nothing to send!"); - } - }); - } - res.writeHead(302, { - 'Location': '/' + req.params.eventID - }); - res.end(); - }) - .catch((err) => { res.send('Database error, please try again :('); addToLog("addEventReply", "error", "Attempt to add reply to comment " + commentID + " in event " + req.params.eventID + " failed with error: " + err); }); - }); + } + else { + console.log("Nothing to send!"); + } + }); + } + res.writeHead(302, { + 'Location': '/' + req.params.eventID + }); + res.end(); + }) + .catch((err) => { res.send('Database error, please try again :('); addToLog("addEventReply", "error", "Attempt to add reply to comment " + commentID + " in event " + req.params.eventID + " failed with error: " + err); }); + }); }); router.post('/deletecomment/:eventID/:commentID/:editToken', (req, res) => { - let submittedEditToken = req.params.editToken; - Event.findOne(({ - id: req.params.eventID, - })) - .then((event) => { - if (event.editToken === submittedEditToken) { - // Token matches - event.comments.id(req.params.commentID).remove(); - event.save() - .then(() => { - addToLog("deleteComment", "success", "Comment deleted from event " + req.params.eventID); - res.writeHead(302, { - 'Location': '/' + req.params.eventID + '?e=' + req.params.editToken - }); - res.end(); - }) - .catch((err) => { res.send('Sorry! Something went wrong (error deleting): ' + err); addToLog("deleteComment", "error", "Attempt to delete comment " + req.params.commentID + "from event " + req.params.eventID + " failed with error: " + err);}); - } - else { - // Token doesn't match - res.send('Sorry! Something went wrong'); - addToLog("deleteComment", "error", "Attempt to delete comment " + req.params.commentID + "from event " + req.params.eventID + " failed with error: token does not match"); - } - }) - .catch((err) => { res.send('Sorry! Something went wrong: ' + err); addToLog("deleteComment", "error", "Attempt to delete comment " + req.params.commentID + "from event " + req.params.eventID + " failed with error: " + err);}); + let submittedEditToken = req.params.editToken; + Event.findOne(({ + id: req.params.eventID, + })) + .then((event) => { + if (event.editToken === submittedEditToken) { + // Token matches + event.comments.id(req.params.commentID).remove(); + event.save() + .then(() => { + addToLog("deleteComment", "success", "Comment deleted from event " + req.params.eventID); + res.writeHead(302, { + 'Location': '/' + req.params.eventID + '?e=' + req.params.editToken + }); + res.end(); + }) + .catch((err) => { res.send('Sorry! Something went wrong (error deleting): ' + err); addToLog("deleteComment", "error", "Attempt to delete comment " + req.params.commentID + "from event " + req.params.eventID + " failed with error: " + err);}); + } + else { + // Token doesn't match + res.send('Sorry! Something went wrong'); + addToLog("deleteComment", "error", "Attempt to delete comment " + req.params.commentID + "from event " + req.params.eventID + " failed with error: token does not match"); + } + }) + .catch((err) => { res.send('Sorry! Something went wrong: ' + err); addToLog("deleteComment", "error", "Attempt to delete comment " + req.params.commentID + "from event " + req.params.eventID + " failed with error: " + err);}); }); router.post('/activitypub/inbox', (req, res) => { @@ -1602,9 +1602,9 @@ router.post('/activitypub/inbox', (req, res) => { }); router.use(function(req, res, next){ - res.status(404); - res.render('404', { url: req.url }); - return; + res.status(404); + res.render('404', { url: req.url }); + return; }); addToLog("startup", "success", "Started up successfully"); |