у меня есть модуль auth в нем есть action request в нем можно вызвать action request ?
или вынести его async request в сервис ?
и как с request сделать сервис?
import { Module, Mutation,Action, VuexModule } from 'vuex-module-decorators';
@Module({ name: 'AuthStoreModule', namespaced: true })
export default class AuthStoreModule extends VuexModule {
@Mutation
clearToken(state) {
state.token = '';
this.$cookies.remove('access_token');
this.$cookies.remove('refresh_token');
},
@Action
async sendCode({ phone }) {
const data = {
method: 'GET',
url: '/code',
params: { phone },
};
const res = await this.dispatch('request', data);
if (res.success) return true;
return res.message;
}
@Action
async request(cnx, { method = 'GET', url = '', headers, body, params }) {
const req = {
method,
url,
data: body,
params,
headers
};
async function callback() {
try {
const res = await this.$axios(req);
const { data } = res;
return {
success: data.success || true,
data: data.data,
meta: data.meta || null,
message: data.message,
status: res.status
};
} catch (e) {
const data = e.response?.data;
return {
success: false,
message:
data?.error?.message || e.message || 'Ошибка получения данных',
status: data.error?.status
};
}
}
const res = await callback.call(this);
if (!res.success) {
// если был не удачный запрос с токеном делаем refresh
if (headers?.Authorization) {
const { status } = res;
if (!status || status == 401) {
// добавить проверку на рефреш при 401 ошибке
const token = await this.dispatch('auth/refreshToken');
if (token) {
req.headers.Authorization = `Bearer ${token}`;
return await callback.call(this);
} else {
localStorage.clear();
this.dispatch('auth/clearToken');
}
}
} else {
// иначе выводим ошибки в консоль
console.error(
`
url: ${url}
baseUrl: ${process.env.NUXT_ENV_API}
Response: ${JSON.stringify(res.data)}
Message: ${res.message}
Params: ${JSON.stringify(params)}
Payload: ${JSON.stringify(body)}
`
);
// console.error(res.message);
}
}
return res;
}
}