Untitled

 avatar
unknown
plain_text
2 years ago
2.3 kB
3
Indexable
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
  const authenticatedHttpCall = request.headers.get('No-Auth') !== 'True';

  // Se a chamada necessita de autenticação, os headers do gateway são adicionados
  if (authenticatedHttpCall) {
    const defaultHeaders = {
      'Accept': '*/*'
    };

    return this.asgardeoAuthService.getAccessToken().pipe(
      switchMap(accessToken => {
        if (accessToken) {
          defaultHeaders['Authorization'] = 'Bearer ' + accessToken;
        }

        if (localStorage.idEmpresaLogada !== null && localStorage.idEmpresaLogada !== undefined) {
          defaultHeaders['api-company-id'] = localStorage.idEmpresaLogada;
        }

        if (request.headers.get('Content-Type') !== 'application/json') {
          if (request.body?.constructor?.name !== 'FormData') {
            defaultHeaders['Content-type'] = 'application/x-www-form-urlencoded, multipart/form-data';
          }
        }

        const headers = Object.entries(defaultHeaders)
          .reduce((headers, [key, value]) => {
            if (headers.has(key)) {
              return headers.append(key, value);
            }
            return headers.set(key, value);
          }, request.headers);

        request = request.clone({
          setHeaders: headers.keys().reduce((acc, key) => {
            acc[key] = headers.getAll(key);
            return acc;
          }, {})
        });

        return next.handle(request).pipe(
          map((response: HttpResponse<any>) => {
            // Qualquer requisição via API que é chamada vai passar por essa Arrow function (resposta da API)

            if (response.headers?.get('www-authenticate')) {
              response.headers.delete('www-authenticate');
            }

            if (response.status > 399) {
              throw response;
            }

            // Para interceptar qualquer API basta criar uma lógica dentro desta camada, e caso seja necessário utilizar o RESPONSE

            return response;
          }),
          catchError(error => {
            CustomErrorHandler.handleError(error);
            return this.showError(error);
          })
        );
      })
    );
  }

  return next.handle(request);
}