瀏覽代碼

Add events

Matt Coles 9 年之前
父節點
當前提交
2b6405c9d8

+ 67 - 0
README.md

@@ -11,15 +11,24 @@ Server for Integrated Project, powered by Express.js and Redis, listens only on
11 11
     * [Running](#running)
12 12
 * [API](#api)
13 13
     * [/hello/:name/](#helloname)
14
+
14 15
     * [/user/register/](#userregister)
15 16
     * [/user/auth/](#userauth)
16 17
     * [/user/view/](#userview)
17 18
     * [/user/view/:user](#userviewuser)
19
+
18 20
     * [/society/create/](#societycreate)
19 21
     * [/society/view/](#societyview)
20 22
     * [/society/view/:society\_name](#societyviewsociety_name)
23
+    * [/society/view/:society\_name/events](#societyviewsociety_nameevents)
21 24
     * [/society/join/](#societyjoin)
22 25
 
26
+    * [/events/create/](#eventscreate)
27
+    * [/events/view/:eventid](#eventsvieweventid)
28
+    * [/events/pending/](#eventspending)
29
+    * [/events/accept/:eventid](#eventsaccepteventid)
30
+    * [/events/decline/:eventid](#eventsdeclineeventid)
31
+
23 32
 ### Installation
24 33
 Instructions are for OSX El Capitan at time of writing.
25 34
 
@@ -222,6 +231,47 @@ no data. The response will then be formed as follows:
222 231
 ```
223 232
 The error codes are as follows, `1` indicates that the society does not exist.
224 233
 
234
+### /society/view/:society\_name/events
235
+To view all the events for a society, :society\_name, a `GET` request should be
236
+sent with the following data:
237
+```javascript
238
+{
239
+  "auth": "$2a$10$ruuu6QfYLjW1QKOwONVvkelXuh8EVFyug/kJvfaTNL0aXNGyODZ9K"
240
+}
241
+```
242
+Then the server will respond like this:
243
+```javascript
244
+{
245
+  "events": [
246
+    {
247
+      "name": "Super Mario Kart Party",
248
+      "location": "Marioland",
249
+      "society": "TestSociety",
250
+      "start": "14605026110490",
251
+      "end": "14605026110500",
252
+      "details": "Play some Mario Kart with us",
253
+      "organiser": "test1"
254
+    },
255
+    {
256
+      "name": "Super Mario Kart Party 2",
257
+      "location": "Marioland",
258
+      "society": "TestSociety",
259
+      "start": "14605026110490",
260
+      "end": "14605026110500",
261
+      "details": "Play some Mario Kart with us",
262
+      "organiser": "test1"
263
+    },
264
+    { ... },
265
+    { ... },
266
+    { ... },
267
+    { ... }
268
+  ],
269
+  "error": 0
270
+}
271
+```
272
+The error codes are as follows, `1` indicates an invalid authentication key and
273
+`2` indicates a malformed request.
274
+
225 275
 ### /society/join/
226 276
 To join a society, a `POST` request should be sent with the following data:
227 277
 ```javascript
@@ -239,3 +289,20 @@ The response is then formed as follows:
239 289
 ```
240 290
 The error codes are as follows, `1` indicates that the user is already a member
241 291
 of that society and `2` indicates a malformed request.
292
+
293
+### /events/create/
294
+To create a new event, a `POST` request... its 4:30am and im shit tired of
295
+writing documentation, essentially just give it an auth key for all the following
296
+requests and you'll be golden, you can check what shit gets returned for yourself
297
+until I get a chance to write this up
298
+
299
+### /events/view/:eventid
300
+
301
+
302
+### /events/pending/
303
+
304
+
305
+### /events/accept/:eventid
306
+
307
+
308
+### /events/decline/:eventid

+ 250 - 0
presenters/event-controller.js

@@ -0,0 +1,250 @@
1
+var Redis = require("ioredis");
2
+var redis = new Redis();
3
+var permissions_controller = require("./permissions-controller.js");
4
+var user_controller = require("./user-controller.js");
5
+var society_controller = require("./society-controller.js");
6
+
7
+module.exports = {
8
+  create_event: function (soc_name, event, auth, complete) {
9
+    var self = this;
10
+    permissions_controller.user_can_manage_soc_events(auth, soc_name, function (manageable) {
11
+      if (manageable) {
12
+        user_controller.get_user_from_auth(auth, function(organiser) {
13
+          if (event.end > event.start && event.start > Date.now()) {
14
+            self.get_random_event_id(function(event_id) {
15
+              event_query = "event:" + event_id;
16
+              soc_query = "society:" + soc_name.toLowerCase();
17
+              self.invite_all(soc_name, event_id);
18
+              redis.hset(event_query, "name", event.name);
19
+              redis.hset(event_query, "location", event.location);
20
+              redis.hset(event_query, "society", soc_name);
21
+              redis.hset(event_query, "start", event.start);
22
+              redis.hset(event_query, "end", event.end);
23
+              redis.hset(event_query, "details", event.details);
24
+              redis.hset(event_query, "organiser", organiser);
25
+              redis.hset(event_query, "id", event_id);
26
+              redis.hget(soc_query, "events", function (err, events) {
27
+                redis.hset(soc_query, "events", JSON.stringify(JSON.parse(events).concat(event_id)));
28
+              });
29
+              complete({
30
+                "success": 1,
31
+                "event": {
32
+                  "id": event_id,
33
+                  "name": event.name,
34
+                  "organiser": organiser,
35
+                  "location": event.location,
36
+                  "society": soc_name,
37
+                  "start": event.start,
38
+                  "end": event.end,
39
+                  "details": event.details
40
+                },
41
+                "error": 0
42
+              })
43
+            });
44
+          } else {
45
+            complete({
46
+              "success": 0,
47
+              "error": 2
48
+            })
49
+          }
50
+        });
51
+      } else {
52
+        complete({
53
+          "success": 0,
54
+          "error": 1
55
+        });
56
+      }
57
+    });
58
+  },
59
+
60
+  invite_all: function (soc_name, event_id) {
61
+    society_controller.get_society(soc_name, function (response) {
62
+      response.society.users.map(function (user) {
63
+        user_controller.get_raw_user(user, function (userdata) {
64
+          redis.hset("user:" + user, "pending_events", JSON.stringify(JSON.parse(userdata.pending_events).concat(event_id)));
65
+        });
66
+      });
67
+    });
68
+  },
69
+
70
+  get_event: function (event_id, auth, complete, preauth) {
71
+    redis.hgetall("event:" + event_id, function (err, event) {
72
+      if (preauth) {
73
+        complete({
74
+          "event": event,
75
+          "error": 0
76
+        });
77
+        return;
78
+      }
79
+      permissions_controller.user_is_in_society(auth, event.society, function (canview) {
80
+        if (canview) {
81
+          complete({
82
+            "event": event,
83
+            "error": 0
84
+          });
85
+        } else {
86
+          complete({
87
+            "event": {},
88
+            "error": 1
89
+          });
90
+        }
91
+      });
92
+    });
93
+  },
94
+
95
+  get_all_soc_events: function (soc_name, auth, complete) {
96
+    var self = this;
97
+    permissions_controller.user_is_in_society(auth, soc_name, function (canview) {
98
+      if (canview) {
99
+        society_controller.get_society(soc_name, function (response) {
100
+          var events = response.society.events;
101
+          var event_objs = [];
102
+          for (var ii = 0; ii < events.length; ii++) {
103
+            self.get_event(events[ii], "", function(response) {
104
+              event_objs.push(response.event);
105
+              if (event_objs.length === events.length) {
106
+                complete({
107
+                  "events": event_objs,
108
+                  "error": 0
109
+                });
110
+              }
111
+            }, true);
112
+          }
113
+        });
114
+      } else {
115
+        complete({
116
+          "events": [],
117
+          "error": 1
118
+        })
119
+      }
120
+    });
121
+  },
122
+
123
+  get_random_event_id: function (complete) {
124
+    var tmp_id = Math.floor(Math.random() * (1000000000-1)+1);
125
+    this.event_exists(tmp_id, function (exists) {
126
+      if (exists) {
127
+        get_random_event_id(complete);
128
+      } else {
129
+        complete(String(tmp_id));
130
+      }
131
+    });
132
+  },
133
+
134
+  event_exists: function (event_id, complete) {
135
+    redis.hget("event:" + event_id, "name", function (err, result) {
136
+      complete(!!result);
137
+    });
138
+  },
139
+
140
+  accept_event: function (event_id, auth, complete) {
141
+    user_controller.get_user_from_auth(auth, function (username) {
142
+      if (username) {
143
+        user_controller.get_raw_user(username, function (userdata) {
144
+          var pending_events = JSON.parse(userdata.pending_events);
145
+          var declined_events = JSON.parse(userdata.declined_events);
146
+          var accepted_events = JSON.parse(userdata.accepted_events);
147
+          if (pending_events.indexOf(event_id) > -1) {
148
+            pending_events.splice(pending_events.indexOf(event_id), 1);
149
+            accepted_events.push(event_id);
150
+            redis.hset("user:" + username, "pending_events", JSON.stringify(pending_events));
151
+            redis.hset("user:" + username, "accepted_events", JSON.stringify(accepted_events));
152
+            complete({
153
+              "success": 1,
154
+              "error": 0
155
+            });
156
+          } else if (declined_events.indexOf(event_id) > -1) {
157
+            declined_events.splice(declined_events.indexOf(event_id), 1);
158
+            accepted_events.push(event_id);
159
+            redis.hset("user:" + username, "declined_events", JSON.stringify(declined_events));
160
+            redis.hset("user:" + username, "accepted_events", JSON.stringify(accepted_events));
161
+            complete({
162
+              "success": 1,
163
+              "error": 0
164
+            });
165
+          } else {
166
+            complete({
167
+              "success": 0,
168
+              "error": 2
169
+            });
170
+          }
171
+        });
172
+      } else {
173
+        complete({
174
+          "success": 0,
175
+          "error": 1
176
+        });
177
+      }
178
+    });
179
+  },
180
+
181
+  decline_event: function (event_id, auth, complete) {
182
+    user_controller.get_user_from_auth(auth, function (username) {
183
+      if (username) {
184
+        user_controller.get_raw_user(username, function (userdata) {
185
+          var pending_events = JSON.parse(userdata.pending_events);
186
+          var declined_events = JSON.parse(userdata.declined_events);
187
+          var accepted_events = JSON.parse(userdata.accepted_events);
188
+          if (pending_events.indexOf(event_id) > -1) {
189
+            pending_events.splice(pending_events.indexOf(event_id), 1);
190
+            declined_events.push(event_id);
191
+            redis.hset("user:" + username, "pending_events", JSON.stringify(pending_events));
192
+            redis.hset("user:" + username, "declined_events", JSON.stringify(declined_events));
193
+            complete({
194
+              "success": 1,
195
+              "error": 0
196
+            });
197
+          } else if (accepted_events.indexOf(event_id) > -1) {
198
+            accepted_events.splice(accepted_events.indexOf(event_id), 1);
199
+            declined_events.push(event_id);
200
+            redis.hset("user:" + username, "accepted_events", JSON.stringify(accepted_events));
201
+            redis.hset("user:" + username, "declined_events", JSON.stringify(declined_events));
202
+            complete({
203
+              "success": 1,
204
+              "error": 0
205
+            });
206
+          } else {
207
+            complete({
208
+              "success": 0,
209
+              "error": 2
210
+            });
211
+          }
212
+        });
213
+      } else {
214
+        complete({
215
+          "success": 0,
216
+          "error": 1
217
+        });
218
+      }
219
+    });
220
+  },
221
+
222
+  get_all_pending_events: function (auth, complete) {
223
+    var self = this;
224
+    user_controller.get_user_from_auth(auth, function (username) {
225
+      if (username) {
226
+        user_controller.get_raw_user(username, function (userdata) {
227
+          var pending_events = JSON.parse(userdata.pending_events);
228
+          var pending_events_objs = [];
229
+          pending_events.map(function (event_id) {
230
+            self.get_event(event_id, "", function (response) {
231
+              response.event.id = event_id;
232
+              pending_events_objs.push(response.event);
233
+              if (pending_events_objs.length === pending_events.length) {
234
+                complete({
235
+                  "pending_events": pending_events_objs,
236
+                  "error": 0
237
+                });
238
+              }
239
+            }, true);
240
+          })
241
+        });
242
+      } else {
243
+        complete({
244
+          "pending_events": [],
245
+          "error": 1
246
+        });
247
+      }
248
+    });
249
+  }
250
+}

+ 10 - 0
presenters/user-controller.js

@@ -26,6 +26,7 @@ module.exports = {
26 26
         public.societies = JSON.parse(result.societies) || [];
27 27
         public.friends = JSON.parse(result.friends) || [];
28 28
         public.accepted_events = JSON.parse(result.accepted_events) || [];
29
+        public.declined_events = JSON.parse(result.declined_events) || [];
29 30
         complete({
30 31
           "user": public,
31 32
           "error": 0
@@ -39,6 +40,15 @@ module.exports = {
39 40
     });
40 41
   },
41 42
 
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;
46
+
47
+    redis.hgetall(user_key, function(err, result) {
48
+      complete(result);
49
+    });
50
+  },
51
+
42 52
   get_all_public_infos: function (complete) {
43 53
     var self = this;
44 54
     var stream = redis.scanStream({

+ 23 - 0
routes/events/accept-event.js

@@ -0,0 +1,23 @@
1
+var event_controller = require("./../../presenters/event-controller.js");
2
+
3
+module.exports = {
4
+  perform: function (a,b) {
5
+    perform(a,b);
6
+  }
7
+}
8
+
9
+var perform = function (req, res) {
10
+  var event_id = req.params.eventid;
11
+  var auth = req.body.auth || req.query.auth;
12
+
13
+  if (event_id && auth) {
14
+    event_controller.accept_event(event_id, auth, function (response) {
15
+      res.send(response);
16
+    });
17
+  } else {
18
+    res.send({
19
+      "success": 0,
20
+      "error": 3
21
+    });
22
+  }
23
+};

+ 35 - 0
routes/events/create-society-event.js

@@ -0,0 +1,35 @@
1
+var event_controller = require("./../../presenters/event-controller.js");
2
+
3
+module.exports = {
4
+  perform: function (a,b) {
5
+    perform(a,b);
6
+  }
7
+}
8
+
9
+var perform = function (req, res) {
10
+  var soc_name = decodeURIComponent(req.body.society || req.query.society);
11
+  var event_name = decodeURIComponent(req.body.name || req.query.name);
12
+  var event_loc = decodeURIComponent(req.body.location || req.query.location);
13
+  var event_start = decodeURIComponent(req.body.start || req.query.start);
14
+  var event_end = decodeURIComponent(req.body.end || req.query.end);
15
+  var event_details = decodeURIComponent(req.body.details || req.query.details);
16
+  var auth_key = decodeURIComponent(req.body.auth || req.query.auth);
17
+
18
+  if (soc_name && event_name && event_loc && event_start && event_end && event_details && auth_key) {
19
+    var event = {
20
+      name: event_name,
21
+      location: event_loc,
22
+      start: event_start,
23
+      end: event_end,
24
+      details: event_details
25
+    };
26
+    event_controller.create_event(soc_name, event, auth_key, function (response) {
27
+      res.send(response);
28
+    });
29
+  } else {
30
+    res.send({
31
+      "success": 0,
32
+      "error": 3
33
+    });
34
+  }
35
+};

+ 23 - 0
routes/events/decline-event.js

@@ -0,0 +1,23 @@
1
+var event_controller = require("./../../presenters/event-controller.js");
2
+
3
+module.exports = {
4
+  perform: function (a,b) {
5
+    perform(a,b);
6
+  }
7
+}
8
+
9
+var perform = function (req, res) {
10
+  var event_id = req.params.eventid;
11
+  var auth = req.body.auth || req.query.auth;
12
+
13
+  if (event_id && auth) {
14
+    event_controller.decline_event(event_id, auth, function (response) {
15
+      res.send(response);
16
+    });
17
+  } else {
18
+    res.send({
19
+      "success": 0,
20
+      "error": 3
21
+    });
22
+  }
23
+};

+ 23 - 0
routes/events/view-all-society-events.js

@@ -0,0 +1,23 @@
1
+var event_controller = require("./../../presenters/event-controller.js");
2
+
3
+module.exports = {
4
+  perform: function (a,b) {
5
+    perform(a,b);
6
+  }
7
+}
8
+
9
+var perform = function (req, res) {
10
+  var soc_name = req.params.societyid;
11
+  var auth = req.body.auth || req.query.auth;
12
+
13
+  if (soc_name && auth) {
14
+    event_controller.get_all_soc_events(soc_name, auth, function (response) {
15
+      res.send(response);
16
+    });
17
+  } else {
18
+    res.send({
19
+      "events": [],
20
+      "error": 2
21
+    })
22
+  }
23
+};

+ 22 - 0
routes/events/view-pending-events.js

@@ -0,0 +1,22 @@
1
+var event_controller = require("./../../presenters/event-controller.js");
2
+
3
+module.exports = {
4
+  perform: function (a,b) {
5
+    perform(a,b);
6
+  }
7
+}
8
+
9
+var perform = function (req, res) {
10
+  var auth = req.body.auth || req.query.auth;
11
+
12
+  if (auth) {
13
+    event_controller.get_all_pending_events(auth, function (response) {
14
+      res.send(response);
15
+    });
16
+  } else {
17
+    res.send({
18
+      "pending_events": [],
19
+      "error": 2
20
+    });
21
+  }
22
+};

+ 22 - 0
routes/events/view-society-events.js

@@ -0,0 +1,22 @@
1
+var event_controller = require("./../../presenters/event-controller.js");
2
+
3
+module.exports = {
4
+  perform: function (a,b) {
5
+    perform(a,b);
6
+  }
7
+}
8
+
9
+var perform = function (req, res) {
10
+  var auth_key = req.body.auth || req.query.auth;
11
+
12
+  if (auth_key) {
13
+    event_controller.get_event(req.params.eventid, auth_key, function (response) {
14
+      res.send(response);
15
+    });
16
+  } else {
17
+    res.send({
18
+      "event": {},
19
+      "error": 2
20
+    });
21
+  }
22
+};

+ 0 - 12
routes/society/events/create-society-event.js

@@ -1,12 +0,0 @@
1
-var Redis = require("ioredis");
2
-var redis = new Redis();
3
-
4
-module.exports = {
5
-  perform: function (a,b) {
6
-    perform(a,b);
7
-  }
8
-}
9
-
10
-var perform = function (req, res) {
11
-
12
-};

+ 0 - 12
routes/society/events/view-society-events.js

@@ -1,12 +0,0 @@
1
-var Redis = require("ioredis");
2
-var redis = new Redis();
3
-
4
-module.exports = {
5
-  perform: function (a,b) {
6
-    perform(a,b);
7
-  }
8
-}
9
-
10
-var perform = function (req, res) {
11
-
12
-};

+ 14 - 1
utils/route-manager.js

@@ -7,6 +7,12 @@ var user_view = require("../routes/user/view.js");
7 7
 var soc_create = require("../routes/society/create-society.js");
8 8
 var soc_view = require("../routes/society/view-society.js");
9 9
 var soc_join = require("../routes/society/join-society.js");
10
+var soc_events = require("../routes/events/view-all-society-events.js");
11
+var event_create = require("../routes/events/create-society-event.js");
12
+var event_view = require("../routes/events/view-society-events.js");
13
+var event_pending = require("../routes/events/view-pending-events.js");
14
+var event_accept = require("../routes/events/accept-event.js");
15
+var event_decline = require("../routes/events/decline-event.js");
10 16
 
11 17
 module.exports = router;
12 18
 
@@ -16,6 +22,13 @@ router.all('/user/register/', register.perform);
16 22
 router.all('/user/auth/', login.perform);
17 23
 router.all('/user/view/(:user)?', user_view.perform);
18 24
 
19
-router.all('/society/create', soc_create.perform);
25
+router.all('/society/create/', soc_create.perform);
20 26
 router.all('/society/view/(:societyid)?', soc_view.perform);
27
+router.all('/society/view/:societyid/events/', soc_events.perform);
21 28
 router.all('/society/join/', soc_join.perform);
29
+
30
+router.all('/events/create/', event_create.perform);
31
+router.all('/events/view/:eventid', event_view.perform);
32
+router.all('/events/pending/', event_pending.perform);
33
+router.all('/events/accept/:eventid', event_accept.perform);
34
+router.all('/events/decline/:eventid', event_decline.perform);