Newer
Older
import {
HttpInterceptor, HttpRequest,
HttpHandler, HttpEvent, HttpErrorResponse
} from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { MainDataService } from './maindata.service';
import { ApiError } from './app.interfaces';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(
private mds: MainDataService,
// TODO separation of concerns: split into two interceptors,
// one for error handling, one for auth token addition
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
if (!this.mds.appConfig || this.mds.appConfig.isValidApiVersion) {
let tokenStr = '';
const authData = MainDataService.getAuthData();
if (authData) {
if (authData.token) {
tokenStr = authData.token;
}

mechtelm
committed
const requestA = request.clone({
setHeaders: {
AuthToken: tokenStr
}
});
return next.handle(requestA).pipe(
if (error instanceof HttpErrorResponse) { // TODO is the opposite case even possible?
const httpError = error as HttpErrorResponse;
apiError.code = httpError.status;
if (httpError.error instanceof ErrorEvent) {
this.mds.appError$.next({
label: 'Fehler in der Netzwerkverbindung',
description: httpError.message,
} else {
let ignoreError = false;
let goToLoginPage = false;
switch (httpError.status) {
case 202:
case 204:
case 207:
case 400:
ignoreError = true;
// apiError.info contains error = body
break;
goToLoginPage = true;
label = 'Bitte für diese Aktion erst anmelden!';
break;
label = 'Für diese Funktion haben Sie keine Berechtigung.';
break;
label = 'Daten/Objekt nicht gefunden.';
break;
goToLoginPage = true;
label = 'Anmeldung abgelaufen. Bitte erneut anmelden!';
break;
ignoreError = true;
// apiError.info = ?? TODO - from request body
label = 'Die übermittelten Objekte sind fehlerhaft!';
break;
label = 'Allgemeines Server-Problem.';
break;
if (!ignoreError) {
if (goToLoginPage) {
MainDataService.resetAuthData();
const state: RouterState = this.router.routerState;
this.router.navigate(['/r/login', snapshot.url]);
} else {
this.mds.appError$.next({
description: httpError.message,
});
}
return throwError(apiError);
})
this.mds.appError$.next({
label: 'Server-Problem: API-Version ungültig',
description: 'Keine weiteren Server-Aufrufe erlaubt',
category: 'FATAL'
});
return throwError(new ApiError(500, 'API-Version ungültig'));