Browse Source

Add event scheduling, essentially preparing for push notifications

Matt Coles 9 years ago
parent
commit
f5c5ca9b26

+ 3 - 0
index.js

@@ -3,6 +3,7 @@ var serveIndex = require('serve-index');
3 3
 var https = require('https');
4 4
 var app = express();
5 5
 var route_manager = require("./utils/route-manager.js");
6
+var scheduler = require("./presenters/schedule-controller.js");
6 7
 var bodyParser = require('body-parser');
7 8
 var FileStreamRotator = require('file-stream-rotator');
8 9
 var morgan = require('morgan');
@@ -10,6 +11,8 @@ var fs = require('fs');
10 11
 var logDirectory = 'log'
11 12
 var production = process.argv[2];
12 13
 
14
+scheduler.register_existing_events();
15
+
13 16
 // ensure log directory exists
14 17
 fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory)
15 18
 

+ 3 - 1
presenters/event-controller.js

@@ -3,6 +3,7 @@ var redis = new Redis();
3 3
 var permissions_controller = require("./permissions-controller.js");
4 4
 var user_controller = require("./user-controller.js");
5 5
 var society_controller = require("./society-controller.js");
6
+var scheduler = require("./schedule-controller.js");
6 7
 
7 8
 module.exports = {
8 9
   create_event: function (soc_name, event, auth, complete) {
@@ -27,6 +28,7 @@ module.exports = {
27 28
               redis.hget(soc_query, "events", function (err, events) {
28 29
                 redis.hset(soc_query, "events", JSON.stringify(JSON.parse(events).concat(event_id)));
29 30
               });
31
+              scheduler.schedule_event(event_id, event.start);
30 32
               complete({
31 33
                 "success": 1,
32 34
                 "event": {
@@ -71,7 +73,6 @@ module.exports = {
71 73
               var soc_events = soc_resp.society.events;
72 74
               var completed_count = 1;
73 75
               if (soc_events.indexOf(event_id) > -1) {
74
-                console.log(soc_events.indexOf(event_id));
75 76
                 soc_events.splice(soc_events.indexOf(event_id), 1);
76 77
                 redis.hset("society:" + soc_resp.society.name.toLowerCase(), "events", JSON.stringify(soc_events));
77 78
               }
@@ -98,6 +99,7 @@ module.exports = {
98 99
                   }
99 100
                   completed_count++;
100 101
                   if (completed_count === users.length) {
102
+                    scheduler.cancel_registered(event_id);
101 103
                     complete({
102 104
                       "success": 1,
103 105
                       "error": 0

+ 16 - 0
presenters/notification-controller.js

@@ -0,0 +1,16 @@
1
+module.exports = {
2
+
3
+  send_notifications_for: function (event_id) {
4
+    var event_controller = require("./event-controller.js");
5
+    event_controller.get_event(event_id, "", function (response) {
6
+      var attendees = response.event.attendees;
7
+      console.log("Triggered Event: " + response.event.name);
8
+      console.dir(attendees);
9
+      attendees.map(function (attendee) {
10
+        console.log((new Date(Date.now())).toString() + " : Sending push notification to " + attendee + " for event starting at " + (new Date(Number(response.event.start)).toString()));
11
+      });
12
+      event_controller.cancel_event(event_id, "", function(){}, true);
13
+    }, true);
14
+  }
15
+
16
+}

+ 48 - 0
presenters/schedule-controller.js

@@ -0,0 +1,48 @@
1
+var Redis = require("ioredis");
2
+var redis = new Redis();
3
+var scheduler = require("node-schedule");
4
+var notification_controller = require("./notification-controller.js");
5
+var registered_events = {};
6
+
7
+module.exports = {
8
+
9
+  schedule_event: function (event_id, time) {
10
+    var event_time = new Date(Number(time));
11
+    console.log("Scheduled event for " + event_time);
12
+    var job = scheduler.scheduleJob(event_time, function(evt_id) {
13
+      notification_controller.send_notifications_for(evt_id);
14
+    }.bind(null, event_id));
15
+    registered_events[event_id] = job;
16
+  },
17
+
18
+  register_existing_events: function () {
19
+    var self = this;
20
+    var stream = redis.scanStream({
21
+      match: "event:*"
22
+    });
23
+    var event_ids = [];
24
+    stream.on('data', function (keys) {
25
+      keys.map(function (key) {
26
+        event_ids.push(key);
27
+      });
28
+    })
29
+    stream.on('end', function () {
30
+      var event_controller = require("./event-controller.js");
31
+      for (var ii = 0; ii < event_ids.length; ii++) {
32
+        event_controller.get_event(event_ids[ii], "", function (response) {
33
+          var event = response.event;
34
+          self.schedule_event(event.id, event.start);
35
+        }, true);
36
+      }
37
+    });
38
+  },
39
+
40
+  cancel_registered: function (event_id) {
41
+    var event = registered_events[event_id];
42
+    if (event !== undefined) {
43
+      event.cancel();
44
+      delete registered_events.event_id;
45
+    }
46
+  }
47
+
48
+}

+ 2 - 3
presenters/society-controller.js

@@ -28,7 +28,6 @@ module.exports = {
28 28
     var soc_query = ("society:" + society_name).toLowerCase();
29 29
     admins = decodeURIComponent(admins).toLowerCase();
30 30
     description = decodeURIComponent(description);
31
-    var admins_str = admins;
32 31
     admins = JSON.parse(admins);
33 32
 
34 33
     redis.hget(soc_query, "name", function (err, result) {
@@ -51,9 +50,9 @@ module.exports = {
51 50
                 }
52 51
                 if (idx === adm.length-1 && users_exist) {
53 52
                   redis.hset(soc_query, "name", society_name);
54
-                  redis.hset(soc_query, "admins", admins_str);
53
+                  redis.hset(soc_query, "admins", JSON.stringify(admins));
55 54
                   redis.hset(soc_query, "description", description);
56
-                  redis.hset(soc_query, "users", admins_str);
55
+                  redis.hset(soc_query, "users", JSON.stringify(admins));
57 56
                   redis.hset(soc_query, "events", JSON.stringify([]));
58 57
                   redis.hset(soc_query, "image", image);
59 58
                   admins.map(function (admin_name) {

+ 0 - 1
presenters/user-controller.js

@@ -41,7 +41,6 @@ module.exports = {
41 41
   },
42 42
 
43 43
   get_raw_user: function (user, complete) {
44
-    console.warn("WARNING: Accessing raw user info, use with care and do not expose to API endpoints.");
45 44
     var user_key = "user:" + user;
46 45
 
47 46
     redis.hgetall(user_key, function(err, result) {