Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
app.interceptor.ts 3.86 KiB
import { MainDataService } from './maindata.service';
import { Injectable } from '@angular/core';
import {
  HttpInterceptor, HttpRequest,
  HttpHandler, HttpEvent, HttpErrorResponse
} from '@angular/common/http';
import {Observable, throwError} from 'rxjs';
import {catchError} from "rxjs/operators";
import {Router, RouterState, RouterStateSnapshot} from "@angular/router";
import {ApiError} from "./app.interfaces";

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  constructor(
    private mds: MainDataService,
    private router: Router) {}

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (!this.mds.isApiValid) {
      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"));
    }

    // if (request.headers.get('AuthToken') !== null) {
    //   return next.handle(request);
    // }
    let tokenStr = '';
    const authData = MainDataService.getAuthData();
    if (authData) {
      if (authData.token) {
        tokenStr = authData.token;
      }
    }

    const requestA = request.clone({
      setHeaders: {
        AuthToken: tokenStr
      }
    });

    return next.handle(requestA).pipe(
      catchError(e => {
        let apiError = new ApiError(999);
        if (e instanceof HttpErrorResponse) {
          const httpError = e as HttpErrorResponse;
          apiError.code = httpError.status;
          apiError.info = httpError.message + " // " + httpError.error;
          if (httpError.error instanceof ErrorEvent) {
            this.mds.appError$.next({
              label: 'Fehler in der Netzwerkverbindung',
              description: httpError.message,
              category: "PROBLEM"
            })
          } else {
            let ignoreError = false;
            let goToLoginPage = false;
            let label = 'Unbekanntes Verbindungsproblem';
            switch (httpError.status) {
              case 400: {
                ignoreError = true;
                // apiError.info = ?? TODO - from request body
                break;
              }
              case 401: {
                goToLoginPage = true;
                label = 'Bitte für diese Aktion erst anmelden!';
                break;
              }
              case 403: {
                label = 'Für diese Funktion haben Sie keine Berechtigung.';
                break;
              }
              case 404: {
                label = 'Daten/Objekt nicht gefunden.';
                break;
              }
              case 410: {
                goToLoginPage = true;
                label = 'Anmeldung abgelaufen. Bitte erneut anmelden!';
                break;
              }
              case 422: {
                ignoreError = true;
                // apiError.info = ?? TODO - from request body
                label = 'Die übermittelten Objekte sind fehlerhaft!';
                break;
              }
              case 500: {
                label = 'Allgemeines Server-Problem.';
                break;
              }
            }
            if (!ignoreError) {
              if (goToLoginPage) {
                console.warn('AuthError' + httpError.status + ' (' + label + ')');
                MainDataService.resetAuthData();
                const state: RouterState = this.router.routerState;
                const snapshot: RouterStateSnapshot = state.snapshot;
                this.router.navigate(['/r/login', snapshot.url]);
              } else {
                this.mds.appError$.next({
                  label: label,
                  description: httpError.message,
                  category: "PROBLEM"
                });
              }
            }
          }
        }

        return throwError(apiError);
      })
    )
  }
}