All files / src/store/rest RestServiceClient.ts

94.44% Statements 17/18
100% Branches 8/8
87.5% Functions 7/8
94.44% Lines 17/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78                                              1x             9x       9x 9x       2x       1x       1x       1x       1x         8x 5x   3x 2x 1x     1x   2x     1x        
/*
 * Copyright 2019 Red Hat, Inc. and/or its affiliates.
 *
 * 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 { AxiosInstance, AxiosResponse, AxiosStatic } from 'axios';
 
import { alert } from 'store/alert';
import { ServerSideExceptionInfo, BasicObject } from 'types';
import { ThunkDispatch } from 'redux-thunk';
import { AppState } from 'store/types';
 
const typeJsonRegex = new RegExp('application/json.*');
export default class RestServiceClient {
 
  restClient: AxiosInstance;
  dispatch: ThunkDispatch<AppState, any, any> | null;
 
  constructor(baseURL: string, axios: AxiosStatic) {
    this.restClient = axios.create({
      baseURL: baseURL,
      validateStatus: () => true
    });
    this.dispatch = null;
    this.handleResponse = this.handleResponse.bind(this);
  }
 
  setDispatch(dispatch: ThunkDispatch<AppState, any, any>) {
    this.dispatch = dispatch;
  }
 
  get<T>(url: string): Promise<T> {
    return this.restClient.get<T>(url).then(this.handleResponse);
  }
 
  post<T>(url: string, params: any): Promise<T> {
    return this.restClient.post<T>(url, params).then(this.handleResponse);
  }
 
  put<T>(url: string, params: any): Promise<T> {
    return this.restClient.put<T>(url, params).then(this.handleResponse);
  }
 
  delete<T>(url: string): Promise<T> {
    return this.restClient.delete<T>(url)
      .then(this.handleResponse);
  }
 
  handleResponse<T>(res: AxiosResponse<T>): Promise<T> {
    if (200 <= res.status && res.status <= 300) {
      return Promise.resolve(res.data);
    }
    else if (this.dispatch !== null) {
      if (typeJsonRegex.test(res.headers["content-type"])) {
        this.dispatch(alert.showServerError(res.data as unknown as ServerSideExceptionInfo & BasicObject))
      }
      else {
        this.dispatch(alert.showServerErrorMessage(res.statusText));
      }
      return Promise.reject(res.status);
    }
    else {
      throw Error("Dispatch was not passed to RestServiceClient");
    }
  }
}