user.js 4.6 KB

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