aboutsummaryrefslogtreecommitdiffstats
path: root/sdnr/wt/odlux/framework/src/services/restAccessorService.ts
blob: ca95ebc1aef16aa893883c6c1e485e9b32800f8b (plain)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/**
 * ============LICENSE_START========================================================================
 * ONAP : ccsdk feature sdnr wt odlux
 * =================================================================================================
 * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
 * =================================================================================================
 * 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.
 * ============LICENSE_END==========================================================================
 */
import * as $ from 'jquery'; 
import { Action, IActionHandler } from '../flux/action';
import { MiddlewareArg } from '../flux/middleware';
import { Dispatch } from '../flux/store';

import { IApplicationStoreState } from '../store/applicationStore';
import { AddErrorInfoAction, ErrorInfo } from '../actions/errorActions';
import { PlainObject, AjaxParameter } from 'models/restService';

export const absoluteUri = /^(https?:\/\/|blob:)/i;
export const baseUrl = `${ window.location.origin }${ window.location.pathname }`;

class RestBaseAction extends Action { }

export const createRestApiAccessor = <TResult extends PlainObject>(urlOrPath: string, initialValue: TResult) => {
  const isLocalRequest = !absoluteUri.test(urlOrPath);
  const uri = isLocalRequest ? `${ baseUrl }/${ urlOrPath }`.replace(/\/{2,}/, '/') : urlOrPath ;
 
  class RestRequestAction extends RestBaseAction { constructor(public settings?: AjaxParameter) { super(); } }

  class RestResponseAction extends RestBaseAction { constructor(public result: TResult) { super(); } }

  class RestErrorAction extends RestBaseAction { constructor(public error?: Error | string) { super(); } }
  
  type RestAction = RestRequestAction | RestResponseAction | RestErrorAction;

  /** Represents our middleware to handle rest backend requests */
  const restMiddleware = (api: MiddlewareArg<IApplicationStoreState>) =>
    (next: Dispatch) => (action: RestAction): RestAction => {
      
      // pass all actions through by default
      next(action);
      // handle the RestRequestAction
      if (action instanceof RestRequestAction) {
        const state = api.getState();
        const authHeader = isLocalRequest && state && state.framework.authenticationState.user && state.framework.authenticationState.user.token
          ? { "Authentication": "Bearer " + state.framework.authenticationState.user.token } : { };
        $.ajax({
          url: uri,
          method: (action.settings && action.settings.method) || "GET",
          headers: { ...authHeader, ...action.settings && action.settings.headers ? action.settings.headers : { } },
        }).then((data: TResult) => {
           next(new RestResponseAction(data));
        }).catch((err: any) => {
          next(new RestErrorAction());
          next(new AddErrorInfoAction((err instanceof Error) ? { error: err } : { message: err.toString() }));
        });
      }
      // allways return action
      return action;
  };
  
  /** Represents our action handler to handle our actions */
  const restActionHandler: IActionHandler<TResult> = (state = initialValue, action) => {
    if (action instanceof RestRequestAction) {
      return {
        ...(state as any),
        busy: true
      };
    } else if (action instanceof RestResponseAction) {
      return action.result;
    } else if (action instanceof RestErrorAction) {
      return initialValue;
    }
    return state;
  };

  return {
    requestAction: RestRequestAction,
    actionHandler: restActionHandler,
    middleware: restMiddleware,
  };
}