Pārlūkot izejas kodu

Add event scheduling, essentially preparing for push notifications

Matt Coles 9 gadi atpakaļ
vecāks
revīzija
f5c5ca9b26

+ 3 - 0
index.js

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

+ 3 - 1
presenters/event-controller.js

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

+ 16 - 0
presenters/notification-controller.js

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

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

+ 0 - 1
presenters/user-controller.js

41
   },
41
   },
42
 
42
 
43
   get_raw_user: function (user, complete) {
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
     var user_key = "user:" + user;
44
     var user_key = "user:" + user;
46
 
45
 
47
     redis.hgetall(user_key, function(err, result) {
46
     redis.hgetall(user_key, function(err, result) {