From e5d9ac2fbfafec2255cd988370d93fae7f3afe0d Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Wed, 2 Apr 2025 16:48:10 -0300 Subject: [PATCH] FEAT: network policy endpoint --- src/app.module.ts | 4 +- .../network-policy/dto/network-policy.dto.ts | 6 ++ .../network-policy.controller.ts | 52 ++++++++++++++++ .../network-policy/network-policy.module.ts | 19 ++++++ .../network-policy/network-policy.service.ts | 60 +++++++++++++++++++ 5 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 src/modules/network-policy/dto/network-policy.dto.ts create mode 100644 src/modules/network-policy/network-policy.controller.ts create mode 100644 src/modules/network-policy/network-policy.module.ts create mode 100644 src/modules/network-policy/network-policy.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index 3e54fde..fedb388 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -28,6 +28,7 @@ import { MixpanelModule } from './modules/mixpanel/mixpanel.module'; import { CustomersModule } from './modules/customers/customers.module'; import { OpenDataModule } from './modules/open-data/open-data.module'; import { ThemeModule } from './modules/theme/theme.module'; +import { NetworkPolicyModule } from './modules/network-policy/network-policy.module'; @Module({ providers: [ @@ -62,7 +63,8 @@ import { ThemeModule } from './modules/theme/theme.module'; OpenDataModule, ThemeModule, //Always leave HealthModule last, so it is on the bottom of swagger - HealthModule + HealthModule, + NetworkPolicyModule ], }) export class AppModule {} diff --git a/src/modules/network-policy/dto/network-policy.dto.ts b/src/modules/network-policy/dto/network-policy.dto.ts new file mode 100644 index 0000000..ec4f6c2 --- /dev/null +++ b/src/modules/network-policy/dto/network-policy.dto.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from "@nestjs/swagger"; + +export class NetworkPoliciesDTO { + @ApiProperty() + policies: string [] +} \ No newline at end of file diff --git a/src/modules/network-policy/network-policy.controller.ts b/src/modules/network-policy/network-policy.controller.ts new file mode 100644 index 0000000..25f3074 --- /dev/null +++ b/src/modules/network-policy/network-policy.controller.ts @@ -0,0 +1,52 @@ +import { Body, Controller, Delete, HttpCode, HttpStatus, Post } from '@nestjs/common'; +import { ApiOkResponse } from '@nestjs/swagger'; +import { PERMISSIONS_GROUPS } from 'src/authentication/permissions.enum'; +import { + Authenticated, + RequireAllPermissions, +} from 'src/decorators/authentication.decorator'; +import { NetworkPoliciesDTO } from './dto/network-policy.dto'; +import { RequestUser, User } from 'src/decorators/user.decorator'; +import { NetworkPolicyService } from './network-policy.service'; +import { PackTheMetadata } from 'src/utils/ PackTheMetadata'; + +@Controller('network-policy') +export class NetworkPolicyController { + constructor(private networkPolicyService: NetworkPolicyService) {} + + @Post() + @Authenticated() + @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) + @ApiOkResponse() + @HttpCode(HttpStatus.OK) + async applyNetworkPolicies( + @User() user: RequestUser, + @Body() data: NetworkPoliciesDTO, + ) { + const metadata = PackTheMetadata(user); + + return await this.networkPolicyService.apply( + data.policies, + user.customer_id, + metadata, + ); + } + + @Delete() + @Authenticated() + @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) + @ApiOkResponse() + @HttpCode(HttpStatus.OK) + async removeNetworkPolicies( + @User() user: RequestUser, + @Body() data: NetworkPoliciesDTO, + ) { + const metadata = PackTheMetadata(user); + + return await this.networkPolicyService.delete( + data.policies, + user.customer_id, + metadata, + ); + } +} diff --git a/src/modules/network-policy/network-policy.module.ts b/src/modules/network-policy/network-policy.module.ts new file mode 100644 index 0000000..34e2e36 --- /dev/null +++ b/src/modules/network-policy/network-policy.module.ts @@ -0,0 +1,19 @@ +import { Module } from '@nestjs/common'; +import { NetworkPolicyController } from './network-policy.controller'; +import { NetworkPolicyService } from './network-policy.service'; +import { ClientsModule } from '@nestjs/microservices'; +import { DucClient } from '../duc/client.config'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; + +const ducClient = new DucClient(); + +@Module({ + imports: [ + ClientsModule.register([ + ducClient.providerOptions + ]), + ], + controllers: [NetworkPolicyController], + providers: [NetworkPolicyService, DadosferaLogger] +}) +export class NetworkPolicyModule {} diff --git a/src/modules/network-policy/network-policy.service.ts b/src/modules/network-policy/network-policy.service.ts new file mode 100644 index 0000000..a411c77 --- /dev/null +++ b/src/modules/network-policy/network-policy.service.ts @@ -0,0 +1,60 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { DucClient } from '../duc/client.config'; +import { ClientGrpc } from '@nestjs/microservices'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; +import { CustomersProtoService } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; +import { ProtoServices } from '@dadosfera/protospack-v2/dist/lib/Duc'; +import { Metadata } from '@grpc/grpc-js'; +import { lastValueFrom } from 'rxjs'; + +@Injectable() +export class NetworkPolicyService { + private customerService: CustomersProtoService; + private logger: DadosferaLogger; + + constructor( + @Inject(DucClient.name) private readonly grpcClient: ClientGrpc, + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + ) { + this.logger = dadosferaLogger.logger; + } + + onModuleInit() { + this.customerService = this.grpcClient.getService( + ProtoServices.CustomersProtoService, + ); + } + + async apply( + networkPolicies: string[], + customerId: string, + metadata: Metadata, + ) { + return await lastValueFrom( + this.customerService.CustomerCreateNetworkPolicy( + { + customerId, + networkPolicies, + }, + metadata, + ), + ); + } + + async delete( + networkPolicies: string[], + customerId: string, + metadata: Metadata, + ) { + return await lastValueFrom( + this.customerService.CustomerRemoveNetworkPolicy( + { + customerId, + networkPolicies, + }, + metadata, + ), + ); + } +}