Public API for a society manager application

user-controller.js 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. var Redis = require("ioredis");
  2. var redis = new Redis();
  3. var auth_gen = require("./../utils/auth-keys.js");
  4. var permissions_controller = require("./permissions-controller.js");
  5. module.exports = {
  6. get_password: function (user, complete) {
  7. var user_key = "user:" + user;
  8. redis.hget(user_key, "password", function (err, password) {
  9. if (password) {
  10. complete(password);
  11. } else {
  12. complete("");
  13. }
  14. });
  15. },
  16. get_public_user_info: function (user, complete) {
  17. var user_key = "user:" + user;
  18. redis.hgetall(user_key, function(err, result) {
  19. if (result.password) {
  20. var public = {};
  21. public.username = user;
  22. public.societies = JSON.parse(result.societies) || [];
  23. var society_controller = require("./society-controller.js");
  24. var soc_names = [];
  25. for (var ii = 0; ii < public.societies.length; ii++) {
  26. society_controller.get_society(public.societies[ii], function (response) {
  27. soc_names.push(response.society.name);
  28. if (soc_names.length === public.societies.length) {
  29. public.societies = soc_names;
  30. public.friends = JSON.parse(result.friends) || [];
  31. public.accepted_events = JSON.parse(result.accepted_events) || [];
  32. public.declined_events = JSON.parse(result.declined_events) || [];
  33. complete({
  34. "user": public,
  35. "error": 0
  36. });
  37. }
  38. });
  39. }
  40. if (public.societies.length === 0) {
  41. public.friends = JSON.parse(result.friends) || [];
  42. public.accepted_events = JSON.parse(result.accepted_events) || [];
  43. public.declined_events = JSON.parse(result.declined_events) || [];
  44. complete({
  45. "user": public,
  46. "error": 0
  47. });
  48. }
  49. } else {
  50. complete({
  51. "user": {},
  52. "error": 1
  53. });
  54. }
  55. });
  56. },
  57. get_raw_user: function (user, complete) {
  58. var user_key = "user:" + user;
  59. redis.hgetall(user_key, function(err, result) {
  60. complete(result);
  61. });
  62. },
  63. get_all_public_infos: function (complete) {
  64. var self = this;
  65. var stream = redis.scanStream({
  66. match: "user:*"
  67. });
  68. var usernames = [];
  69. stream.on('data', function (keys) {
  70. keys.map(function (key) {
  71. usernames.push(key.split(":")[1]);
  72. });
  73. });
  74. stream.on('end', function () {
  75. var user_objects = [];
  76. if (usernames.length === 0) {
  77. complete({
  78. "users": []
  79. })
  80. } else {
  81. for (var ii = 0; ii < usernames.length; ii++) {
  82. self.get_public_user_info(usernames[ii], function (response) {
  83. user_objects.push(response.user);
  84. if (user_objects.length === usernames.length) {
  85. user_objects.sort(function(a, b) {
  86. var textA = a.username.toLowerCase();
  87. var textB = b.username.toLowerCase();
  88. return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
  89. });
  90. complete({
  91. "users": user_objects
  92. })
  93. }
  94. });
  95. }
  96. }
  97. });
  98. },
  99. get_user_from_auth: function (auth, complete) {
  100. var auth_key = "auth-key:" + auth;
  101. redis.get(auth_key, function (err, username) {
  102. if (username) {
  103. complete(username);
  104. } else {
  105. complete("");
  106. }
  107. });
  108. },
  109. user_exists: function (user, complete) {
  110. var user_key = "user:" + user;
  111. redis.hgetall(user_key, function (err, result) {
  112. complete(!!result.password);
  113. });
  114. },
  115. authenticate: function (user, pass, complete) {
  116. permissions_controller.user_can_auth(user, pass, function (success) {
  117. var user_key = "user:" + user;
  118. if (success) {
  119. redis.hget(user_key, "auth-key", function (err, auth) {
  120. var new_auth_key = auth_gen.generate(user);
  121. if (auth) {
  122. redis.del("auth-key:" + auth);
  123. }
  124. redis.set("auth-key:" + new_auth_key, user);
  125. redis.hset(user_key, "auth-key", new_auth_key);
  126. complete({
  127. "logged_in": 1,
  128. "auth-key": new_auth_key,
  129. "error": 0
  130. });
  131. });
  132. } else {
  133. complete({
  134. "logged_in": 0,
  135. "error": 1
  136. });
  137. }
  138. });
  139. },
  140. register: function (user, pass, complete) {
  141. var user_key = "user:" + user;
  142. var auth_key = "";
  143. var new_user = {};
  144. this.user_exists(user, function (exists) {
  145. if (exists) {
  146. complete({
  147. "registered": 0,
  148. "error": 1
  149. });
  150. } else {
  151. bcrypt.hash(pass, null, null, function (err, hash) {
  152. new_user["password"] = hash;
  153. new_user["auth-key"] = auth_gen.generate(user);
  154. auth_key = "auth-key:" + new_user["auth-key"];
  155. redis.hset(user_key, "password", new_user["password"]);
  156. redis.hset(user_key, "auth-key", new_user["auth-key"]);
  157. redis.hset(user_key, "societies", JSON.stringify([]));
  158. redis.hset(user_key, "friends", JSON.stringify([]));
  159. redis.hset(user_key, "pending_events", JSON.stringify([]));
  160. redis.hset(user_key, "accepted_events", JSON.stringify([]));
  161. redis.hset(user_key, "declined_events", JSON.stringify([]));
  162. redis.set(auth_key, user);
  163. complete({
  164. "registered": 1,
  165. "auth-key": new_user["auth-key"],
  166. "error": 0
  167. })
  168. });
  169. }
  170. });
  171. },
  172. add_friend: function(friend, auth, complete) {
  173. var self = this;
  174. friend = friend.toLowerCase();
  175. self.get_user_from_auth(auth, function (username) {
  176. if (username) {
  177. self.get_public_user_info(username, function (userdata) {
  178. var friends = userdata.user.friends;
  179. if (friends.indexOf(friend) > -1) {
  180. complete({
  181. "success": 0,
  182. "error": 2
  183. });
  184. } else {
  185. self.user_exists(friend, function (exists) {
  186. if (exists) {
  187. friends.push(friend);
  188. redis.hset("user:" + username.toLowerCase(), "friends", JSON.stringify(friends));
  189. complete({
  190. "success": 1,
  191. "error": 0
  192. });
  193. } else {
  194. complete({
  195. "success": 0,
  196. "error": 3
  197. });
  198. }
  199. });
  200. }
  201. });
  202. } else {
  203. complete({
  204. "success": 0,
  205. "error": 1
  206. });
  207. }
  208. });
  209. },
  210. remove_friend: function(friend, auth, complete) {
  211. var self = this;
  212. friend = friend.toLowerCase();
  213. self.get_user_from_auth(auth, function (username) {
  214. if (username) {
  215. self.get_public_user_info(username, function (userdata) {
  216. var friends = userdata.user.friends;
  217. if (friends.indexOf(friend) === -1) {
  218. complete({
  219. "success": 0,
  220. "error": 2
  221. });
  222. } else {
  223. friends.splice(friends.indexOf(friend), 1);
  224. redis.hset("user:" + username.toLowerCase(), "friends", JSON.stringify(friends));
  225. complete({
  226. "success": 1,
  227. "error": 0
  228. });
  229. }
  230. });
  231. } else {
  232. complete({
  233. "success": 0,
  234. "error": 1
  235. });
  236. }
  237. });
  238. }
  239. }