From 8f0a640aa9a5e3e21ce548fb9e034f5cf4f35f16 Mon Sep 17 00:00:00 2001
From: FORESTIER Fabien <fabien.forestier@soprasteria.com>
Date: Wed, 27 Feb 2019 10:06:45 +0100
Subject: [PATCH] Put group header name and and email writer group name as
 variable + update email-writer middleware error codes

---
 docker-compose.yml                         |  2 ++
 src/app.module.ts                          |  7 +++---
 src/configuration/config.service.ts        |  2 ++
 src/configuration/config.ts                |  2 ++
 src/middlewares/email-writer.middleware.ts | 29 ++++++++++++++++++++++
 src/middlewares/microservice.middleware.ts | 17 -------------
 6 files changed, 39 insertions(+), 20 deletions(-)
 create mode 100644 src/middlewares/email-writer.middleware.ts
 delete mode 100644 src/middlewares/microservice.middleware.ts

diff --git a/docker-compose.yml b/docker-compose.yml
index 74d3aab..1cadef7 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -12,6 +12,8 @@ services:
       - PLATEFORM_DATA_EMAIL=${DEV_PLATEFORM_DATA_EMAIL}
       - RABBITMQ_USER=${DEV_RABBITMQ_USER}
       - RABBITMQ_PASSWORD=${DEV_RABBITMQ_PASSWORD}
+      - GROUP_HEADER='x-consumer-groups'
+      - EMAIL_WRITER_GROUP_NAME='email-writer'
     restart: unless-stopped
   rabbitmq:
     image: 'rabbitmq:3-management-alpine'
diff --git a/src/app.module.ts b/src/app.module.ts
index a7e95e2..a3f2fd3 100644
--- a/src/app.module.ts
+++ b/src/app.module.ts
@@ -1,7 +1,7 @@
 import { Module, MiddlewareConsumer, RequestMethod } from '@nestjs/common';
 import { EmailModule } from './email/email.module';
 import { ConfigModule } from './configuration/config.module';
-import { microserviceMiddleware } from './middlewares/microservice.middleware';
+import { EmailWriterMiddleware } from './middlewares/email-writer.middleware';
 
 @Module({
   imports: [ConfigModule, EmailModule],
@@ -10,9 +10,10 @@ import { microserviceMiddleware } from './middlewares/microservice.middleware';
 })
 export class AppModule {
   configure(consumer: MiddlewareConsumer) {
-    // Applying the middleware that takes the Authorization header jwt payload and put it in the request headers
+    // Applying the middleware that verify if there is the right group in header
+    // and takes the Authorization header jwt payload and put it in the request headers
     consumer
-      .apply(microserviceMiddleware).forRoutes(
+      .apply(EmailWriterMiddleware).forRoutes(
         { path: 'email/send', method: RequestMethod.POST },
       );
   }
diff --git a/src/configuration/config.service.ts b/src/configuration/config.service.ts
index f08c79f..529e8bd 100644
--- a/src/configuration/config.service.ts
+++ b/src/configuration/config.service.ts
@@ -21,6 +21,8 @@ export class ConfigService {
     this._config.rabbitMQ.user = process.env.RABBITMQ_USER;
     this._config.rabbitMQ.password = process.env.RABBITMQ_PASSWORD;
     this._config.plateformDataEmail = process.env.PLATEFORM_DATA_EMAIL;
+    this._config.emailWriterGroupName = process.env.EMAIL_WRITER_GROUP_NAME;
+    this._config.groupHeader = process.env.GROUP_HEADER;
   }
 
   get config() {
diff --git a/src/configuration/config.ts b/src/configuration/config.ts
index e657524..3cd92a1 100644
--- a/src/configuration/config.ts
+++ b/src/configuration/config.ts
@@ -8,4 +8,6 @@ export const config = {
   mailerQueue: 'portail-data-send-email',
   plateformDataEmail: '',
   imageHost: 'https://highway-to-data.alpha.grandlyon.com/email-template-assets',
+  emailWriterGroupName: '',
+  groupHeader: '',
 };
\ No newline at end of file
diff --git a/src/middlewares/email-writer.middleware.ts b/src/middlewares/email-writer.middleware.ts
new file mode 100644
index 0000000..1e2c6d3
--- /dev/null
+++ b/src/middlewares/email-writer.middleware.ts
@@ -0,0 +1,29 @@
+import { Logger, ForbiddenException, NestMiddleware, Injectable, UnauthorizedException } from '@nestjs/common';
+import { ConfigService } from 'configuration/config.service';
+
+@Injectable()
+export class EmailWriterMiddleware implements NestMiddleware {
+
+  constructor(private configService: ConfigService) {
+  }
+
+  resolve() {
+    return (req, res, next) => {
+      Logger.log('[-] Untokenise middleware called');
+
+      const groupHeaderName = this.configService.config.groupHeader;
+      if (req.headers[groupHeaderName]) {
+        let arr = req.headers[groupHeaderName].split(',');
+        arr = arr.map(e => e.trim());
+        const group = arr.find(e => e === this.configService.config.emailWriterGroupName);
+        if (group === undefined) {
+          throw new ForbiddenException('You can\'t access this ressource.');
+        } else {
+          next();
+        }
+      } else {
+        throw new UnauthorizedException('You can\'t access this ressource.');
+      }
+    };
+  }
+}
\ No newline at end of file
diff --git a/src/middlewares/microservice.middleware.ts b/src/middlewares/microservice.middleware.ts
deleted file mode 100644
index 6000a0c..0000000
--- a/src/middlewares/microservice.middleware.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Logger, ForbiddenException } from '@nestjs/common';
-
-export function microserviceMiddleware(req, res, next) {
-  Logger.log('[-] Untokenise middleware called');
-  if (req.headers['x-consumer-groups']) {
-    let arr = req.headers['x-consumer-groups'].split(',');
-    arr = arr.map(e => e.trim());
-    const group = arr.find(e => e === 'microservice');
-    if (group === undefined) {
-      throw new ForbiddenException('You can\'t access this ressource.');
-    } else {
-      next();
-    }
-  } else {
-    throw new ForbiddenException('You can\'t access this ressource.');
-  }
-}
\ No newline at end of file
-- 
GitLab