diff --git a/docker-compose.yml b/docker-compose.yml index 74d3aab22531f49bdc0f4c868ccb542817a6cabf..1cadef7b8e19bae4ae297db1e18eacaaa30b3555 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 a7e95e2a831407c03d73b949e7e7fab3a8f1a9cc..a3f2fd39e13972cff04e4429622f6982fd5a8fd8 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 f08c79f3b05f0347ec1d5e37c9f3002a1f091c2b..529e8bd2d691382cff9f3e4455660959b82b0bd7 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 e6575240a5fada95160a73c3780cd692cb7a9dfb..3cd92a1e8b1c031b713a43af65218dbea624cc03 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 0000000000000000000000000000000000000000..1e2c6d364cfb0d75380e75c114476ff9a86767c7 --- /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 6000a0c5123a5692576d933700587143a65b9e92..0000000000000000000000000000000000000000 --- 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