@apite/shopware6-utility
Version:
Shopgate WebCheckout utility for Shopware 6 extensions
78 lines (65 loc) • 2.53 kB
JavaScript
const axios = require('axios')
const { getContextToken, saveContextToken } = require('./contextManager')
const { getEndpoint, getAccessToken, getLanguageId } = require('./configManager')
const { errorInterceptor } = require('./errorManager')
const {
formatAxiosRequest,
decorateMessage,
obfuscateString
} = require('../services/logDecorator')()
/**
* @param {ApiteSW6Utility.PipelineContext} context
* @param {boolean} saveToken - whether to save the token to storage after a successful API call
* @returns {AxiosInstance}
*/
const createApiConfig = async (context, saveToken = true) => {
const contextToken = await getContextToken(context)
const axiosClient = axios.create({
baseURL: getEndpoint(context),
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
'sw-access-key': getAccessToken(context),
'sw-language-id': getLanguageId(context),
...contextToken ? { 'sw-context-token': contextToken } : {}
}
})
// when this check is present, our plugin extends the current expired customer/guest session
axiosClient.defaults.headers.common['shopgate-check'] = 'true'
if (process.env.XDEBUG) {
axiosClient.defaults.headers.common.Cookie = 'XDEBUG_SESSION=XDEBUG_ECLIPSE;'
axiosClient.defaults.withCredentials = true
}
axiosClient.interceptors.request.use(async config => {
const customerType = context.meta.userId ? 'user' : 'guest'
context.log.debug({ ...formatAxiosRequest(config), customerType }, 'request-catch-all')
return config
})
axiosClient.interceptors.response.use(async resp => {
const respToken = extractContextToken(resp)
// special case for login call where we want to return the context token
if (resp.config.url.includes('/account/login')) {
return respToken
}
if (contextToken !== respToken && saveToken) {
const whom = context.meta.userId ? 'user' : 'guest'
context.log.debug(
decorateMessage(`Changed token for ${whom} ` +
`FROM: "${obfuscateString(contextToken)}" ` +
`TO: "${obfuscateString(respToken)}"`))
await saveContextToken(respToken, context)
}
return resp.data
}, async err => errorInterceptor(err, context))
return axiosClient
}
/**
* @param {AxiosResponse} response
* @return {string}
*/
const extractContextToken = response =>
response.data['sw-context-token'] ||
response.data.contextToken ||
response.headers['sw-context-token']
module.exports = { createApiConfig }