diff options
Diffstat (limited to 'src/site/store/auth.js')
| -rw-r--r-- | src/site/store/auth.js | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/site/store/auth.js b/src/site/store/auth.js new file mode 100644 index 0000000..85e3a39 --- /dev/null +++ b/src/site/store/auth.js @@ -0,0 +1,106 @@ +const getDefaultState = () => ({ + loggedIn: false, + user: { + id: null, + isAdmin: false, + username: null + }, + token: null +}); + +export const state = getDefaultState; + +export const getters = { + isLoggedIn: (state) => state.loggedIn, + getApiKey: (state) => state.user?.apiKey, + getToken: (state) => state.token +}; + +export const actions = { + async verify({ commit, dispatch }) { + try { + const response = await this.$axios.$get('verify'); + commit('loginSuccess', response); + } catch (e) { + dispatch('alert/set', { text: e.message, error: true }, { root: true }); + } + }, + async login({ commit }, { username, password }) { + commit('loginRequest'); + + const data = await this.$axios.$post('auth/login', { username, password }); + this.$axios.setToken(data.token, 'Bearer'); + + commit('setToken', data.token); + commit('loginSuccess', { token: data.token, user: data.user }); + }, + async register(_, { username, password }) { + return this.$axios.$post('auth/register', { + username, + password + }); + }, + async fetchCurrentUser({ commit, dispatch }) { + try { + const data = await this.$axios.$get('users/me'); + commit('setUser', data.user); + } catch (e) { + dispatch('alert/set', { text: e.message, error: true }, { root: true }); + } + }, + async changePassword({ dispatch }, { password, newPassword }) { + try { + const response = await this.$axios.$post('user/password/change', { + password, + newPassword + }); + + return response; + } catch (e) { + dispatch('alert/set', { text: e.message, error: true }, { root: true }); + } + + return null; + }, + async requestAPIKey({ commit, dispatch }) { + try { + const response = await this.$axios.$post('user/apikey/change'); + commit('setApiKey', response.apiKey); + + return response; + } catch (e) { + dispatch('alert/set', { text: e.message, error: true }, { root: true }); + } + + return null; + }, + logout({ commit }) { + commit('logout'); + } +}; + +export const mutations = { + setToken(state, token) { + state.token = token; + }, + setApiKey(state, apiKey) { + state.user.apiKey = apiKey; + }, + setUser(state, user) { + state.user = user; + }, + loginRequest(state) { + state.isLoading = true; + }, + loginSuccess(state, { user }) { + this.$cookies.set('token', state.token, { path: '/' }); + state.user = user; + state.loggedIn = true; + state.isLoading = false; + }, + logout(state) { + this.$cookies.remove('token', { path: '/' }); + // reset state to default + Object.assign(state, getDefaultState()); + } +}; |