blob: 6be5db765cb78944602542135a9abc0b21fa6bbc [file] [log] [blame]
/*
* Copyright © 2016-2018 European Support Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import uuid from 'uuid-js';
import md5 from 'md5';
import axios from 'axios';
import store from 'sdc-app/AppStore.js';
import { actionTypes as LoaderConstants } from 'nfvo-components/loader/LoaderConstants.js';
import Configuration from 'sdc-app/config/Configuration.js';
import errorResponseHandler from './ErrorResponseHandler.js';
//methods
const GET = 'GET';
const POST = 'POST';
const PUT = 'PUT';
const DELETE = 'DELETE';
// content-types
const APPLICATION_JSON = 'application/json';
const MULTIPART_FORM_DATA = 'multipart/form-data';
const BINARY = 'binary';
const AUTHORIZATION_HEADER = 'X-AUTH-TOKEN';
const STORAGE_AUTH_KEY = 'sdc-auth-token';
const REQUEST_ID_HEADER = 'X-ECOMP-RequestID';
const CONTENT_MD5_HEADER = 'Content-MD5';
function applySecurity(options, data) {
let headers = options.headers || (options.headers = {});
if (options.isAnonymous) {
return;
}
let authToken = localStorage.getItem(STORAGE_AUTH_KEY);
if (authToken) {
headers[AUTHORIZATION_HEADER] = authToken;
}
let catalogApiHeaders = Configuration.get('CatalogApiHeaders'),
catalogUidHeader = catalogApiHeaders && catalogApiHeaders.userId;
if (catalogUidHeader) {
headers[catalogUidHeader.name] = catalogUidHeader.value;
}
headers[REQUEST_ID_HEADER] = uuid.create().toString();
if (options.md5) {
let headers = options.headers;
headers[CONTENT_MD5_HEADER] = window.btoa(
md5(JSON.stringify(data)).toLowerCase()
);
}
}
function handleSuccess(responseHeaders, requestHeaders) {
let authToken = responseHeaders[AUTHORIZATION_HEADER];
let prevToken = requestHeaders && requestHeaders[AUTHORIZATION_HEADER];
if (authToken && authToken !== prevToken) {
if (authToken === 'null') {
localStorage.removeItem(STORAGE_AUTH_KEY);
} else {
localStorage.setItem(STORAGE_AUTH_KEY, authToken);
}
}
}
class RestAPIUtil {
handleRequest(url, type, options = {}, data) {
if (DEBUG) {
console.log('axios --> Making REST call (' + type + '): ' + url);
}
applySecurity(options, data);
// TODO see ig necessary or in transformrequest funtion
if (type === POST || type === PUT) {
if (data instanceof FormData) {
options.headers.contentType = MULTIPART_FORM_DATA;
} else {
options.headers.contentType = APPLICATION_JSON;
// config.data = JSON.stringify(data);
}
} else {
data = null;
}
let config = {
method: type,
url: url,
headers: options.headers,
data: data
};
store.dispatch({ type: LoaderConstants.SEND_REQUEST, url: url });
if (options.dataType === BINARY) {
config.responseType = 'arraybuffer';
return axios(config)
.then(result => {
store.dispatch({
type: LoaderConstants.RECEIVE_RESPONSE,
url: result.config.url
});
return {
blob: new Blob([result.data]),
headers: result.headers
};
})
.catch(error => {
store.dispatch({
type: LoaderConstants.RECEIVE_RESPONSE,
url: error.config.url
});
errorResponseHandler(error.response);
});
} else {
return axios(config)
.then(result => {
store.dispatch({
type: LoaderConstants.RECEIVE_RESPONSE,
url: result.config.url
});
handleSuccess(result.headers, result.config.headers);
return result.data;
})
.catch(error => {
store.dispatch({
type: LoaderConstants.RECEIVE_RESPONSE,
url: error.config.url
});
errorResponseHandler(error.response);
return Promise.reject({
responseJSON: error.response.data
});
});
}
}
fetch(url, options) {
return this.handleRequest(url, GET, options);
}
get(url, options) {
return this.fetch(url, options);
}
post(url, data, options) {
return this.handleRequest(url, POST, options, data);
}
put(url, data, options) {
return this.handleRequest(url, PUT, options, data);
}
destroy(url, options) {
return this.handleRequest(url, DELETE, options);
}
}
const instance = new RestAPIUtil();
export default instance;