From b3c524da51434c6897a1cc52eb77c4e6ec2fa022 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me>
Date: Wed, 28 Jun 2023 21:49:14 +0200
Subject: [PATCH] Add HttpManager (Axios interceptors)

---
 ExpressAPI/src/app.ts                  |  3 ++
 ExpressAPI/src/managers/HttpManager.ts | 54 ++++++++++++++++++++++++++
 2 files changed, 57 insertions(+)
 create mode 100644 ExpressAPI/src/managers/HttpManager.ts

diff --git a/ExpressAPI/src/app.ts b/ExpressAPI/src/app.ts
index 9ac8a09..938043e 100644
--- a/ExpressAPI/src/app.ts
+++ b/ExpressAPI/src/app.ts
@@ -5,8 +5,11 @@ require('dotenv').config();
 import WorkerRole     from './process/WorkerRole';
 import ClusterManager from './process/ClusterManager';
 import API            from './express/API';
+import HttpManager    from './managers/HttpManager';
 
 
+HttpManager.registerAxiosInterceptor();
+
 (new ClusterManager([ {
     role         : WorkerRole.API,
     quantity     : ClusterManager.CORES,
diff --git a/ExpressAPI/src/managers/HttpManager.ts b/ExpressAPI/src/managers/HttpManager.ts
new file mode 100644
index 0000000..bd6af93
--- /dev/null
+++ b/ExpressAPI/src/managers/HttpManager.ts
@@ -0,0 +1,54 @@
+import axios, { AxiosRequestHeaders } from 'axios';
+import Config                         from '../config/Config';
+import FormData                       from 'form-data';
+import logger                         from '../shared/logging/WinstonLogger';
+
+
+class HttpManager {
+    public handleCommandErrors: boolean = true;
+
+    private static _instance: HttpManager;
+
+    public static get instance(): HttpManager {
+        if ( !HttpManager._instance ) {
+            HttpManager._instance = new HttpManager();
+        }
+
+        return HttpManager._instance;
+    }
+
+    private constructor() { }
+
+    registerAxiosInterceptor() {
+        this.registerRequestInterceptor();
+        this.registerResponseInterceptor();
+    }
+
+    private registerRequestInterceptor() {
+        axios.interceptors.request.use((config) => {
+            if ( config.data instanceof FormData ) {
+                config.headers = { ...config.headers, ...(config.data as FormData).getHeaders() } as AxiosRequestHeaders;
+            }
+
+            if ( config.url && config.url.indexOf(Config.gitlab.apiURL) !== -1 ) {
+                config.headers['PRIVATE-TOKEN'] = Config.gitlab.account.token;
+            }
+
+            return config;
+        });
+    }
+
+    private registerResponseInterceptor() {
+        axios.interceptors.response.use((response) => {
+            return response;
+        }, (error) => {
+            logger.error(`${ JSON.stringify(error) }`);
+
+            return Promise.reject(error);
+        });
+    }
+}
+
+
+export default HttpManager.instance;
+
-- 
GitLab