diff --git a/Insomnia_2022-06-23.zip b/Insomnia_2022-06-23.zip deleted file mode 100644 index 7103d04..0000000 Binary files a/Insomnia_2022-06-23.zip and /dev/null differ diff --git a/Insomnia_2022-07-11.zip b/Insomnia_2022-07-11.zip new file mode 100644 index 0000000..b71f8c6 Binary files /dev/null and b/Insomnia_2022-07-11.zip differ diff --git a/package-lock.json b/package-lock.json index 3df21a6..7daed3d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,8 +35,8 @@ "passport-google-oauth20": "^2.0.0", "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", - "protospack": "2.5.1", - "protospack-v2": "3.1.1", + "protospack": "2.5.2", + "protospack-v2": "3.4.0", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^7.5.5", @@ -8989,18 +8989,19 @@ } }, "node_modules/protospack": { - "version": "2.5.1", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack/-/protospack-2.5.1.tgz", - "integrity": "sha512-4JTx7B7WxpC1G3S8T7SUEAEgVM9UjdYrOG37fr42wKxl9y6wOyCZJYjG/lXeAqFXOEPj9KSlM+MqBfLIMHWHeA==", + "version": "2.5.2", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack/-/protospack-2.5.2.tgz", + "integrity": "sha512-t7NyWE4WDuAVixjL10SDUXHu8iW4H0azndTC3n/w335D/IodPgN47ebm3iMXbvoQTlQcCbjjc+HblaRa9oR8bA==", "dependencies": { "rxjs": "^7.5.5" } }, "node_modules/protospack-v2": { - "version": "3.1.1", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.1.tgz", - "integrity": "sha512-uY9hsP2oO7kar1EUUjUhVLI8VQ3seWO2+WVS0XS9vjWZPUI82k7KqB70uYB+5ws2dMSowomPjiqpQ13VNjk6ZQ==", + "version": "3.4.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.4.0.tgz", + "integrity": "sha512-KJZR0HtzUaBQnsdWzn4J6IqMUtceeO5gV41hdLrS1EbTKwn2A2EsbcOGQRm4/8kPzU2i4pe9o6zKTR3xCvWavw==", "dependencies": { + "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", "ts-proto": "^1.112.2" } @@ -17190,18 +17191,19 @@ } }, "protospack": { - "version": "2.5.1", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack/-/protospack-2.5.1.tgz", - "integrity": "sha512-4JTx7B7WxpC1G3S8T7SUEAEgVM9UjdYrOG37fr42wKxl9y6wOyCZJYjG/lXeAqFXOEPj9KSlM+MqBfLIMHWHeA==", + "version": "2.5.2", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack/-/protospack-2.5.2.tgz", + "integrity": "sha512-t7NyWE4WDuAVixjL10SDUXHu8iW4H0azndTC3n/w335D/IodPgN47ebm3iMXbvoQTlQcCbjjc+HblaRa9oR8bA==", "requires": { "rxjs": "^7.5.5" } }, "protospack-v2": { - "version": "3.1.1", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.1.1.tgz", - "integrity": "sha512-uY9hsP2oO7kar1EUUjUhVLI8VQ3seWO2+WVS0XS9vjWZPUI82k7KqB70uYB+5ws2dMSowomPjiqpQ13VNjk6ZQ==", + "version": "3.4.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.4.0.tgz", + "integrity": "sha512-KJZR0HtzUaBQnsdWzn4J6IqMUtceeO5gV41hdLrS1EbTKwn2A2EsbcOGQRm4/8kPzU2i4pe9o6zKTR3xCvWavw==", "requires": { + "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", "ts-proto": "^1.112.2" } diff --git a/package.json b/package.json index a8b632b..1ca35a7 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "passport-google-oauth20": "^2.0.0", "passport-hubspot-oauth2": "^1.0.3", "passport-mailchimp": "^1.1.0", - "protospack": "2.5.1", - "protospack-v2": "3.1.1", + "protospack": "2.5.2", + "protospack-v2": "3.4.0", "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 1861e22..03dafda 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,12 +1,11 @@ import { Module } from '@nestjs/common'; import { ClientsModule } from '@nestjs/microservices'; import { ConfigModule } from '@nestjs/config'; -import { DadosferaLogger } from 'dadosfera-logs'; - import { InputsController } from './modules/inputs/inputs.controller'; import { TransformationsController } from './modules/transformations/transformations.controller'; import { OutputsController } from './modules/outputs/outputs.controllers'; import { PipelinesController } from './modules/pipelines/pipelines.controller'; +import { AuthController } from './modules/auth/auth.controller'; import { HealthController } from './modules/health/health.controller'; import { InputsService } from './modules/inputs/inputs.service'; @@ -15,12 +14,10 @@ import { OutputsService } from './modules/outputs/outputs.service'; import { PipelinesService } from './modules/pipelines/pipelines.service'; import { HealthService } from './modules/health/health.service'; -import { AuthModule } from './modules/auth/auth.module'; import { InputsClientService } from './clients/inputs/client.service'; import { TransformationsClientService } from './clients/transformations/client.service'; import { OutputsClientService } from './clients/outputs/client.service'; import { PipelinesClientService } from './clients/pipelines/client.service'; -import { PermissionsModule } from './modules/permissions/permissions.module'; import { OutputsClientConfiguration } from './clients/outputs/client.config'; import { TransformationsClientConfiguration } from './clients/transformations/client.config'; @@ -37,16 +34,18 @@ import { APP_GUARD } from '@nestjs/core'; import { GoogleStrategy } from './modules/oauth/passport-strategies/google-strategy'; import { MailChimpStrategy } from './modules/oauth/passport-strategies/mailchimp-strategy'; import { SalesforceStrategy } from './modules/oauth/passport-strategies/salesforce-strategy'; -import { ConnectorClientConfiguration } from './clients/connector/client.config'; -import { ConnectorController } from './modules/connector/connector.controller'; -import { ConnectorClientService } from './clients/connector/client.service'; + +import { ConnectorModule } from './modules/connector/connector.module'; +import { AuthModule } from './modules/auth/auth.module'; +import { PermissionsModule } from './modules/permissions/permissions.module'; + +import { DadosferaLogger } from 'dadosfera-logs'; import { TermsOfUseModule } from './modules/termsOfUse/termsOfUse.module'; const inputClient = new InputsClientConfiguration(); const outputClient = new OutputsClientConfiguration(); const pipelineClient = new PipelinesClientConfiguration(); const transformationClient = new TransformationsClientConfiguration(); -const connectorClient = new ConnectorClientConfiguration(); @Module({ controllers: [ @@ -57,7 +56,6 @@ const connectorClient = new ConnectorClientConfiguration(); HealthController, CatalogController, OauthController, - ConnectorController, ], providers: [ DadosferaLogger, @@ -66,7 +64,6 @@ const connectorClient = new ConnectorClientConfiguration(); TransformationsService, OutputsService, PipelinesService, - ConnectorClientService, HealthService, InputsClientService, TransformationsClientService, @@ -87,6 +84,7 @@ const connectorClient = new ConnectorClientConfiguration(); ConfigModule.forRoot({ isGlobal: true, }), + ConnectorModule, AuthModule, PermissionsModule, TermsOfUseModule, @@ -108,10 +106,6 @@ const connectorClient = new ConnectorClientConfiguration(); name: 'PIPELINES_PACKAGE', ...pipelineClient.config(), }, - { - name: 'CONNECTOR_PACKAGE', - ...connectorClient.config(), - }, ]), ], }) diff --git a/src/clients/connector/client.service.ts b/src/clients/connector/client.service.ts deleted file mode 100644 index fc8f9dc..0000000 --- a/src/clients/connector/client.service.ts +++ /dev/null @@ -1,307 +0,0 @@ -import { - OnModuleInit, - Inject, - HttpException, - HttpStatus, -} from '@nestjs/common'; -import { DadosferaLogger } from 'dadosfera-logs'; -import { ClientGrpc } from '@nestjs/microservices'; -import { ConnectorManager } from 'protospack-v2'; -import { from } from 'rxjs'; - -export class ConnectorClientService implements OnModuleInit { - private connectorServiceRead: ConnectorManager.ReadService.ConnectorManagerReadServices; - private connectorServiceWrite: ConnectorManager.WriteService.ConnectorManagerWriteServices; - logger: any; - constructor( - @Inject(DadosferaLogger) - dadosferaLogger: DadosferaLogger, - @Inject('CONNECTOR_PACKAGE') private readonly grpcClient: ClientGrpc, - ) { - this.logger = dadosferaLogger.logger; - } - - onModuleInit() { - this.connectorServiceWrite = - this.grpcClient.getService( - ConnectorManager.ProtoServices.ConnectorManagerWriteServices, - ); - - this.connectorServiceRead = - this.grpcClient.getService( - ConnectorManager.ProtoServices.ConnectorManagerReadServices, - ); - } - - async uploadConnector(uploadConnector) { - const connector: ConnectorManager.Entities.ConnectorCreateRequest = { - file: { - buffer: uploadConnector.file.buffer, - mimetypes: uploadConnector.file.mimetype, - }, - connector: JSON.stringify(uploadConnector.connector), - }; - const serviceBody: ConnectorManager.Messages.RegisterConnectorRequest = { - connector, - }; - - const observable = from( - this.connectorServiceWrite.RegisterConnector(serviceBody), - ); - - const result = await new Promise((resolve, reject) => { - observable.subscribe({ - next(x) { - resolve(x); - }, - error(err) { - reject(err); - }, - complete() { - //console.log('done'); - }, - }); - }) - .then((res) => { - this.logger.info('Done'); - return res; - }) - .catch((err) => { - this.logger.error(err.details); - this.logger.error(err); - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 400, - ); - }); - - this.logger.info('ConnectorClientService - Upload'); - - return result; - } - - async uploadFile(uploadFile) { - const body: ConnectorManager.Messages.UploadFileRequest = { - file: { - buffer: uploadFile.file.buffer, - mimetypes: uploadFile.file.mimetype, - }, - name: uploadFile.name, - }; - - const observable = from(this.connectorServiceWrite.UploadFile(body)); - - const result = await new Promise((resolve, reject) => { - observable.subscribe({ - next(x) { - resolve(x); - }, - error(err) { - reject(err); - }, - complete() { - //console.log('done'); - }, - }); - }) - .then((res) => { - this.logger.info('Done'); - return res; - }) - .catch((err) => { - this.logger.error(err.details); - this.logger.error(err); - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 400, - ); - }); - - this.logger.info('ConnectorClientService - Upload'); - - return result; - } - - async getAllConnectors(body) { - const observable = from( - this.connectorServiceRead.GetAllConnectors({ - search: body.search, - filters: JSON.stringify(body.filters), - }), - ); - const result = await new Promise((resolve, reject) => { - observable.subscribe({ - next(x) { - resolve(x); - }, - error(err) { - reject(err); - }, - complete() { - //console.log('done'); - }, - }); - }) - .then((res) => { - this.logger.info('Done'); - return res; - }) - .catch((err) => { - this.logger.error(err); - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 400, - ); - }); - - this.logger.info('ConnectorClientService - getAllConnectors'); - - return result; - } - - async getConnectorDetails(plugin: string) { - const observable = from( - this.connectorServiceRead.GetConnectorDetails({ - plugin, - }), - ); - const result = await new Promise((resolve, reject) => { - observable.subscribe({ - next(x) { - resolve(x); - }, - error(err) { - reject(err); - }, - complete() { - //console.log('done'); - }, - }); - }) - .then((res) => { - this.logger.info('Done'); - return res; - }) - .catch((err) => { - this.logger.error(err); - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 400, - ); - }); - - this.logger.info('ConnectorClientService - getAllConnectors'); - - return result; - } - - async getConnector(plugin: string) { - const observable = from( - this.connectorServiceRead.GetConnector({ - plugin, - }), - ); - const result = await new Promise((resolve, reject) => { - observable.subscribe({ - next(x) { - resolve(x); - }, - error(err) { - reject(err); - }, - complete() { - //console.log('done'); - }, - }); - }) - .then((res) => { - this.logger.info('Done'); - return res; - }) - .catch((err) => { - this.logger.error(err); - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 400, - ); - }); - - this.logger.info('ConnectorClientService - getAllConnectors'); - - return result; - } - - async deleteConnector(plugin: string, version: string) { - const observable = from( - this.connectorServiceWrite.DeleteConnector({ - version, - plugin, - }), - ); - const result = await new Promise((resolve, reject) => { - observable.subscribe({ - next(x) { - resolve(x); - }, - error(err) { - reject(err); - }, - complete() { - //console.log('done'); - }, - }); - }) - .then((res) => { - this.logger.info('Done'); - return res; - }) - .catch((err) => { - this.logger.error(err); - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 400, - ); - }); - - this.logger.info('ConnectorClientService - getAllConnectors'); - - return result; - } - - async updateConnector({ plugin, changes }) { - const observable = from( - this.connectorServiceWrite.UpdateConnector({ - plugin, - changes, - }), - ); - const result = await new Promise((resolve, reject) => { - observable.subscribe({ - next(x) { - resolve(x); - }, - error(err) { - reject(err); - }, - complete() { - //console.log('done'); - }, - }); - }) - .then((res) => { - this.logger.info('Done'); - return res; - }) - .catch((err) => { - this.logger.error(err); - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 400, - ); - }); - - this.logger.info('ConnectorClientService - getAllConnectors'); - - return result; - } -} diff --git a/src/clients/duc/client.config.ts b/src/clients/duc/client.config.ts index 180cfa6..bac3a13 100644 --- a/src/clients/duc/client.config.ts +++ b/src/clients/duc/client.config.ts @@ -1,9 +1,6 @@ import { credentials } from '@grpc/grpc-js'; import { ClientOptions, Transport } from '@nestjs/microservices'; -import { - ProtoPackages, - ProtoPaths, -} from 'protospack-v2/dist/lib/Duc'; +import { ProtoPackages, ProtoPaths } from 'protospack-v2/dist/lib/Duc'; export class DucClient { config(): ClientOptions { @@ -12,6 +9,7 @@ export class DucClient { options: { url: process.env.DUC_URL, package: ProtoPackages.WritePackage, + // credentials: credentials.createSsl(), credentials: process.env.LOCAL_ENV ? undefined : credentials.createSsl(), diff --git a/src/clients/connector/client.config.ts b/src/modules/connector/client.config.ts similarity index 84% rename from src/clients/connector/client.config.ts rename to src/modules/connector/client.config.ts index a22a9c8..c35707c 100644 --- a/src/clients/connector/client.config.ts +++ b/src/modules/connector/client.config.ts @@ -12,10 +12,10 @@ export class ConnectorClientConfiguration { ConnectorManager.ProtoPackages.WritePackage, ConnectorManager.ProtoPackages.ReadPackage, ], - credentials: - process.env.LOCAL_ENV === 'local' - ? undefined - : credentials.createSsl(), + // credentials: undefined, + credentials: process.env.LOCAL_ENV + ? undefined + : credentials.createSsl(), protoPath: [ ConnectorManager.ProtoPaths.WriteFilePath, ConnectorManager.ProtoPaths.ReadFilePath, diff --git a/src/modules/connector/client.service.ts b/src/modules/connector/client.service.ts new file mode 100644 index 0000000..6400b9b --- /dev/null +++ b/src/modules/connector/client.service.ts @@ -0,0 +1,193 @@ +import { Metadata } from '@grpc/grpc-js'; +import { + OnModuleInit, + Inject, + HttpException, + HttpStatus, +} from '@nestjs/common'; +import { ClientGrpc } from '@nestjs/microservices'; +import { ConnectorManager } from 'protospack-v2'; +import { lastValueFrom } from 'rxjs'; + +export class ConnectorClientService implements OnModuleInit { + private connectorServiceRead: ConnectorManager.ReadService.ConnectorManagerReadServices; + private connectorServiceWrite: ConnectorManager.WriteService.ConnectorManagerWriteServices; + constructor( + @Inject('CONNECTOR_PACKAGE') private readonly grpcClient: ClientGrpc, + ) {} + + onModuleInit() { + this.connectorServiceWrite = + this.grpcClient.getService( + ConnectorManager.ProtoServices.ConnectorManagerWriteServices, + ); + + this.connectorServiceRead = + this.grpcClient.getService( + ConnectorManager.ProtoServices.ConnectorManagerReadServices, + ); + } + + async uploadConnector(uploadConnector) { + const connector: ConnectorManager.Entities.ConnectorCreateRequest = { + file: { + buffer: uploadConnector.file.buffer, + mimetypes: uploadConnector.file.mimetype, + }, + connector: JSON.stringify(uploadConnector.connector), + }; + const serviceBody: ConnectorManager.Messages.RegisterConnectorRequest = { + connector, + }; + + return lastValueFrom( + this.connectorServiceWrite.RegisterConnector(serviceBody), + ).catch((err) => { + console.log(err.details); + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }); + } + + async uploadFile(uploadFile) { + const body: ConnectorManager.Messages.UploadFileRequest = { + file: { + buffer: uploadFile.file.buffer, + mimetypes: uploadFile.file.mimetype, + }, + name: uploadFile.name, + }; + + return lastValueFrom(this.connectorServiceWrite.UploadFile(body)).catch( + (err) => { + console.log(err.details); + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }, + ); + } + + async uploadConnectorsFile(uploadFile) { + const connectors = JSON.parse(uploadFile.file.buffer.toString('utf8')); + + const body = connectors.map((connector) => { + return JSON.stringify(connector); + }); + + const request = { + connectors: body, + }; + + return lastValueFrom( + this.connectorServiceWrite.RegisterMultipleConnectorsWithoutImage( + request, + ), + ).catch((err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }); + } + + async getAllConnectors(body) { + const meta = new Metadata(); + meta.add('Language', body.language); + return lastValueFrom( + this.connectorServiceRead.GetAllConnectors( + { + search: body.search, + filters: JSON.stringify(body.filters), + language: body.language, + page: body.page, + size: body.size, + }, + meta, + ), + ).catch((err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }); + } + + async getConnectorDetails(plugin: string, language: string) { + const meta = new Metadata(); + meta.add('Language', language); + return lastValueFrom( + this.connectorServiceRead.GetConnectorDetails( + { + plugin, + }, + meta, + ), + ).catch((err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }); + } + + async getConnector(plugin: string, language: string) { + const meta = new Metadata(); + meta.add('Language', language); + return lastValueFrom( + this.connectorServiceRead.GetConnector( + { + plugin, + }, + meta, + ), + ).catch((err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }); + } + + async getConnectorsTags() { + return lastValueFrom(this.connectorServiceRead.GetConnectorsTags({})).catch( + (err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }, + ); + } + + async deleteConnector(plugin: string, version: string) { + return lastValueFrom( + this.connectorServiceWrite.DeleteConnector({ + version, + plugin, + }), + ).catch((err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }); + } + + async updateConnector({ plugin, changes }) { + return lastValueFrom( + this.connectorServiceWrite.UpdateConnector({ + plugin, + changes, + }), + ).catch((err) => { + throw new HttpException( + err.details, + err.code === 6 ? HttpStatus.CONFLICT : 400, + ); + }); + } +} diff --git a/src/modules/connector/connector.controller.ts b/src/modules/connector/connector.controller.ts index 50ccf3d..1141ac5 100644 --- a/src/modules/connector/connector.controller.ts +++ b/src/modules/connector/connector.controller.ts @@ -11,21 +11,29 @@ import { UploadedFile, UseInterceptors, Inject, + Headers, + UploadedFiles, } from '@nestjs/common'; -import { FileInterceptor } from '@nestjs/platform-express'; +import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'; import { ApiBearerAuth, ApiConsumes, ApiTags } from '@nestjs/swagger'; -import { ConnectorClientService } from 'src/clients/connector/client.service'; +import { ConnectorClientService } from './client.service'; import { AddTagDto } from './dtos/add-tag'; import { CreateConnectorDto } from './dtos/create-connector'; +import { UploadConnectorsFileDto } from './dtos/create-multiple-connector'; import { DeleteConnectorDto } from './dtos/delete-connector'; import { GetAllDto } from './dtos/get-all'; import { RemoveTagDto } from './dtos/remove-tag'; import { UpdateDto } from './dtos/update'; -import { UploadFileDto } from './dtos/upload-file'; import { DadosferaLogger } from 'dadosfera-logs'; +import { + Authenticated, + RequireAllPermissions, +} from 'src/authentication/authentication.decorator'; +import { Permissions } from 'src/authentication/permissions.enum'; @ApiTags('connectors') @ApiBearerAuth() +@Authenticated() @Controller('connectors') export class ConnectorController { logger: any; @@ -38,6 +46,7 @@ export class ConnectorController { } @Post() + @RequireAllPermissions(Permissions.CONNECTORS.CREATE) @ApiConsumes('multipart/form-data') @UseInterceptors(FileInterceptor('file')) async uploadConnector( @@ -54,29 +63,53 @@ export class ConnectorController { return response; } - @Post('/upload') + @Post('/uploads') + @RequireAllPermissions(Permissions.CONNECTORS.CREATE) + @ApiConsumes('multipart/form-data') + @UseInterceptors(FilesInterceptor('files')) + async uploadFile(@UploadedFiles() files) { + this.logger.info('/upload - Upload Connector Route'); + const promises = files.map(async (file) => { + return await this.connectorClientService.uploadFile({ + file, + name: file.originalname.split('.')[0], + }); + }); + + const response = await Promise.all(promises); + return response; + } + + @Post('/multiple-connectors-upload') + @RequireAllPermissions(Permissions.CONNECTORS.CREATE) @ApiConsumes('multipart/form-data') @UseInterceptors(FileInterceptor('file')) - async uploadFile(@UploadedFile() file, @Body() { name }: UploadFileDto) { - this.logger.info('/upload - Upload Connector Route'); + async uploadConnectorsFile(@UploadedFile() file: UploadConnectorsFileDto) { + console.log(`/upload`, 'Upload Connector Route'); - const response = await this.connectorClientService.uploadFile({ + const response = await this.connectorClientService.uploadConnectorsFile({ file, - name, }); return response; } @Get() - async getAllConnectors(@Query() queries: GetAllDto) { + @RequireAllPermissions(Permissions.CONNECTORS.GET) + async getAllConnectors( + @Headers('dadosfera-lang') language, + @Query() queries: GetAllDto, + ) { this.logger.info('/upload - Upload Connector Route'); - const { search, ...filters } = queries; + const { search, size, page, ...filters } = queries; const response: any = await this.connectorClientService.getAllConnectors({ filters: filters || {}, search: search || '', + language: language || 'pt-br', + size: size || 10, + page: page || 1, }); const connectors = JSON.parse(response.connectors).connectors; @@ -87,8 +120,16 @@ export class ConnectorController { }; } + @Get('/tags') + @RequireAllPermissions(Permissions.CONNECTORS.GET) + async getConnectorsTags() { + return await this.connectorClientService.getConnectorsTags(); + } + @Get('/:plugin') + @RequireAllPermissions(Permissions.CONNECTORS.GET) async getConnector( + @Headers('dadosfera-lang') language, @Param('plugin') plugin: string, @Query('version') version: string, ) { @@ -98,6 +139,7 @@ export class ConnectorController { const response: any = await this.connectorClientService.getConnector( pluginId, + language, ); return { @@ -107,7 +149,9 @@ export class ConnectorController { } @Get('/:plugin/details') + @RequireAllPermissions(Permissions.CONNECTORS.GET) async getConnectorDetails( + @Headers('dadosfera-lang') language, @Param('plugin') plugin: string, @Query('version') version: string, ) { @@ -117,6 +161,7 @@ export class ConnectorController { const response: any = await this.connectorClientService.getConnectorDetails( pluginId, + language || 'pt-br', ); return { @@ -126,6 +171,7 @@ export class ConnectorController { } @Put('/:plugin') + @RequireAllPermissions(Permissions.CONNECTORS.UPDATE) @ApiConsumes('multipart/form-data') async updateConnector( @Param('plugin') plugin: string, @@ -147,6 +193,7 @@ export class ConnectorController { } @Put('/:plugin/add-tag') + @RequireAllPermissions(Permissions.CONNECTORS.UPDATE) async addTagOnConnector( @Param('plugin') plugin: string, @Body() body: AddTagDto, @@ -173,6 +220,7 @@ export class ConnectorController { } @Put('/:plugin/remove-tag') + @RequireAllPermissions(Permissions.CONNECTORS.UPDATE) async removeTagOnConnector( @Param('plugin') plugin: string, @Body() body: RemoveTagDto, @@ -200,6 +248,7 @@ export class ConnectorController { } @Delete('/:plugin') + @RequireAllPermissions(Permissions.CONNECTORS.DELETE) async deleteConnector( @Param('plugin') plugin: string, @Body() { version }: DeleteConnectorDto, diff --git a/src/modules/connector/connector.module.ts b/src/modules/connector/connector.module.ts new file mode 100644 index 0000000..417380b --- /dev/null +++ b/src/modules/connector/connector.module.ts @@ -0,0 +1,22 @@ +import { Module } from '@nestjs/common'; +import { ClientsModule } from '@nestjs/microservices'; +import { ConnectorClientService } from './client.service'; +import { ConnectorClientConfiguration } from './client.config'; +import { ConnectorController } from './connector.controller'; +import { DadosferaLogger } from 'dadosfera-logs'; + +const connectorClient = new ConnectorClientConfiguration(); + +@Module({ + controllers: [ConnectorController], + providers: [ConnectorClientService, DadosferaLogger], + imports: [ + ClientsModule.register([ + { + name: 'CONNECTOR_PACKAGE', + ...connectorClient.config(), + }, + ]), + ], +}) +export class ConnectorModule {} diff --git a/src/modules/connector/dtos/create-multiple-connector.ts b/src/modules/connector/dtos/create-multiple-connector.ts new file mode 100644 index 0000000..979e105 --- /dev/null +++ b/src/modules/connector/dtos/create-multiple-connector.ts @@ -0,0 +1,6 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class UploadConnectorsFileDto { + @ApiProperty({ format: 'binary' }) + file: string; +} diff --git a/src/modules/connector/dtos/get-all.ts b/src/modules/connector/dtos/get-all.ts index c42980c..28e6ed5 100644 --- a/src/modules/connector/dtos/get-all.ts +++ b/src/modules/connector/dtos/get-all.ts @@ -4,6 +4,15 @@ export class GetAllDto { @ApiProperty() search: string; + @ApiProperty() + language: string; + + @ApiProperty() + size: string; + + @ApiProperty() + page: string; + @ApiProperty() filters: any; }