Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3432 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3719 stevensc 1
import axios from 'axios';
2
 
3
export class Request {
4
  #client;
5
  #abortController;
6
 
7
  constructor() {
8
    this.#client = axios.create();
9
 
10
    this.#client.interceptors.request.use(
11
      async (request) => {
12
        const token = window.localStorage.getItem('jwt');
13
 
14
        if (token) {
15
          request.headers.Authorization = `Bearer ${token}`;
16
        }
17
 
18
        const contentType = request.method === 'post' ? 'multipart/form-data' : 'application/json';
19
 
20
        request.headers['Content-Type'] = contentType;
21
 
22
        if (request.method !== 'get') {
23
          const csrfToken = await this.getCsrfToken();
24
          request.headers['X-CSRF-TOKEN'] = csrfToken;
25
        }
26
 
27
        return request;
28
      },
29
      (error) => {
30
        return Promise.reject(error);
31
      }
32
    );
33
 
34
    this.#client.interceptors.response.use(
35
      async (response) => {
36
        const { fatal } = response.data;
37
 
38
        if (fatal === true) {
39
          throw new Error('La sesión ha caducado');
40
        }
41
 
42
        return response;
43
      },
44
      (error) => {
45
        return Promise.reject(error);
46
      }
47
    );
48
 
49
    this.#abortController = new AbortController();
50
  }
51
 
52
  async getCsrfToken() {
53
    const response = await this.#client.get('/csrf');
54
    const { data: csrfToken, success } = response.data;
55
    if (!success) throw new Error('Error al obtener el CSRF token');
56
    return csrfToken;
57
  }
58
 
59
  setBaseURL(baseURL = '') {
60
    if (typeof baseURL !== 'string') {
61
      throw new Error('baseURL must be a string');
62
    }
63
    this.#client.defaults.baseURL = baseURL;
64
  }
65
 
66
  async MakeRequest(method = 'get', { endpoint, data, params }) {
67
    const config = { ...params };
68
    config.signal = this.#abortController.signal;
69
 
70
    const response =
71
      method === 'get' || method === 'delete'
72
        ? await this.#client[method](endpoint, config)
73
        : await this.#client[method](endpoint, data, config);
74
 
75
    return response;
76
  }
77
 
78
  async get(endpoint, params) {
79
    return await this.MakeRequest('get', { endpoint, params });
80
  }
81
 
82
  async delete(endpoint, params) {
83
    return await this.MakeRequest('delete', { endpoint, params });
84
  }
85
 
86
  async post(endpoint, data, params) {
87
    return await this.MakeRequest('post', { endpoint, data, params });
88
  }
89
 
90
  async put(endpoint, data, params) {
91
    return await this.MakeRequest('put', { endpoint, data, params });
92
  }
93
 
94
  cancelToken() {
95
    if (!this.#abortController.signal.aborted) {
96
      this.#abortController.abort();
97
    }
98
  }
99
}