Public API for a society manager application

user-controller.js 6.5KB

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