1 | const axios = require('axios')
|
2 | const get = require('lodash.get')
|
3 | const FormDataFactory = require('./handlers/form-data-factory')
|
4 |
|
5 | function getInstance (options) {
|
6 | const instance = axios.create(options)
|
7 |
|
8 | instance.interceptors.response.use(response => {
|
9 | const otcsticket = get(response, 'headers.otcsticket')
|
10 |
|
11 | if (otcsticket) {
|
12 | instance.defaults.headers.common.OTCSTicket = otcsticket
|
13 | }
|
14 | return response
|
15 | }, error => {
|
16 | return Promise.reject(error)
|
17 | })
|
18 |
|
19 | return instance
|
20 | }
|
21 |
|
22 | function axiosFactory (options) {
|
23 | const instance = getInstance(options)
|
24 |
|
25 | const username = get(options, 'username')
|
26 | const password = get(options, 'password')
|
27 | const otcsticket = get(options, 'otcsticket')
|
28 |
|
29 | if (otcsticket) {
|
30 | instance.defaults.headers.common.OTCSTicket = otcsticket
|
31 | } else if (username && password) {
|
32 | instance.interceptors.request.use(async request => {
|
33 | if (request.headers.common.OTCSTicket) {
|
34 | return request
|
35 | } else {
|
36 | const formData = FormDataFactory.createFormData()
|
37 |
|
38 | formData.append('username', username)
|
39 | formData.append('password', password)
|
40 |
|
41 | const response = process.node
|
42 | ? await axios.post(`${options.baseURL}/api/v1/auth/`, formData.getBuffer(), { headers: formData.getHeaders() })
|
43 | : await axios.post(`${options.baseURL}/api/v1/auth/`, formData)
|
44 |
|
45 | request.headers.common.OTCSTicket = get(response, 'data.ticket')
|
46 |
|
47 | return request
|
48 | }
|
49 | })
|
50 | } else {
|
51 | throw Error('You must provide an otcsticket or username and password.')
|
52 | }
|
53 |
|
54 | return instance
|
55 | }
|
56 |
|
57 | module.exports = axiosFactory
|