Public API for a society manager application

user-controller.js 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. console.warn("WARNING: Accessing raw user info, use with care and do not expose to API endpoints.");
  40. var user_key = "user:" + user;
  41. redis.hgetall(user_key, function(err, result) {
  42. complete(result);
  43. });
  44. },
  45. get_all_public_infos: function (complete) {
  46. var self = this;
  47. var stream = redis.scanStream({
  48. match: "user:*"
  49. });
  50. var usernames = [];
  51. stream.on('data', function (keys) {
  52. keys.map(function (key) {
  53. usernames.push(key.split(":")[1]);
  54. });
  55. });
  56. stream.on('end', function () {
  57. var user_objects = [];
  58. if (usernames.length === 0) {
  59. complete({
  60. "users": []
  61. })
  62. } else {
  63. for (var ii = 0; ii < usernames.length; ii++) {
  64. self.get_public_user_info(usernames[ii], function (response) {
  65. user_objects.push(response.user);
  66. if (user_objects.length === usernames.length) {
  67. user_objects.sort(function(a, b) {
  68. var textA = a.username.toLowerCase();
  69. var textB = b.username.toLowerCase();
  70. return (textA < textB) ? -1 : (textA > textB) ? 1 : 0;
  71. });
  72. complete({
  73. "users": user_objects
  74. })
  75. }
  76. });
  77. }
  78. }
  79. });
  80. },
  81. get_user_from_auth: function (auth, complete) {
  82. var auth_key = "auth-key:" + auth;
  83. redis.get(auth_key, function (err, username) {
  84. if (username) {
  85. complete(username);
  86. } else {
  87. complete("");
  88. }
  89. });
  90. },
  91. user_exists: function (user, complete) {
  92. var user_key = "user:" + user;
  93. redis.hgetall(user_key, function (err, result) {
  94. complete(!!result.password);
  95. });
  96. },
  97. authenticate: function (user, pass, complete) {
  98. permissions_controller.user_can_auth(user, pass, function (success) {
  99. var user_key = "user:" + user;
  100. if (success) {
  101. redis.hget(user_key, "auth-key", function (err, auth) {
  102. var new_auth_key = auth_gen.generate(user);
  103. if (auth) {
  104. redis.del("auth-key:" + auth);
  105. }
  106. redis.set("auth-key:" + new_auth_key, user);
  107. redis.hset(user_key, "auth-key", new_auth_key);
  108. complete({
  109. "logged_in": 1,
  110. "auth-key": new_auth_key,
  111. "error": 0
  112. });
  113. });
  114. } else {
  115. complete({
  116. "logged_in": 0,
  117. "error": 1
  118. });
  119. }
  120. });
  121. },
  122. register: function (user, pass, complete) {
  123. var user_key = "user:" + user;
  124. var auth_key = "";
  125. var new_user = {};
  126. this.user_exists(user, function (exists) {
  127. if (exists) {
  128. complete({
  129. "registered": 0,
  130. "error": 1
  131. });
  132. } else {
  133. bcrypt.hash(pass, null, null, function (err, hash) {
  134. new_user["password"] = hash;
  135. new_user["auth-key"] = auth_gen.generate(user);
  136. auth_key = "auth-key:" + new_user["auth-key"];
  137. redis.hset(user_key, "password", new_user["password"]);
  138. redis.hset(user_key, "auth-key", new_user["auth-key"]);
  139. redis.hset(user_key, "societies", JSON.stringify([]));
  140. redis.hset(user_key, "friends", JSON.stringify([]));
  141. redis.hset(user_key, "pending_events", JSON.stringify([]));
  142. redis.hset(user_key, "accepted_events", JSON.stringify([]));
  143. redis.hset(user_key, "declined_events", JSON.stringify([]));
  144. redis.set(auth_key, user);
  145. complete({
  146. "registered": 1,
  147. "auth-key": new_user["auth-key"],
  148. "error": 0
  149. })
  150. });
  151. }
  152. })
  153. }
  154. }