diff --git a/api/src/engine/interceptors/headers.interceptor.ts b/api/src/engine/interceptors/headers.interceptor.ts index 9b28e4953456de5d9bc66a390c9cf452cf45306f..8dddccb93815c21cb0f92c79bd97d4fb293bfd35 100644 --- a/api/src/engine/interceptors/headers.interceptor.ts +++ b/api/src/engine/interceptors/headers.interceptor.ts @@ -1,17 +1,35 @@ import { HttpService } from '@nestjs/axios'; -import { Injectable, NestInterceptor, CallHandler } from '@nestjs/common'; +import { + CallHandler, + HttpException, + Inject, + Injectable, + Logger, + NestInterceptor, +} from '@nestjs/common'; import { GqlExecutionContext } from '@nestjs/graphql'; import { IncomingMessage } from 'http'; -import { Observable, tap } from 'rxjs'; +import { catchError, Observable, tap } from 'rxjs'; +import { ENGINE_MODULE_OPTIONS } from '../engine.constants'; +import { IEngineOptions } from '../engine.interfaces'; @Injectable() export class HeadersInterceptor implements NestInterceptor { - constructor(private httpService: HttpService) {} + private readonly logger: Logger; + + constructor( + private httpService: HttpService, + @Inject(ENGINE_MODULE_OPTIONS) private readonly options: IEngineOptions, + ) { + // Logger name is the engine name + // HttpService will be used mostly by the engine (but it's not always true) + this.logger = new Logger(options.type); + } intercept(context: GqlExecutionContext, next: CallHandler): Observable<any> { // cleaner : add only the auth header (should find the name) - const keys = ['cookie', 'x-xsrf-token']; + const keys = ['cookie', 'x-xsrf-token']; // should be a module parameter let headers = {}; switch (context.getType()) { @@ -29,7 +47,7 @@ export class HeadersInterceptor implements NestInterceptor { } } - Object.keys(headers) + Object.keys(headers) // copy needed keys .filter((key) => keys.includes(key)) .map((key) => key.toLowerCase()) .forEach((key) => { @@ -37,8 +55,17 @@ export class HeadersInterceptor implements NestInterceptor { }); return next.handle().pipe( + catchError((e) => { + if (!e.response.data || !e.response.status) return e; + + this.logger.log(e.message); + this.logger.verbose( + `[Error ${e.response.status}] ${e.response.data.message}`, + ); + throw new HttpException(e.response.data, e.response.status); // catch errors, maybe make it optional (module parameter) + }), tap(() => { - this.httpService.axiosRef.defaults.headers.common = {}; //cleaning request + this.httpService.axiosRef.defaults.headers.common = {}; // cleaning request }), ); }