Proyectos de Subversion LeadersLinked - SPA

Rev

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