import { Observable, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { Inject, Injectable } from '@angular/core'; import { HttpClient, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; import { colorsEnum } from '../../../shared'; import { ToastService, toastPositionEnum } from '../../../elements'; import { Data } from '@angular/router'; @Injectable() export class HttpClientRequestService implements HttpInterceptor { private isRefreshToken: boolean; constructor( private readonly http: HttpClient, private readonly toastService: ToastService, @Inject('OAuthModel') private readonly oAuthModel, @Inject('Environment') private readonly environment, ) {} public intercept(request: HttpRequest, next: HttpHandler): Observable> { const { url } = request; return next.handle(request.clone({ setHeaders: { Authorization: this.isRefreshToken ? '' : `Bearer ${ this.oAuthModel.data.token }`, }, url: `${ this.environment.api }${ url }`, })).pipe( map((event: HttpEvent) => event), catchError((event) => { this.checkError(event, request); return throwError(event.error); }) ); } private checkError(error, request) { if (error.status >= 500) { this.handleError500(error); } else if (error.status === 403) { this.isRefreshToken = true; this.handleRefreshToken(error, request); } } private handleError500({ error }): void { this.toastService.open({ message: error.message, type: colorsEnum.error, duration: 30000000, dismissible: true, position: toastPositionEnum.topCenter }); } private handleRefreshToken(event, request): void { this.http.post(this.environment.refreshPath, { token: this.oAuthModel.data.token, refreshToken: this.oAuthModel.data.refreshToken, }).toPromise() .then((data: Data) => { this.oAuthModel.data = data; this.isRefreshToken = false; }).catch(() => { this.oAuthModel.data = {}; this.isRefreshToken = false; }); } }