petra-tool / frontend / store / auth.js
auth.js
Raw
import Vue from 'vue';

export default {
  namespaced: true,

  state() {
    return {};
  },

  actions: {
    fetch(data) {
      return Vue.auth.fetch(data);
    },

    // refresh(ctx, data) {
    //   console.log('refreshing token')
    //   return Vue.auth.refresh(data);
    // },

    login(ctx, data) {
      data = data || {};

      return new Promise((resolve, reject) => {
        Vue.auth.login({
          url: 'auth/login',
          data: data.data, // Axios
          remember: data.remember,
          staySignedIn: data.staySignedIn,
          fetchUser: data.fetchUser,
        })
          .then((res) => {
            // this response is /api/auth/user endpoint, not from /api/auth/login
            // to access, set fetchUser to false -> not practical here
            if (data.remember) {
              Vue.auth.remember(JSON.stringify({
                name: ctx.getters.user.name
              }));
            }

            if (ctx.getters.user.role.find(role => role === 'admin')) {
              Vue.router.push({
                name: 'admin-landing'
              })
            } else {
              Vue.router.push({
                name: 'user-landing'
              })
            }

            resolve(res);
          }, reject);
      });
    },

    register(ctx, data) {
      data = data || {};

      return new Promise((resolve, reject) => {
        Vue.auth.register({
          url: 'auth/register',
          data: data.data,
          autoLogin: false, // fixed o.w. register() triggers twice
          fetchUser: data.fetchUser,
          staySignedIn: data.staySignedIn,
          redirect: {name: 'auth-login', params: {'waitingForApproval': true}} // disable if autoLogin == true o.w. not reaching .then()
        })
          .then(() => {
            if (data.autoLogin) {
              ctx.dispatch('login', data).then(resolve, reject);
            }
            else {
              resolve()
            }
          }, reject);
      });
    },

    logout() {
      return Vue.auth.logout({
        makeRequest: true,
        method: 'POST',
        redirect: {name: 'auth-login'}
      }).finally(() => this.dispatch('site/logout', {root:true}));
    },

    impersonate(ctx, team) {
      Vue.auth.impersonate({
        url: 'auth/' + team.id + '/impersonate',
        redirect: {name: 'user-landing'}
      }).then(() => {
        this.dispatch('site/fetchMatrix')
        this.dispatch('site/fetchProgress')
      });
    },

    unimpersonate() {
      Vue.auth.unimpersonate({
        redirect: {name: 'admin-landing'}
      });
    },
  },

  getters: {
    user() {
      return Vue.auth.user();
    },

    impersonating() {
      return Vue.auth.impersonating();
    }
  }
}