import { Body, Controller, HttpCode, HttpStatus, Inject, Post, UseFilters, ValidationPipe, } from '@nestjs/common'; import { ApiOkResponse, ApiTags } from '@nestjs/swagger'; import { User, RequestUser } from 'src/decorators/user.decorator'; import { ConnectionTestService } from './connection-test.service'; import { ConnectionTestPingRes, ConnectionTestPingReq, ConnectionTestCredentialsReq, ConnectionTestCredentialsRes, ConnectionTestListSchemasReq, ConnectionTestListSchemasRes, ConnectionTestListTablesReq, ConnectionTestListTablesRes, GetTableMetadataRes, GetTableMetadataReq, ValidateCdcPrerequisitesReq, ValidateCdcPrerequisitesRes, RefreshCatalogReq, RefreshCatalogRes, RefreshCatalogStatusReq, } from './dto/connection-test'; import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { Authenticated, RequireModule } from 'src/decorators/authentication.decorator'; import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter'; import { ApiInternalOnlyController } from 'src/decorators/swagger.decorator'; import { DADOSFERA_MODULES_KEYS } from 'src/authentication/permissions.enum'; @ApiInternalOnlyController() @ApiTags('Connection Test') @Controller('connection-test') @UseFilters(new GrpcToHttpExceptionFilter()) @Authenticated() @RequireModule( DADOSFERA_MODULES_KEYS.COLLECT ) 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, }); return this.connectionTestService.connectionTestPing(body, user); } @Post('credentials') @ApiOkResponse({ type: ConnectionTestCredentialsRes }) @HttpCode(HttpStatus.OK) async connectionTestCredentials( @User() user: RequestUser, @Body() body: ConnectionTestCredentialsReq, ) { this.logger.info('/connection-test/credentials', { user: user.user_id, customer: user.customer_name, }); return this.connectionTestService.connectionTestCredentials(body, user); } @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, }); return this.connectionTestService.connectionTestListSchemas( body, user, ); } @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, }); return this.connectionTestService.connectionTestListTables( body, user, ); } @Post('table-metadata') @ApiOkResponse({ type: GetTableMetadataRes }) @HttpCode(HttpStatus.OK) async getTableMetadata( @User() user: RequestUser, @Body(new ValidationPipe()) body: GetTableMetadataReq, ) { this.logger.info('/connection-test/table-metadata', { user: user.user_id, customer: user.customer_name, }); return this.connectionTestService.getTableMetadata( body, user, ); } @Post('cdc-prerequisites') @ApiOkResponse({ type: ValidateCdcPrerequisitesRes }) @HttpCode(HttpStatus.OK) async validateCdcPrerequisites( @User() user: RequestUser, @Body(new ValidationPipe()) body: ValidateCdcPrerequisitesReq, ) { this.logger.info('/connection-test/cdc-prerequisites', { user: user.user_id, customer: user.customer_name, }); return this.connectionTestService.validateCdcPrerequisites( body, user.customer_name, ); } @Post('refresh-catalog') @ApiOkResponse({ type: RefreshCatalogRes }) @HttpCode(HttpStatus.ACCEPTED) async refreshCatalog( @User() user: RequestUser, @Body(new ValidationPipe()) body: RefreshCatalogReq, ) { this.logger.info('/connection-test/refresh-catalog', { user: user.user_id, customer: user.customer_name, connection: body.connection_id, }); return this.connectionTestService.refreshCatalog(body, user); } @Post('refresh-catalog/status') @ApiOkResponse({ type: RefreshCatalogRes }) @HttpCode(HttpStatus.OK) async refreshCatalogStatus( @User() user: RequestUser, @Body(new ValidationPipe()) body: RefreshCatalogStatusReq, ) { this.logger.info('/connection-test/refresh-catalog/status', { user: user.user_id, customer: user.customer_name, connection: body.connection_id, session: body.session_id, }); return this.connectionTestService.refreshCatalogStatus(body, user); } }