import { Body, Controller, Delete, Get, HttpException, Param, Put, Post, Query, UploadedFile, UseInterceptors, Inject, UploadedFiles, } from '@nestjs/common'; import { FileInterceptor, FilesInterceptor } from '@nestjs/platform-express'; import { ApiConsumes, ApiTags } from '@nestjs/swagger'; import { ConnectorClientService } from './client.service'; import { AddTagDto } from './dtos/add-tag'; import { CreateConnectorDto } from './dtos/create-connector'; import { GetAllDto } from './dtos/get-all'; import { RemoveTagDto } from './dtos/remove-tag'; import { UpdateDto } from './dtos/update'; import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { Authenticated, RequireAllPermissions, RequireSomePermission, } from 'src/decorators/authentication.decorator'; import { PERMISSIONS_GROUPS } from 'src/authentication/permissions.enum'; import { Language } from 'src/decorators/language.decorator'; import { LanguageEnum } from 'src/utils/languages.enum'; import { ApiInternalOnlyController } from 'src/decorators/swagger.decorator'; @ApiInternalOnlyController() @ApiTags('connectors') @Authenticated() @Controller('connectors') export class ConnectorController { logger: DadosferaLogger; constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, private connectorClientService: ConnectorClientService, ) { this.logger = dadosferaLogger.logger; } @Post() @RequireAllPermissions(PERMISSIONS_GROUPS.CONNECTORS.permissions.CREATE) @ApiConsumes('multipart/form-data') @UseInterceptors(FileInterceptor('file')) async uploadConnector( @UploadedFile() file, @Body() body: CreateConnectorDto, ) { this.logger.info('/upload - Upload Connector Route'); const response = await this.connectorClientService.uploadConnector({ file, connector: JSON.parse(body.connector), }); return response; } @Post('/uploads') @RequireAllPermissions(PERMISSIONS_GROUPS.CONNECTORS.permissions.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_GROUPS.CONNECTORS.permissions.CREATE) @ApiConsumes('multipart/form-data') @UseInterceptors(FileInterceptor('file')) async uploadConnectorsFile(@UploadedFile() file: Express.Multer.File) { this.logger.info(`/upload`, 'Upload Connector Route'); return await this.connectorClientService.uploadConnectorsFile(file); } @Get() @RequireSomePermission( PERMISSIONS_GROUPS.CONNECTORS.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.CREATE, PERMISSIONS_GROUPS.PIPELINE.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.UPDATE, PERMISSIONS_GROUPS.PIPELINE.permissions.DELETE, ) async getAllConnectors( @Language() language: LanguageEnum, @Query() queries: GetAllDto, ) { this.logger.info('/GET - getAllConnectors Route'); 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); return { message: response.message, connectors, }; } @Get('/tags') @RequireSomePermission( PERMISSIONS_GROUPS.CONNECTORS.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.CREATE, PERMISSIONS_GROUPS.PIPELINE.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.UPDATE, PERMISSIONS_GROUPS.PIPELINE.permissions.DELETE, ) async getConnectorsTags() { return await this.connectorClientService.getConnectorsTags(); } @Get('/:plugin') @RequireSomePermission( PERMISSIONS_GROUPS.CONNECTORS.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.CREATE, PERMISSIONS_GROUPS.PIPELINE.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.UPDATE, PERMISSIONS_GROUPS.PIPELINE.permissions.DELETE, ) async getConnector( @Language() language: LanguageEnum, @Param('plugin') plugin: string, @Query('version') version: string, ) { this.logger.info('/GET/:plugin - getConnector Route'); const pluginId = `${plugin}-${version}`; const response: any = await this.connectorClientService.getConnector( pluginId, language, ); return { message: response.message || 'ok', connector: { ...JSON.parse(response.connector) }, }; } @Get('/:plugin/details') @RequireSomePermission( PERMISSIONS_GROUPS.CONNECTORS.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.CREATE, PERMISSIONS_GROUPS.PIPELINE.permissions.GET, PERMISSIONS_GROUPS.PIPELINE.permissions.UPDATE, PERMISSIONS_GROUPS.PIPELINE.permissions.DELETE, ) async getConnectorDetails( @Language() language: LanguageEnum, @Param('plugin') plugin: string, @Query('version') version: string, ) { this.logger.info('/upload - Upload Connector Route'); const pluginId = `${plugin}-${version}`; const response: any = await this.connectorClientService.getConnectorDetails( pluginId, language || 'pt-br', ); return { message: response.message || 'ok', connector: { ...JSON.parse(response.connector) }, }; } @Put('/:plugin') @RequireAllPermissions(PERMISSIONS_GROUPS.CONNECTORS.permissions.UPDATE) @ApiConsumes('multipart/form-data') async updateConnector( @Param('plugin') plugin: string, @Body() body: UpdateDto, ) { this.logger.info('/upload - Upload Connector Route'); const changes = body; const response: any = await this.connectorClientService.updateConnector({ plugin, changes: JSON.stringify(changes), }); return { message: response.message || 'ok', connector: { ...JSON.parse(response.connector) }, }; } @Put('/:plugin/add-tag') @RequireAllPermissions(PERMISSIONS_GROUPS.CONNECTORS.permissions.UPDATE) async addTagOnConnector( @Param('plugin') plugin: string, @Body() body: AddTagDto, ) { this.logger.info('/upload - Upload Connector Route'); const { tags } = body; if (!tags || !(typeof tags === 'object') || !tags.length) { throw new HttpException('Not found tags attributes', 400); } const changes = { plugin, tags }; const response: any = await this.connectorClientService.updateConnector({ plugin, changes: JSON.stringify(changes), }); return { message: response.message || 'ok', connector: { ...JSON.parse(response.connector) }, }; } @Put('/:plugin/remove-tag') @RequireAllPermissions(PERMISSIONS_GROUPS.CONNECTORS.permissions.UPDATE) async removeTagOnConnector( @Param('plugin') plugin: string, @Body() body: RemoveTagDto, ) { this.logger.info('/upload - Upload Connector Route'); const { tags } = body; const remove = tags; if (!remove || !(typeof remove === 'object') || !remove.length) { throw new HttpException('Not found remove attribute', 400); } const changes = { plugin, remove }; const response: any = await this.connectorClientService.updateConnector({ plugin, changes: JSON.stringify(changes), }); return { message: response.message || 'ok', connector: { ...JSON.parse(response.connector) }, }; } @Delete('/:plugin') @RequireAllPermissions(PERMISSIONS_GROUPS.CONNECTORS.permissions.DELETE) async deleteConnector( @Param('plugin') plugin: string, @Query('version') version: string, ) { this.logger.info('DELETE /:plugin - Delete Connector Route'); const response = await this.connectorClientService.deleteConnector( plugin, version, ); return { message: response.message, connector: response.connector }; } }