Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 2195 | Rev 2201 | 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) {
15
          request.headers.Authorization = 'Bearer ' + token
16
        }
17
 
1188 stevensc 18
        if (request.method === 'get') {
19
          request.headers['Content-Type'] = 'application/json'
20
          return request
21
        }
22
 
801 stevensc 23
        if (['post', 'put', 'delete'].includes(request.method)) {
24
          try {
807 stevensc 25
            const { data: responseData } = await this.#client.get('/csrf')
801 stevensc 26
            const { data, success } = responseData
27
 
28
            if (success) {
29
              request.headers['X-CSRF-TOKEN'] = data
30
              return request
31
            }
32
          } catch (err) {
33
            throw new Error(
34
              `Axios problem with request during pre-flight phase: ${err}.`
35
            )
36
          }
37
        }
38
 
39
        return request
40
      },
41
      (error) => {
42
        return Promise.reject(error)
43
      }
44
    )
45
 
808 stevensc 46
    this.#client.interceptors.response.use(
47
      async (response) => {
2195 stevensc 48
        const { fatal, success, data } = response.data
808 stevensc 49
 
2200 stevensc 50
        if (fatal === true) {
808 stevensc 51
          window.localStorage.removeItem('jwt')
52
          window.localStorage.removeItem('aes')
2142 stevensc 53
          window.location.reload()
2195 stevensc 54
          return { success: false, data: 'La sesión ha caducado' }
808 stevensc 55
        }
56
 
2200 stevensc 57
        if (success === false) {
2195 stevensc 58
          const errorType = typeof data
59
 
60
          if (errorType !== 'string') throw new Error(data)
61
 
62
          const errorsArray = []
63
 
64
          for (const key in data) {
65
            data[key].forEach((error) => {
66
              errorsArray.push(`${key} ${error}`)
67
            })
68
          }
69
 
70
          return { ...response, data: errorsArray }
71
        }
72
 
1667 stevensc 73
        return response
808 stevensc 74
      },
75
      (error) => {
76
        return Promise.reject(error)
77
      }
78
    )
79
 
797 stevensc 80
    this.#abortController = new AbortController()
81
  }
82
 
802 stevensc 83
  setBaseURL(baseURL = '') {
1180 stevensc 84
    if (typeof baseURL !== 'string') {
85
      throw new Error('baseURL must be a string')
86
    }
802 stevensc 87
    this.#client.defaults.baseURL = baseURL
88
  }
89
 
797 stevensc 90
  async MakeRequest(method = 'get', { endpoint, data, params }) {
91
    const config = { ...params }
92
    config.signal = this.#abortController.signal
93
 
94
    const response =
95
      method === 'get' || method === 'delete'
96
        ? await this.#client[method](endpoint, config)
97
        : await this.#client[method](endpoint, data, config)
98
 
805 stevensc 99
    return response
797 stevensc 100
  }
101
 
102
  async get(endpoint, params) {
1697 stevensc 103
    return await this.MakeRequest('get', { endpoint, params })
797 stevensc 104
  }
105
 
106
  async delete(endpoint, params) {
107
    return await this.MakeRequest('delete', { endpoint, params })
108
  }
109
 
110
  async post(endpoint, data, params) {
111
    return await this.MakeRequest('post', { endpoint, data, params })
112
  }
113
 
114
  async put(endpoint, data, params) {
115
    return await this.MakeRequest('put', { endpoint, data, params })
116
  }
117
 
118
  cancelToken() {
119
    if (!this.#abortController.signal.aborted) {
120
      this.#abortController.abort()
121
    }
122
  }
123
}