Public API for a society manager application

user-controller.js 6.9KB

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