All files / src/app/store/middleware http.middleware.ts

100% Statements 32/32
100% Branches 10/10
100% Functions 9/9
100% Lines 29/29
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 581x 1x   1x     1x       1x   12x     12x 12x 12x     1x 11x 11x 11x   11x 11x 3x     8x 8x   4x 4x 4x 3x   1x       3x 3x 3x 1x       4x             1x  
import { Injectable } from '@angular/core';
import { Http, Response, ResponseOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import { NgRedux, select } from '@angular-redux/store';
 
import { IAppState } from '../state/AppState';
import { UiActions } from 'app/common/ui.actions/ui.actions';
import { HttpRequest } from '../actions/userActionType';
 
@Injectable()
export class HttpMiddleware {
 
  public invalidDataMessage = 'Data fetched is not valid';
 
  constructor(
    private ngRedux: NgRedux<IAppState>,
    private http: Http,
    private uiActions: UiActions,
  ) {}
 
  public httpMiddlewareFactory() {
    const vm = this;
    return function httpMiddleware(store) {
      return (next) => (action) => {
 
        const request: HttpRequest = action.httpRequest;
        if (!request) {
          return next(action);
        }
 
        vm.uiActions.incrementLoading(action.type);
        vm.http.get(request.url).subscribe(
          (response) => {
            const data = response.json();
            const isValid = !request.validateResponse || request.validateResponse(data);
            if (isValid) {
              store.dispatch(request.successAction(data));
            } else {
              store.dispatch(request.failedAction(new Error(vm.invalidDataMessage)));
            }
          },
          (error) => {
            vm.uiActions.decrementLoading(action.type);
            store.dispatch(request.failedAction(error));
            if (error.status === 404 && request.four0FourMessage) {
              vm.uiActions.setFour0FourMessage(`Action type: ${action.type}`, request.four0FourMessage, request.url);
            }
          },
          (/*complete*/) => {
            vm.uiActions.decrementLoading(action.type);
          }
        );
      };
    };
  }
 
}