Skip to content
Snippets Groups Projects
app.interceptor.ts 4.06 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { Injectable } from '@angular/core';
    
    paflov's avatar
    paflov committed
    import { Router, RouterState } from '@angular/router';
    
    import {
      HttpInterceptor, HttpRequest,
      HttpHandler, HttpEvent, HttpErrorResponse
    } from '@angular/common/http';
    
    rhenck's avatar
    rhenck committed
    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,
    
    paf's avatar
    paf committed
        private router: Router
      ) {}
    
    rhenck's avatar
    rhenck committed
      // TODO separation of concerns: split into two interceptors,
      // one for error handling, one for auth token addition
    
    paflov's avatar
    paflov committed
      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;
            }
    
          const requestA = request.clone({
            setHeaders: {
              AuthToken: tokenStr
            }
          });
    
          return next.handle(requestA).pipe(
    
    paflov's avatar
    paflov committed
            catchError(error => {
    
    paf's avatar
    paf committed
              const apiError = new ApiError(999);
    
    paflov's avatar
    paflov committed
              if (error instanceof HttpErrorResponse) { // TODO is the opposite case even possible?
                const httpError = error as HttpErrorResponse;
    
                apiError.code = httpError.status;
    
    paflov's avatar
    paflov committed
                apiError.info = `${httpError.message} // ${httpError.error}`;
    
                if (httpError.error instanceof ErrorEvent) {
                  this.mds.appError$.next({
                    label: 'Fehler in der Netzwerkverbindung',
                    description: httpError.message,
    
    paf's avatar
    paf committed
                    category: 'PROBLEM'
                  });
    
                } else {
                  let ignoreError = false;
                  let goToLoginPage = false;
    
    paflov's avatar
    paflov committed
                  let label;
    
                    case 202:
                    case 204:
                    case 207:
                    case 400:
    
                      // apiError.info contains error = body
    
                      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;
    
    paflov's avatar
    paflov committed
                    default:
                      label = 'Unbekanntes Verbindungsproblem';
    
                  if (!ignoreError) {
                    if (goToLoginPage) {
    
    paflov's avatar
    paflov committed
                      console.warn(`AuthError${httpError.status} (${label})`);
    
                      MainDataService.resetAuthData();
                      const state: RouterState = this.router.routerState;
    
    paflov's avatar
    paflov committed
                      const { snapshot } = state;
    
                      this.router.navigate(['/r/login', snapshot.url]);
                    } else {
                      this.mds.appError$.next({
    
    paflov's avatar
    paflov committed
                        label,
    
    paf's avatar
    paf committed
                        category: 'PROBLEM'
    
    paf's avatar
    paf committed
          );
    
    paflov's avatar
    paflov committed
        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'));