import { Message } from '@angular/compiler/src/i18n/i18n_ast'; import { ApiMessageCode } from '../types/ApiMessageCode'; import { Injectable } from '@angular/core'; import { Http, RequestOptions, Response, Headers } from '@angular/http'; import { Observable } from 'rxjs/Observable'; import { Router, ActivatedRoute, RouterStateSnapshot } from '@angular/router'; import { MatSnackBar } from '@angular/material'; import { TranslateService } from '@ngx-translate/core'; import { HttpClient } from '@angular/common/http'; import { AuthService } from '../../services/auth/auth.service'; import { SnackBarNotificationComponent } from '../../shared/components/notificaiton/snack-bar-notification.component'; import { BaseHttpResponseModel } from '../../models/http/BaseHttpResponseModel'; import { ApiResponseCode } from '@app/utilities/types/ApiResponseCode'; @Injectable() export class BaseHttpService { constructor( protected http: HttpClient, private router: Router, private authService: AuthService, public language: TranslateService, public snackBar: MatSnackBar, public route: ActivatedRoute ) { } get(url: string, options?: any, appendOptions: boolean = true): Observable { return this.interceptRepsonse(this.http.get(url, this.buildRequestOptions(appendOptions, options))); } post(url: string, body: any, options?: any, appendOptions: boolean = true): Observable { return this.interceptRepsonse(this.http.post(url, body, this.buildRequestOptions(appendOptions, options))); } put(url: string, body: any, options?: any, appendOptions: boolean = true): Observable { return this.interceptRepsonse(this.http.put(url, body, this.buildRequestOptions(appendOptions, options))); } delete(url: string, options?: any, appendOptions: boolean = true): Observable { return this.interceptRepsonse(this.http.delete(url, this.buildRequestOptions(appendOptions, options))); } patch(url: string, body: any, options?: any, appendOptions: boolean = true): Observable { return this.interceptRepsonse(this.http.patch(url, body, this.buildRequestOptions(appendOptions, options))); } head(url: string, options?: any, appendOptions: boolean = true): Observable { return this.interceptRepsonse(this.http.head(url, this.buildRequestOptions(appendOptions, options))); } options(url: string, options?: any, appendOptions: boolean = true): Observable { return this.interceptRepsonse(this.http.options(url, this.buildRequestOptions(appendOptions, options))); } protected buildRequestOptions(appendOptions: boolean, options?: any): Object { if (options == null) { options = new RequestOptions(); } if (options.headers == null) { options.headers = new Headers(); } if (!options.headers.has('Content-Type') && appendOptions) { options.headers = options.headers.set('Content-Type', 'application/json'); } if (!options.headers.has('Content-Type') && appendOptions) { options.headers = options.headers.set('Content-Type', 'application/json'); } if (!options.headers.has('AuthToken')) { const principal = this.authService.current(); if (principal) { options.headers = options.headers.set('AuthToken', principal.token); } } return options; } private interceptRepsonse(observable: Observable): Observable { return observable .catch((errorResponse) => { if (errorResponse.status === 401) { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGOUT', language: this.language }, duration: 3000, extraClasses: ['snackbar-success'] }) let currentPage = this.router.url; this.router.navigate(['/unauthorized'], { queryParams: { returnUrl: currentPage } }); //this.notification.httpError(error); return Observable.of(); } else { let error: any = errorResponse.error if (error.statusCode == ApiMessageCode.ERROR_MESSAGE) { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: error.message, language: null }, duration: 3000, extraClasses: ['snackbar-warning'] }) return Observable.throw(errorResponse); } else { this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: 'GENERAL.ERRORS.HTTP-REQUEST-ERROR', language: this.language }, duration: 3000, extraClasses: ['snackbar-warning'] }) return Observable.throw(errorResponse); } } }) .map(response => { if (response instanceof Blob) return response if (response.statusCode == ApiMessageCode.SUCCESS_MESSAGE) { //throw new Error('Request failed'); this.snackBar.openFromComponent(SnackBarNotificationComponent, { data: { message: response.message, language: null }, duration: 3000, extraClasses: ['snackbar-success'] }) return response.payload; } else if (response.statusCode == ApiMessageCode.NO_MESSAGE) { return response.payload; } else { return response.payload; } }); } // public handleResponse(response: BaseHttpResponseModel) { // if (response.statusCode < 200 || response.statusCode >= 300) { // //throw new Error('Request failed'); // this.snackBar.openFromComponent(SnackBarNotificationComponent, { // data: { message: 'GENERAL.ERRORS.HTTP-REQUEST-ERROR', language: this.language }, // duration: 3000, // extraClasses: ['snackbar-warning'] // }) // } // else { // return response.payload; // } // } }