user.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /* eslint no-param-reassign: 0 */
  2. import auth from "../../api/auth";
  3. import io from "../../io";
  4. import validation from "../../validation";
  5. const state = {};
  6. const getters = {};
  7. const actions = {};
  8. const mutations = {};
  9. const modules = {
  10. auth: {
  11. namespaced: true,
  12. state: {
  13. userIdMap: {},
  14. userIdRequested: {},
  15. pendingUserIdCallbacks: {}
  16. },
  17. getters: {},
  18. actions: {
  19. /* eslint-disable-next-line no-unused-vars */
  20. register: ({ commit }, user) => {
  21. return new Promise((resolve, reject) => {
  22. const { username, email, password } = user;
  23. if (!email || !username || !password)
  24. return reject(new Error("Please fill in all fields"));
  25. if (!validation.isLength(email, 3, 254))
  26. return reject(
  27. new Error(
  28. "Email must have between 3 and 254 characters."
  29. )
  30. );
  31. if (
  32. email.indexOf("@") !== email.lastIndexOf("@") ||
  33. !validation.regex.emailSimple.test(email)
  34. )
  35. return reject(new Error("Invalid email format."));
  36. if (!validation.isLength(username, 2, 32))
  37. return reject(
  38. new Error(
  39. "Username must have between 2 and 32 characters."
  40. )
  41. );
  42. if (!validation.regex.azAZ09_.test(username))
  43. return reject(
  44. new Error(
  45. "Invalid username format. Allowed characters: a-z, A-Z, 0-9 and _."
  46. )
  47. );
  48. if (!validation.isLength(password, 6, 200))
  49. return reject(
  50. new Error(
  51. "Password must have between 6 and 200 characters."
  52. )
  53. );
  54. if (!validation.regex.password.test(password))
  55. return reject(
  56. new Error(
  57. "Invalid password format. Must have one lowercase letter, one uppercase letter, one number and one special character."
  58. )
  59. );
  60. return auth
  61. .register(user)
  62. .then(() => {
  63. return resolve({
  64. status: "success",
  65. message: "Account registered!"
  66. });
  67. })
  68. .catch(err => {
  69. return reject(new Error(err.message));
  70. });
  71. });
  72. },
  73. /* eslint-disable-next-line no-unused-vars */
  74. login: ({ commit }, user) => {
  75. return new Promise((resolve, reject) => {
  76. auth.login(user)
  77. .then(() => {
  78. return resolve({
  79. status: "success",
  80. message: "Logged in!"
  81. });
  82. })
  83. .catch(err => {
  84. return reject(new Error(err.message));
  85. });
  86. });
  87. },
  88. getUsernameFromId: ({ commit, state }, userId) => {
  89. return new Promise(resolve => {
  90. if (typeof state.userIdMap[`Z${userId}`] !== "string") {
  91. if (state.userIdRequested[`Z${userId}`] !== true) {
  92. commit("requestingUserId", userId);
  93. io.getSocket(socket => {
  94. socket.emit(
  95. "users.getUsernameFromId",
  96. userId,
  97. res => {
  98. if (res.status === "success") {
  99. commit("mapUserId", {
  100. userId,
  101. username: res.data
  102. });
  103. state.pendingUserIdCallbacks[
  104. `Z${userId}`
  105. ].forEach(cb => cb(res.data));
  106. commit(
  107. "clearPendingCallbacks",
  108. userId
  109. );
  110. return resolve(res.data);
  111. }
  112. return resolve();
  113. }
  114. );
  115. });
  116. } else {
  117. commit("pendingUsername", {
  118. userId,
  119. callback: username => {
  120. return resolve(username);
  121. }
  122. });
  123. }
  124. }
  125. });
  126. }
  127. },
  128. mutations: {
  129. mapUserId(state, data) {
  130. state.userIdMap[`Z${data.userId}`] = data.username;
  131. state.userIdRequested[`Z${data.userId}`] = false;
  132. },
  133. requestingUserId(state, userId) {
  134. state.userIdRequested[`Z${userId}`] = true;
  135. if (!state.pendingUserIdCallbacks[`Z${userId}`])
  136. state.pendingUserIdCallbacks[`Z${userId}`] = [];
  137. },
  138. pendingUsername(state, data) {
  139. state.pendingUserIdCallbacks[`Z${data.userId}`].push(
  140. data.callback
  141. );
  142. },
  143. clearPendingCallbacks(state, userId) {
  144. state.pendingUserIdCallbacks[`Z${userId}`] = [];
  145. }
  146. }
  147. },
  148. playlists: {
  149. namespaced: true,
  150. state: {
  151. editing: ""
  152. },
  153. getters: {},
  154. actions: {
  155. editPlaylist: ({ commit }, id) => commit("editPlaylist", id)
  156. },
  157. mutations: {
  158. editPlaylist(state, id) {
  159. state.editing = id;
  160. }
  161. }
  162. }
  163. };
  164. export default {
  165. namespaced: true,
  166. state,
  167. getters,
  168. actions,
  169. mutations,
  170. modules
  171. };