FEAT: decorators to apply an origin in endpoint router

This commit is contained in:
marcos-silva-rodrigues
2025-01-06 15:25:28 -03:00
parent beb086ad3c
commit 7c0b87ffc3
2 changed files with 36 additions and 1 deletions
+32
View File
@@ -0,0 +1,32 @@
import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { SetMetadata } from '@nestjs/common';
export const SetOrigin = (origin: string) => SetMetadata('allowedOrigin', origin);
@Injectable()
export class CORSGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const response = context.switchToHttp().getResponse();
const request = context.switchToHttp().getRequest();
const origin = request.headers.origin;
// Obter a origem permitida através do decorador
const allowedOrigin = this.reflector.get<string>('allowedOrigin', context.getHandler());
if (process.env.ENV === "local") {
return true;
}
// Verifica se a origem da requisição é permitida
if (allowedOrigin && origin !== allowedOrigin) {
throw new ForbiddenException('Acesso não permitido pela política CORS');
}
response.setHeader('Access-Control-Allow-Origin', allowedOrigin);
return true;
}
}
@@ -1,5 +1,5 @@
import DadosferaLogger from '@dadosfera/dadosfera-logs';
import { Body, Controller, Inject, Post, UseFilters } from '@nestjs/common';
import { Body, Controller, Inject, Post, UseFilters, UseGuards } from '@nestjs/common';
import { ApiCreatedResponse, ApiHeaders, ApiOkResponse, ApiTags } from '@nestjs/swagger';
import { ApiInternalOnlyController } from 'src/decorators/swagger.decorator';
import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter';
@@ -8,6 +8,7 @@ import { UsersService } from '../users/users.service';
import { Language } from 'src/decorators/language.decorator';
import { OpenDataService } from './open-data.service';
import { CreateUserOpenDataDTO, WordpressForm } from './dto/wordpres-form';
import { CORSGuard, SetOrigin } from 'src/decorators/set-origin.decorator';
@Controller('open-data')
@ApiInternalOnlyController()
@@ -26,6 +27,8 @@ export class OpenDataController {
}
@Post("/sharing-ocean-data")
@SetOrigin('https://devsbm.dadosfera.io/')
@UseGuards(CORSGuard)
@ApiOkResponse()
async createUser(
@Body()