user.js 5.4 KB

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