Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3404 | Rev 3432 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

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