From 037f5cfec0302307b9ae823c0d67d578d7afd34b Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Wed, 27 Jul 2022 08:41:32 -0300 Subject: [PATCH 1/3] FEAT: new conection test module --- package-lock.json | 14 +-- package.json | 2 +- src/app.module.ts | 3 + .../connection-test.controller.spec.ts | 18 +++ .../connection-test.controller.ts | 108 +++++++++++++++++ .../connection-test/connection-test.module.ts | 10 ++ .../connection-test.service.spec.ts | 18 +++ .../connection-test.service.ts | 42 +++++++ .../connection-test/dto/connection-test.ts | 112 ++++++++++++++++++ src/modules/connection/dtos/connection.ts | 18 +++ .../connection/dtos/create-connection.ts | 6 +- 11 files changed, 340 insertions(+), 11 deletions(-) create mode 100644 src/modules/connection-test/connection-test.controller.spec.ts create mode 100644 src/modules/connection-test/connection-test.controller.ts create mode 100644 src/modules/connection-test/connection-test.module.ts create mode 100644 src/modules/connection-test/connection-test.service.spec.ts create mode 100644 src/modules/connection-test/connection-test.service.ts create mode 100644 src/modules/connection-test/dto/connection-test.ts create mode 100644 src/modules/connection/dtos/connection.ts diff --git a/package-lock.json b/package-lock.json index 3b533d9..e8176d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.2", - "protospack-v2": "3.8.11", + "protospack-v2": "^3.9.0-beta.4", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", @@ -9018,9 +9018,9 @@ } }, "node_modules/protospack-v2": { - "version": "3.8.11", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.8.11.tgz", - "integrity": "sha512-xInbwBwbRrir7Pmgdt4Qv7cA5gjfzHRLl/LOR24vfeXiGO8kome+iAUvk68pwsg529XL1fIl1rOMTsSakCMY9A==", + "version": "3.9.0-beta.4", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.4.tgz", + "integrity": "sha512-T1T6g1+qusecCGySLA4FSn5O1u+RyZkhIaO6De1701HrNcJM7jBZjYsN1qHr49vQ7TMeibtKyiVqpqZSoPeBBg==", "dependencies": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", @@ -17247,9 +17247,9 @@ } }, "protospack-v2": { - "version": "3.8.11", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.8.11.tgz", - "integrity": "sha512-xInbwBwbRrir7Pmgdt4Qv7cA5gjfzHRLl/LOR24vfeXiGO8kome+iAUvk68pwsg529XL1fIl1rOMTsSakCMY9A==", + "version": "3.9.0-beta.4", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.4.tgz", + "integrity": "sha512-T1T6g1+qusecCGySLA4FSn5O1u+RyZkhIaO6De1701HrNcJM7jBZjYsN1qHr49vQ7TMeibtKyiVqpqZSoPeBBg==", "requires": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", diff --git a/package.json b/package.json index 2e69580..ad763f4 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.2", - "protospack-v2": "3.8.11", + "protospack-v2": "^3.9.0-beta.4", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", diff --git a/src/app.module.ts b/src/app.module.ts index 575f6d8..d9b13dc 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -43,6 +43,7 @@ import { PermissionsModule } from './modules/permissions/permissions.module'; import { DadosferaLogger } from 'dadosfera-logs'; import { TermsOfUseModule } from './modules/termsOfUse/termsOfUse.module'; import { ConnectionModule } from './modules/connection/connection.module'; +import { ConnectionTestModule } from './modules/connection-test/connection-test.module'; const inputClient = new InputsClientConfiguration(); const outputClient = new OutputsClientConfiguration(); @@ -111,6 +112,8 @@ const transformationClient = new TransformationsClientConfiguration(); ...pipelineClient.config(), }, ]), + + ConnectionTestModule, ], }) export class AppModule {} diff --git a/src/modules/connection-test/connection-test.controller.spec.ts b/src/modules/connection-test/connection-test.controller.spec.ts new file mode 100644 index 0000000..efe3fe0 --- /dev/null +++ b/src/modules/connection-test/connection-test.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ConnectionTestController } from './connection-test.controller'; + +describe('ConnectionTestController', () => { + let controller: ConnectionTestController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ConnectionTestController], + }).compile(); + + controller = module.get(ConnectionTestController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/modules/connection-test/connection-test.controller.ts b/src/modules/connection-test/connection-test.controller.ts new file mode 100644 index 0000000..4fc1e5c --- /dev/null +++ b/src/modules/connection-test/connection-test.controller.ts @@ -0,0 +1,108 @@ +import { + Body, + Controller, + HttpCode, + HttpStatus, + Inject, + Post, + ValidationPipe, +} from '@nestjs/common'; +import { ApiOkResponse, ApiTags } from '@nestjs/swagger'; +import { User, RequestUser } from 'src/authentication/user.decorator'; +import { ConnectionTestService } from './connection-test.service'; +import { + ConnectionTestPingRes, + ConnectionTestPingReq, + ConnectionTestCredentialsReq, + ConnectionTestCredentialsRes, + ConnectionTestListSchemasReq, + ConnectionTestListSchemasRes, + ConnectionTestListTablesReq, + ConnectionTestListTablesRes, + GetTableMetadataRes, + GetTableMetadataReq, +} from './dto/connection-test'; +import { DadosferaLogger } from 'dadosfera-logs'; + +@ApiTags('Connection Test') +@Controller('connection-test') +export class ConnectionTestController { + logger: any; + constructor( + private connectionTestService: ConnectionTestService, + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + ) { + this.logger = dadosferaLogger.logger; + } + + @Post('ping') + @ApiOkResponse({ type: ConnectionTestPingRes }) + @HttpCode(HttpStatus.OK) + async connectionTestPing( + @User() user: RequestUser, + @Body(new ValidationPipe()) body: ConnectionTestPingReq, + ) { + this.logger.info('/connection-test/ping', { + user: user.user_id, + customer: user.customer_name, + }); + await this.connectionTestService.connectionTestPing(body); + } + + @Post('credentials') + @ApiOkResponse({ type: ConnectionTestCredentialsRes }) + @HttpCode(HttpStatus.OK) + async connectionTestCredentials( + @User() user: RequestUser, + @Body(new ValidationPipe()) body: ConnectionTestCredentialsReq, + ) { + this.logger.info('/connection-test/credentials', { + user: user.user_id, + customer: user.customer_name, + }); + await this.connectionTestService.connectionTestCredentials(body); + } + + @Post('schemas') + @ApiOkResponse({ type: ConnectionTestListSchemasRes }) + @HttpCode(HttpStatus.OK) + async connectionTestListSchemas( + @User() user: RequestUser, + @Body(new ValidationPipe()) body: ConnectionTestListSchemasReq, + ) { + this.logger.info('/connection-test/schemas', { + user: user.user_id, + customer: user.customer_name, + }); + await this.connectionTestService.connectionTestListSchemas(body); + } + + @Post('tables') + @ApiOkResponse({ type: ConnectionTestListTablesRes }) + @HttpCode(HttpStatus.OK) + async connectionTestListTables( + @User() user: RequestUser, + @Body(new ValidationPipe()) body: ConnectionTestListTablesReq, + ) { + this.logger.info('/connection-test/tables', { + user: user.user_id, + customer: user.customer_name, + }); + await this.connectionTestService.connectionTestListTables(body); + } + + @Post('table-metadata') + @ApiOkResponse({ type: GetTableMetadataRes }) + @HttpCode(HttpStatus.OK) + async getTableMetadata( + @User() user: RequestUser, + @Body(new ValidationPipe()) body: GetTableMetadataReq, + ) { + this.logger.info('/connection-test/tables', { + user: user.user_id, + customer: user.customer_name, + }); + await this.connectionTestService.getTableMetadata(body); + } +} diff --git a/src/modules/connection-test/connection-test.module.ts b/src/modules/connection-test/connection-test.module.ts new file mode 100644 index 0000000..93cc1bf --- /dev/null +++ b/src/modules/connection-test/connection-test.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { ConnectionTestController } from './connection-test.controller'; +import { ConnectionTestService } from './connection-test.service'; +import { DadosferaLogger } from 'dadosfera-logs'; + +@Module({ + controllers: [ConnectionTestController], + providers: [ConnectionTestService, DadosferaLogger], +}) +export class ConnectionTestModule {} diff --git a/src/modules/connection-test/connection-test.service.spec.ts b/src/modules/connection-test/connection-test.service.spec.ts new file mode 100644 index 0000000..3b44f65 --- /dev/null +++ b/src/modules/connection-test/connection-test.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ConnectionTestService } from './connection-test.service'; + +describe('ConnectionTestService', () => { + let service: ConnectionTestService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ConnectionTestService], + }).compile(); + + service = module.get(ConnectionTestService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/modules/connection-test/connection-test.service.ts b/src/modules/connection-test/connection-test.service.ts new file mode 100644 index 0000000..1475ba3 --- /dev/null +++ b/src/modules/connection-test/connection-test.service.ts @@ -0,0 +1,42 @@ +import { Injectable } from '@nestjs/common'; +import { + ConnectionTestCredentialsReq, + ConnectionTestCredentialsRes, + ConnectionTestListSchemasReq, + ConnectionTestListSchemasRes, + ConnectionTestListTablesReq, + ConnectionTestListTablesRes, + ConnectionTestPingReq, + ConnectionTestPingRes, + GetTableMetadataReq, + GetTableMetadataRes, +} from './dto/connection-test'; + +@Injectable() +export class ConnectionTestService { + async connectionTestPing( + body: ConnectionTestPingReq, + ): Promise { + return { operation_result: true }; + } + async connectionTestCredentials( + body: ConnectionTestCredentialsReq, + ): Promise { + return { operation_result: true, connection_id: '' }; + } + async connectionTestListSchemas( + body: ConnectionTestListSchemasReq, + ): Promise { + return { operation_result: true, schema_list: [] }; + } + async connectionTestListTables( + body: ConnectionTestListTablesReq, + ): Promise { + return { operation_result: true, table_list: [] }; + } + async getTableMetadata( + body: GetTableMetadataReq, + ): Promise { + return { table_metadata: [{ columns: [], table_name: '' }] }; + } +} diff --git a/src/modules/connection-test/dto/connection-test.ts b/src/modules/connection-test/dto/connection-test.ts new file mode 100644 index 0000000..1addb78 --- /dev/null +++ b/src/modules/connection-test/dto/connection-test.ts @@ -0,0 +1,112 @@ +import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger'; +import { IsString, IsObject } from 'class-validator'; +import { DatabaseConnectionPropertiesDto } from 'src/modules/connection/dtos/connection'; +import { CreateConnectionDto } from 'src/modules/connection/dtos/create-connection'; +export class ColumnDto { + @ApiProperty() + name: string; + @ApiProperty() + type: string; +} +export class TableMetadataDto { + @ApiProperty() + table_name: string; + @ApiProperty({ type: [ColumnDto] }) + columns: ColumnDto[]; +} + +export class ConnectionTestPingReq { + @ApiProperty() + @IsString() + plugin: string; + + @ApiProperty() + @IsString() + endpoint: string; + + @ApiProperty() + @IsString() + port: string; + + @ApiPropertyOptional() + @IsString() + network_config_id?: string; +} + +export class ConnectionTestPingRes { + @ApiProperty() + operation_result: boolean; +} + +export class ConnectionTestCredentialsReq extends OmitType( + CreateConnectionDto, + ['properties'], +) { + @ApiProperty() + @IsObject() + properties: DatabaseConnectionPropertiesDto; +} + +export class ConnectionTestCredentialsRes { + @ApiProperty() + operation_result: boolean; + @ApiProperty() + connection_id: string; +} + +export class ConnectionTestListSchemasReq { + @ApiProperty() + @IsString() + plugin: string; + + @ApiProperty() + @IsString() + connection_id: string; +} + +export class ConnectionTestListSchemasRes { + @ApiProperty() + operation_result: boolean; + @ApiProperty() + schema_list: string[]; +} + +export class ConnectionTestListTablesReq { + @ApiProperty() + @IsString() + plugin: string; + + @ApiProperty() + @IsString() + connection_id: string; + + @ApiProperty() + @IsString() + schema_name: string; +} + +export class ConnectionTestListTablesRes { + @ApiProperty() + operation_result: boolean; + @ApiProperty() + table_list: string[]; +} + +export class GetTableMetadataReq { + @ApiProperty() + @IsString() + plugin: string; + + @ApiProperty() + @IsString() + schema: string; + + @ApiProperty() + @IsString() + table_list: string[]; +} + +export class GetTableMetadataRes { + @ApiProperty({ type: [TableMetadataDto] }) + table_metadata: TableMetadataDto[]; +} diff --git a/src/modules/connection/dtos/connection.ts b/src/modules/connection/dtos/connection.ts new file mode 100644 index 0000000..d68872c --- /dev/null +++ b/src/modules/connection/dtos/connection.ts @@ -0,0 +1,18 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class DatabaseConnectionPropertiesDto { + credentials_type: 'basic_auth'; + @ApiProperty() + plugin: string; + @ApiProperty() + host: string; + @ApiProperty() + port: string; + @ApiProperty() + username: string; + @ApiProperty() + @ApiProperty() + password: string; + @ApiProperty() + database: string; +} diff --git a/src/modules/connection/dtos/create-connection.ts b/src/modules/connection/dtos/create-connection.ts index f5db7b2..00e75be 100644 --- a/src/modules/connection/dtos/create-connection.ts +++ b/src/modules/connection/dtos/create-connection.ts @@ -1,4 +1,4 @@ -import { ApiProperty } from '@nestjs/swagger'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsString, IsObject } from 'class-validator'; export class CreateConnectionDto { @@ -14,9 +14,9 @@ export class CreateConnectionDto { @IsString() description: string; - @ApiProperty() + @ApiPropertyOptional() @IsString() - network_config_id: string; + network_config_id?: string; @ApiProperty() @IsString() From d28684a9d02df4953d15bcdb48c0f60d7a0d4b88 Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Wed, 27 Jul 2022 14:19:25 -0300 Subject: [PATCH 2/3] Connected Connection Test routes to microservice --- package-lock.json | 14 ++-- package.json | 2 +- .../connection-test-client.config.ts | 30 ++++++++ .../connection-test.controller.ts | 25 +++++-- .../connection-test/connection-test.module.ts | 5 +- .../connection-test.service.ts | 75 +++++++++++++++++-- .../connection-test/dto/connection-test.ts | 14 +++- 7 files changed, 142 insertions(+), 23 deletions(-) create mode 100644 src/modules/connection-test/connection-test-client.config.ts diff --git a/package-lock.json b/package-lock.json index e8176d4..b68df08 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.2", - "protospack-v2": "^3.9.0-beta.4", + "protospack-v2": "^3.9.0-beta.6", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", @@ -9018,9 +9018,9 @@ } }, "node_modules/protospack-v2": { - "version": "3.9.0-beta.4", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.4.tgz", - "integrity": "sha512-T1T6g1+qusecCGySLA4FSn5O1u+RyZkhIaO6De1701HrNcJM7jBZjYsN1qHr49vQ7TMeibtKyiVqpqZSoPeBBg==", + "version": "3.9.0-beta.6", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.6.tgz", + "integrity": "sha512-2Pv6uL6laRpVyEkuX6IMpAsmE15SxlrxpteAzz7Vli5HytDNK/Azyt375dWQC379K+OX2hv9Y5ji7YOeUmku7g==", "dependencies": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", @@ -17247,9 +17247,9 @@ } }, "protospack-v2": { - "version": "3.9.0-beta.4", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.4.tgz", - "integrity": "sha512-T1T6g1+qusecCGySLA4FSn5O1u+RyZkhIaO6De1701HrNcJM7jBZjYsN1qHr49vQ7TMeibtKyiVqpqZSoPeBBg==", + "version": "3.9.0-beta.6", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.6.tgz", + "integrity": "sha512-2Pv6uL6laRpVyEkuX6IMpAsmE15SxlrxpteAzz7Vli5HytDNK/Azyt375dWQC379K+OX2hv9Y5ji7YOeUmku7g==", "requires": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", diff --git a/package.json b/package.json index ad763f4..9933e49 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", "protospack": "2.5.2", - "protospack-v2": "^3.9.0-beta.4", + "protospack-v2": "^3.9.0-beta.6", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", diff --git a/src/modules/connection-test/connection-test-client.config.ts b/src/modules/connection-test/connection-test-client.config.ts new file mode 100644 index 0000000..7971bfb --- /dev/null +++ b/src/modules/connection-test/connection-test-client.config.ts @@ -0,0 +1,30 @@ +import { credentials } from '@grpc/grpc-js'; +import { + ClientProviderOptions, + GrpcOptions, + Transport, +} from '@nestjs/microservices'; +import { ConnectionTest } from 'protospack-v2'; + +export class ConnectionTestClientConfiguration { + private config: GrpcOptions = { + transport: Transport.GRPC, + options: { + url: process.env.INFACTORY_URL, + package: [ConnectionTest.ProtoPackages.ReadPackage], + credentials: + process.env.ENV === 'local' ? undefined : credentials.createSsl(), + protoPath: [ConnectionTest.ProtoPaths.ReadFilePath], + loader: { + keepCase: true, + enums: String, + objects: true, + arrays: true, + }, + }, + }; + providerOptions: ClientProviderOptions = { + name: 'ConnectionTestGrpcClient', + ...this.config, + }; +} diff --git a/src/modules/connection-test/connection-test.controller.ts b/src/modules/connection-test/connection-test.controller.ts index 4fc1e5c..44055d1 100644 --- a/src/modules/connection-test/connection-test.controller.ts +++ b/src/modules/connection-test/connection-test.controller.ts @@ -47,7 +47,10 @@ export class ConnectionTestController { user: user.user_id, customer: user.customer_name, }); - await this.connectionTestService.connectionTestPing(body); + return this.connectionTestService.connectionTestPing( + body, + user.customer_name, + ); } @Post('credentials') @@ -61,7 +64,10 @@ export class ConnectionTestController { user: user.user_id, customer: user.customer_name, }); - await this.connectionTestService.connectionTestCredentials(body); + return this.connectionTestService.connectionTestCredentials( + body, + user.customer_name, + ); } @Post('schemas') @@ -75,7 +81,10 @@ export class ConnectionTestController { user: user.user_id, customer: user.customer_name, }); - await this.connectionTestService.connectionTestListSchemas(body); + return this.connectionTestService.connectionTestListSchemas( + body, + user.customer_name, + ); } @Post('tables') @@ -89,7 +98,10 @@ export class ConnectionTestController { user: user.user_id, customer: user.customer_name, }); - await this.connectionTestService.connectionTestListTables(body); + return this.connectionTestService.connectionTestListTables( + body, + user.customer_name, + ); } @Post('table-metadata') @@ -103,6 +115,9 @@ export class ConnectionTestController { user: user.user_id, customer: user.customer_name, }); - await this.connectionTestService.getTableMetadata(body); + return this.connectionTestService.getTableMetadata( + body, + user.customer_name, + ); } } diff --git a/src/modules/connection-test/connection-test.module.ts b/src/modules/connection-test/connection-test.module.ts index 93cc1bf..687df06 100644 --- a/src/modules/connection-test/connection-test.module.ts +++ b/src/modules/connection-test/connection-test.module.ts @@ -2,9 +2,12 @@ import { Module } from '@nestjs/common'; import { ConnectionTestController } from './connection-test.controller'; import { ConnectionTestService } from './connection-test.service'; import { DadosferaLogger } from 'dadosfera-logs'; - +import { ClientsModule } from '@nestjs/microservices'; +import { ConnectionTestClientConfiguration } from './connection-test-client.config'; +const client = new ConnectionTestClientConfiguration(); @Module({ controllers: [ConnectionTestController], providers: [ConnectionTestService, DadosferaLogger], + imports: [ClientsModule.register([client.providerOptions])], }) export class ConnectionTestModule {} diff --git a/src/modules/connection-test/connection-test.service.ts b/src/modules/connection-test/connection-test.service.ts index 1475ba3..bb29cf4 100644 --- a/src/modules/connection-test/connection-test.service.ts +++ b/src/modules/connection-test/connection-test.service.ts @@ -1,4 +1,7 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; +import { ClientGrpc } from '@nestjs/microservices'; +import { ConnectionTest } from 'protospack-v2'; +import { lastValueFrom } from 'rxjs'; import { ConnectionTestCredentialsReq, ConnectionTestCredentialsRes, @@ -14,29 +17,89 @@ import { @Injectable() export class ConnectionTestService { + private connectionTestReadClient: ConnectionTest.ReadService.ConnectionTestReadServices; + constructor( + @Inject('ConnectionTestGrpcClient') private readonly grpcClient: ClientGrpc, + ) { + this.connectionTestReadClient = + grpcClient.getService( + ConnectionTest.ProtoServices.ConnectionTestReadServices, + ); + } + async connectionTestPing( body: ConnectionTestPingReq, + customer_name: string, ): Promise { - return { operation_result: true }; + const { endpoint, plugin, port, network_config_id } = body; + return lastValueFrom( + this.connectionTestReadClient.ConnectionTestPing({ + customer_name, + endpoint, + network_config_id, + plugin, + port, + }), + ); } async connectionTestCredentials( body: ConnectionTestCredentialsReq, + customer_name: string, ): Promise { - return { operation_result: true, connection_id: '' }; + const { connector_id, plugin } = body; + //CREATE CONNECTION + const connection_id = ''; + /***********************/ + const { operation_result } = await lastValueFrom( + this.connectionTestReadClient.ConnectionTestCredentials({ + connection_id, + customer_name, + plugin, + }), + ); + return { operation_result, connection_id }; } async connectionTestListSchemas( body: ConnectionTestListSchemasReq, + customer_name: string, ): Promise { - return { operation_result: true, schema_list: [] }; + const { connection_id, plugin } = body; + return lastValueFrom( + this.connectionTestReadClient.ListSchemas({ + connection_id, + customer_name, + plugin, + }), + ); } async connectionTestListTables( body: ConnectionTestListTablesReq, + customer_name: string, ): Promise { - return { operation_result: true, table_list: [] }; + const { connection_id, plugin, schema } = body; + return lastValueFrom( + this.connectionTestReadClient.ListTables({ + connection_id, + customer_name, + plugin, + schema, + }), + ); } + async getTableMetadata( body: GetTableMetadataReq, + customer_name: string, ): Promise { - return { table_metadata: [{ columns: [], table_name: '' }] }; + const { schema, plugin, table_list, connection_id } = body; + return lastValueFrom( + this.connectionTestReadClient.GetTableMetadata({ + connection_id, + customer_name, + plugin, + schema, + table_list, + }), + ); } } diff --git a/src/modules/connection-test/dto/connection-test.ts b/src/modules/connection-test/dto/connection-test.ts index 1addb78..7deadc0 100644 --- a/src/modules/connection-test/dto/connection-test.ts +++ b/src/modules/connection-test/dto/connection-test.ts @@ -1,5 +1,5 @@ import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger'; -import { IsString, IsObject } from 'class-validator'; +import { IsString, IsObject, IsOptional } from 'class-validator'; import { DatabaseConnectionPropertiesDto } from 'src/modules/connection/dtos/connection'; import { CreateConnectionDto } from 'src/modules/connection/dtos/create-connection'; export class ColumnDto { @@ -29,6 +29,7 @@ export class ConnectionTestPingReq { port: string; @ApiPropertyOptional() + @IsOptional() @IsString() network_config_id?: string; } @@ -42,6 +43,9 @@ export class ConnectionTestCredentialsReq extends OmitType( CreateConnectionDto, ['properties'], ) { + @ApiProperty() + @IsString() + plugin: string; @ApiProperty() @IsObject() properties: DatabaseConnectionPropertiesDto; @@ -82,7 +86,7 @@ export class ConnectionTestListTablesReq { @ApiProperty() @IsString() - schema_name: string; + schema: string; } export class ConnectionTestListTablesRes { @@ -93,6 +97,10 @@ export class ConnectionTestListTablesRes { } export class GetTableMetadataReq { + @ApiProperty() + @IsString() + connection_id: string; + @ApiProperty() @IsString() plugin: string; @@ -102,7 +110,7 @@ export class GetTableMetadataReq { schema: string; @ApiProperty() - @IsString() + @IsString({ each: true }) table_list: string[]; } From 6161865f1a5df6a964729762333f809c1d8857d2 Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Wed, 27 Jul 2022 14:25:25 -0300 Subject: [PATCH 3/3] FIX: Add authentication on connection-test routes --- src/modules/connection-test/connection-test.controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/modules/connection-test/connection-test.controller.ts b/src/modules/connection-test/connection-test.controller.ts index 44055d1..95ed102 100644 --- a/src/modules/connection-test/connection-test.controller.ts +++ b/src/modules/connection-test/connection-test.controller.ts @@ -23,9 +23,11 @@ import { GetTableMetadataReq, } from './dto/connection-test'; import { DadosferaLogger } from 'dadosfera-logs'; +import { Authenticated } from 'src/authentication/authentication.decorator'; @ApiTags('Connection Test') @Controller('connection-test') +@Authenticated() export class ConnectionTestController { logger: any; constructor(