summaryrefslogtreecommitdiff
path: root/store/auth.js
blob: 9158fb00176df4373de0338378e747f5e7402b41 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
export const state = () => ({
  token: localStorage.getItem("access_token") || null,
  user: null,
});

export const getters = {
  accessToken: (state) => {
    return state.token;
  },
  isLogged: (state) => {
    return state.token != null;
  },
  me: (state) => {
    return state.user;
  },
};

export const mutations = {
  saveAccessToken: (state, value) => {
    localStorage.setItem("access_token", value);
    state.token = value;
  },
  // Remove access_token and credentials from the browser data
  logout: (state) => {
    localStorage.removeItem("access_token");
    state.token = null;
    state.user = null;
  },
  // Save user's informations from the endpoint `/me`
  saveUserInfo: (state, data) => {
    state.user = data;
  },
};

export const actions = {
  // Make the login and then save the credentials.
  async login({ commit }, credentials) {
    commit("loadingStatus", true, { root: true });
    let res = { status: 0, data: null };
    let api = this.$config.api;

    await fetch(`${api}/v1/auth/login`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(credentials),
    })
      .then(async (response) => {
        res.data = await response.json();
        res.status = response.status;
        if (res.status == 200) {
          commit("saveAccessToken", res.data.access_token);
        } else {
          commit("logout");
        }
      })
      .catch((e) => {
        res.status = e.status;
      });

    commit("loadingStatus", false, { root: true });

    return res;
  },
  // Make a signup request and then returns a dictionary with response
  // status and response data
  async signup({ commit }, credentials) {
    commit("loadingStatus", true, { root: true });
    let res = { status: 0, data: null };
    let api = this.$config.api;

    await fetch(`${api}/v1/auth/signup`, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(credentials),
    })
      .then(async (response) => {
        res.data = await response.json();
        res.status = response.status;

        if (res.status == 201) {
          commit("saveAccessToken", res.data.access_token);
        }
      })
      .catch((e) => {
        res.status = e.status;
      });

    commit("loadingStatus", false, { root: true });

    return res;
  },
  // Search my info
  async findMe({ commit, getters }) {
    commit("loadingStatus", true, { root: true });
    let res = { status: 0, data: null };
    let api = this.$config.api;

    await fetch(`${api}/v1/users/me`, {
      headers: {
        "Content-Type": "application/json",
        Authorization: `Bearer ${getters.accessToken}`,
      },
    })
      .then(async (response) => {
        if (response.status == 200) {
          res.data = await response.json();

          commit("saveUserInfo", res.data);
        } else {
          commit("logout");
        }
      })
      .catch((e) => {
        res.status = e.status;
      });

    commit("loadingStatus", false, { root: true });

    return res;
  },
  logout({ commit }) {
    commit("logout");
  },
};