Public API for a society manager application

user-controller.js 7.0KB

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