summaryrefslogtreecommitdiff
path: root/routes.js
diff options
context:
space:
mode:
authorlowercasename <raphaelkabo@gmail.com>2019-08-03 15:11:37 +0100
committerlowercasename <raphaelkabo@gmail.com>2019-08-03 15:11:37 +0100
commit117285874c3380f1d17a7976e8aa7c532b7ae14e (patch)
treee8781e9b64c754ee0ca92e97e7ee64f3c157a125 /routes.js
parentda3ecf3e5f67a51c989a0d0319051047ce57f581 (diff)
parentc20e4eec5566b677b063a69b6bb2e01ca82f9e76 (diff)
Merge branch 'master' of https://github.com/lowercasename/gathio
Diffstat (limited to 'routes.js')
-rwxr-xr-xroutes.js138
1 files changed, 120 insertions, 18 deletions
diff --git a/routes.js b/routes.js
index 0bc08e5..7581b4d 100755
--- a/routes.js
+++ b/routes.js
@@ -15,7 +15,7 @@ const router = express.Router();
const Event = mongoose.model('Event');
const Log = mongoose.model('Log');
-var moment = require('moment');
+var moment = require('moment-timezone');
const marked = require('marked');
@@ -52,8 +52,8 @@ function addToLog(process, status, message) {
const schedule = require('node-schedule');
const deleteOldEvents = schedule.scheduleJob('59 23 * * *', function(fireDate){
- const too_old = moment().subtract(7, 'days').toDate();
- console.log(too_old);
+ 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 => {
@@ -139,20 +139,26 @@ router.get('/:eventID', (req, res) => {
.then((event) => {
if (event) {
parsedLocation = event.location.replace(/\s+/g, '+');
- if (moment(event.end).isSame(event.start, 'day')){
+ if (moment.tz(event.end, event.timezone).isSame(event.start, 'day')){
// Happening during one day
- displayDate = moment(event.start).format('dddd D MMMM YYYY [<span class="text-muted">from</span>] h:mm a') + moment(event.end).format(' [<span class="text-muted">to</span>] h:mm a');
+ 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(event.start).format('dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a') + moment(event.end).format(' [<span class="text-muted">–</span>] dddd D MMMM YYYY [<span class="text-muted">at</span>] h:mm a');
+ 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>]');
}
- parsedStart = moment(event.start).format('YYYYMMDD[T]HHmmss');
- parsedEnd = moment(event.end).format('YYYYMMDD[T]HHmmss');
+ eventStartISO = moment.tz(event.start, "Etc/UTC").toISOString();
+ eventEndISO = moment.tz(event.end, "Etc/UTC").toISOString();
+ parsedStart = moment.tz(event.start, event.timezone).format('YYYYMMDD[T]HHmmss');
+ parsedEnd = moment.tz(event.end, event.timezone).format('YYYYMMDD[T]HHmmss');
let eventHasConcluded = false;
- if (moment(event.end).isBefore(moment())){
+ if (moment.tz(event.end, event.timezone).isBefore(moment.tz(event.timezone))){
eventHasConcluded = true;
}
- fromNow = moment(event.start).fromNow();
+ let eventHasBegun = false;
+ if (moment.tz(event.start, event.timezone).isBefore(moment.tz(event.timezone))){
+ eventHasBegun = true;
+ }
+ fromNow = moment.tz(event.start, event.timezone).fromNow();
parsedDescription = marked(event.description);
eventEditToken = event.editToken;
@@ -197,7 +203,26 @@ router.get('/:eventID', (req, res) => {
}
}
res.set("X-Robots-Tag", "noindex");
- res.render('event', {title: event.name, escapedName: escapedName, eventData: event, parsedLocation: parsedLocation, parsedStart: parsedStart, parsedEnd: parsedEnd, displayDate: displayDate, fromNow: fromNow, parsedDescription: parsedDescription, editingEnabled: editingEnabled, eventHasCoverImage: eventHasCoverImage, eventHasHost: eventHasHost, firstLoad: firstLoad, eventHasConcluded: eventHasConcluded })
+ res.render('event', {
+ title: event.name,
+ escapedName: escapedName,
+ eventData: event,
+ eventStartISO: eventStartISO,
+ eventEndISO: eventEndISO,
+ parsedLocation: parsedLocation,
+ parsedStart: parsedStart,
+ parsedEnd: parsedEnd,
+ displayDate: displayDate,
+ fromNow: fromNow,
+ timezone: event.timezone,
+ parsedDescription: parsedDescription,
+ editingEnabled: editingEnabled,
+ eventHasCoverImage: eventHasCoverImage,
+ eventHasHost: eventHasHost,
+ firstLoad: firstLoad,
+ eventHasConcluded: eventHasConcluded,
+ eventHasBegun: eventHasBegun
+ })
}
else {
res.status(404);
@@ -233,18 +258,21 @@ router.post('/newevent', (req, res) => {
if (err) addToLog("Jimp", "error", "Attempt to edit image failed with error: " + err);
img
.resize(920, Jimp.AUTO) // resize
- .quality(60) // set JPEG quality
+ .quality(80) // set JPEG quality
.write('./public/events/' + eventID + '.jpg'); // save
});
eventImageFilename = eventID + '.jpg';
}
+ startUTC = moment.tz(req.body.eventStart, 'D MMMM YYYY, hh:mm a', req.body.timezone);
+ endUTC = moment.tz(req.body.eventEnd, 'D MMMM YYYY, hh:mm a', req.body.timezone);
const event = new Event({
id: eventID,
type: req.body.eventType,
name: req.body.eventName,
location: req.body.eventLocation,
- start: req.body.eventStart,
- end: req.body.eventEnd,
+ start: startUTC,
+ end: endUTC,
+ timezone: req.body.timezone,
description: req.body.eventDescription,
image: eventImageFilename,
creatorEmail: req.body.creatorEmail,
@@ -305,6 +333,7 @@ router.post('/importevent', (req, res) => {
location: importedEventData.location,
start: importedEventData.start,
end: importedEventData.end,
+ timezone: importedEventData.start.tz,
description: importedEventData.description,
image: '',
creatorEmail: creatorEmail,
@@ -372,16 +401,19 @@ router.post('/editevent/:eventID/:editToken', (req, res) => {
if (err) throw err;
img
.resize(920, Jimp.AUTO) // resize
- .quality(60) // set JPEG quality
+ .quality(80) // set JPEG
.write('./public/events/' + eventID + '.jpg'); // save
});
eventImageFilename = eventID + '.jpg';
}
+ startUTC = moment.tz(req.body.eventStart, 'D MMMM YYYY, hh:mm a', req.body.timezone);
+ endUTC = moment.tz(req.body.eventEnd, 'D MMMM YYYY, hh:mm a', req.body.timezone);
const updatedEvent = {
name: req.body.eventName,
location: req.body.eventLocation,
- start: req.body.eventStart,
- end: req.body.eventEnd,
+ start: startUTC,
+ end: endUTC,
+ timezone: req.body.timezone,
description: req.body.eventDescription,
url: req.body.eventURL,
hostName: req.body.hostName,
@@ -556,6 +588,76 @@ router.post('/attendevent/:eventID', (req, res) => {
});
});
+router.post('/unattendevent/:eventID', (req, res) => {
+ Event.update(
+ { id: req.params.eventID },
+ { $pull: { attendees: { email: req.body.attendeeEmail } } }
+ )
+ .then(response => {
+ console.log(response)
+ addToLog("removeEventAttendee", "success", "Attendee removed from event " + req.params.eventID);
+ if (sendEmails) {
+ if (req.body.attendeeEmail){
+ const msg = {
+ to: req.body.attendeeEmail,
+ from: {
+ name: 'Gathio',
+ email: 'notifications@gath.io',
+ },
+ templateId: 'd-56c97755d6394c23be212fef934b0f1f',
+ dynamic_template_data: {
+ subject: 'gathio: You have been removed from an event',
+ eventID: req.params.eventID
+ },
+ };
+ sgMail.send(msg);
+ }
+ }
+ 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);
+ });
+});
+
+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) {
+ if (req.body.attendeeEmail){
+ const msg = {
+ to: req.body.attendeeEmail,
+ from: {
+ name: 'Gathio',
+ email: 'notifications@gath.io',
+ },
+ templateId: 'd-f8ee9e1e2c8a48e3a329d1630d0d371f',
+ dynamic_template_data: {
+ subject: 'gathio: You have been removed from an event',
+ eventID: req.params.eventID
+ },
+ };
+ sgMail.send(msg);
+ }
+ }
+ 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 = {
@@ -623,7 +725,7 @@ router.post('/post/reply/:eventID/:commentID', (req, res) => {
event.save()
.then(() => {
addToLog("addEventReply", "success", "Reply added to comment " + commentID + " in event " + req.params.eventID);
- if (sendEmails) {
+ if (sendEmails) {
Event.findOne({id: req.params.eventID}).distinct('attendees.email', function(error, ids) {
attendeeEmails = ids;
if (!error){