diff --git a/README.md b/README.md index 8caeff1..ccb4f5b 100644 --- a/README.md +++ b/README.md @@ -290,7 +290,7 @@ Example: `FIX: ensure Range headers adhere more closely to RFC 2616` ### Making a Pull Request 1. Commit your changes 2. Open the Pull Request on GitHub -3. Send Pull Request link in microsfera Google Chat Group for review and possible approval +3. Send Pull Request link in Microsfera Google Chat Group for review and possible approval ## 🛠️ Built with Some technologies used in this project: diff --git a/docsfera.json b/docsfera.json index 08bf04c..8a386a4 100644 --- a/docsfera.json +++ b/docsfera.json @@ -264,6 +264,20 @@ ] } }, + "/auth/verify-access-token": { + "get": { + "operationId": "AuthController_verifyAccessToken", + "parameters": [], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Auth" + ] + } + }, "/connectors": { "post": { "operationId": "ConnectorController_uploadConnector", @@ -2868,7 +2882,16 @@ }, "post": { "operationId": "CatalogController_manageDataAssetDocs", - "parameters": [], + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], "responses": { "201": { "description": "", @@ -5345,6 +5368,17 @@ "username" ] }, + "EmbedObject": { + "type": "object", + "properties": { + "url": { + "type": "string" + } + }, + "required": [ + "url" + ] + }, "IDataAsset": { "type": "object", "properties": { @@ -5443,10 +5477,14 @@ "items": { "$ref": "#/components/schemas/IComment" } + }, + "embed": { + "$ref": "#/components/schemas/EmbedObject" } }, "required": [ "id", + "display_name", "pipeline_id", "user_id", "description", @@ -5455,6 +5493,7 @@ "owner", "roles", "users", + "created_at", "comments" ] }, @@ -5684,6 +5723,9 @@ "items": { "type": "string" } + }, + "embed": { + "$ref": "#/components/schemas/EmbedObject" } }, "required": [ @@ -5720,6 +5762,9 @@ }, "location": { "type": "string" + }, + "embed": { + "$ref": "#/components/schemas/EmbedObject" } }, "required": [ diff --git a/package-lock.json b/package-lock.json index 335e97e..8400e52 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@aws-sdk/client-secrets-manager": "^3.112.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "v3.22.0-beta.3", + "@dadosfera/protospack-v2": "3.23.0", "@grpc/grpc-js": "^1.6.7", "@grpc/proto-loader": "^0.6.13", "@nestjs/common": "^8.4.7", @@ -1727,9 +1727,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.22.0-beta.3", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.22.0-beta.3.tgz", - "integrity": "sha512-oLKfWyNLvnnZNcBQqzJWD3IstFBg+CGFXCfNj6buvHysktlDQ8qsZFValLt+DsCXyvIC18WXkSCiukili80v4g==", + "version": "3.23.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.23.0.tgz", + "integrity": "sha512-pe2s7aJYaNlUhQ+QoMGkJoFjTS8Dh+xSgUClSJuCsTia17oidRAucfpeMUX9ws1a3+tDrXTpH519CxeHzuZQPA==", "dependencies": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", @@ -12324,9 +12324,9 @@ } }, "@dadosfera/protospack-v2": { - "version": "3.22.0-beta.3", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.22.0-beta.3.tgz", - "integrity": "sha512-oLKfWyNLvnnZNcBQqzJWD3IstFBg+CGFXCfNj6buvHysktlDQ8qsZFValLt+DsCXyvIC18WXkSCiukili80v4g==", + "version": "3.23.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.23.0.tgz", + "integrity": "sha512-pe2s7aJYaNlUhQ+QoMGkJoFjTS8Dh+xSgUClSJuCsTia17oidRAucfpeMUX9ws1a3+tDrXTpH519CxeHzuZQPA==", "requires": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", diff --git a/package.json b/package.json index c4524e9..f556239 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "dependencies": { "@aws-sdk/client-secrets-manager": "^3.112.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "v3.22.0-beta.3", + "@dadosfera/protospack-v2": "3.23.0", "@grpc/grpc-js": "^1.6.7", "@grpc/proto-loader": "^0.6.13", "@nestjs/common": "^8.4.7", diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 503dc64..ce0406b 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -7,6 +7,7 @@ import { HttpStatus, Inject, UseFilters, + Get, } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { @@ -21,7 +22,10 @@ import { } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/messages'; import { PERMISSIONS_GROUPS } from 'src/authentication/permissions.enum'; -import { RequireAllPermissions } from 'src/authentication/authentication.decorator'; +import { + Authenticated, + RequireAllPermissions, +} from 'src/authentication/authentication.decorator'; import { AuthClientService } from './auth.service'; import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { GrpcToHttpExceptionFilter } from '../../error/grpc-to-http-exception.filter'; @@ -185,4 +189,11 @@ export class AuthController { return this.authClient.verifyTotp({ accessToken, totp }); } + + @Authenticated() + @Get('verify-access-token') + @HttpCode(HttpStatus.OK) + verifyAccessToken() { + return { access_token_status: 'valid' }; + } } diff --git a/src/modules/catalog/catalog.controller.ts b/src/modules/catalog/catalog.controller.ts index d666bb7..e6703b6 100644 --- a/src/modules/catalog/catalog.controller.ts +++ b/src/modules/catalog/catalog.controller.ts @@ -10,6 +10,7 @@ import { Post, Put, Query, + UseFilters, } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { @@ -32,9 +33,11 @@ import { IPreviewResponse, IUpdateDataRequest, } from './dtos'; +import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter'; @ApiTags('Catalog') @Controller('catalog') +@UseFilters(new GrpcToHttpExceptionFilter()) @Authenticated() export class CatalogController { logger: DadosferaLogger; @@ -352,11 +355,10 @@ export class CatalogController { async manageDataAssetDocs( @User() user: RequestUser, @Headers() headers, - @Param('id') data_asset_id, + @Param('id') table_id: string, @Body('docs') docs: string, ) { const { user_id, customer_name } = user; - const [, id] = data_asset_id.split('-'); this.logger.info(`/catalog - ON GET DATA DOCS ROUTE`, { user_id, @@ -364,7 +366,7 @@ export class CatalogController { }); const res = await this.catalogService.createDataDocs({ - table_id: id, + table_id, docs, info: { customer: customer_name, diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 7f13cf5..2b0f21f 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -18,6 +18,7 @@ import { CatalogClientConfiguration } from './catalog-client'; import { UsersService } from '../users/users.service'; import { RolesService } from '../roles/roles.service'; import { Metadata } from '@grpc/grpc-js'; +import { IUpdateDataRequest } from './dtos'; class CatalogService implements OnModuleInit { catalogReadService: ReadService.CatalogReadServices; @@ -60,15 +61,11 @@ class CatalogService implements OnModuleInit { async createDataAsset(data: Messages.CreateDataAssetRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); + if (!data.embed) data.embed = undefined; return lastValueFrom( this.catalogWriteService.CreateDataAsset(data, metadata), - ).catch((err) => { - throw new HttpException( - err.details, - err.code === 6 ? HttpStatus.CONFLICT : 404, - ); - }); + ); } async managePermissions(data: Messages.ManagePermissionRequest, metadata) { @@ -200,7 +197,14 @@ class CatalogService implements OnModuleInit { return { data_asset: asset[0] }; } - async updateOneDataAsset({ data_asset_id, customer_id, body, metadata }) { + async updateOneDataAsset(data: { + data_asset_id: string; + customer_id: string; + body: IUpdateDataRequest; + metadata: Metadata; + }) { + const { body, customer_id, data_asset_id, metadata } = data; + const { data_asset } = await lastValueFrom( this.catalogWriteService.UpdateDataAsset( { id: data_asset_id, changes: JSON.stringify(body) }, diff --git a/src/modules/catalog/dtos/index.ts b/src/modules/catalog/dtos/index.ts index 533a559..16604b2 100644 --- a/src/modules/catalog/dtos/index.ts +++ b/src/modules/catalog/dtos/index.ts @@ -1,6 +1,10 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { CreateDataAssetRequest } from '@dadosfera/protospack-v2/dist/lib/Catalog/interfaces/messages'; +export class EmbedObject { + @ApiProperty() + url: string; +} export class IRole { @ApiProperty() name: string; @@ -49,8 +53,8 @@ export class IDataAsset { data_encrypted?: string; @ApiPropertyOptional() num_rows?: number; - @ApiPropertyOptional() - display_name?: string; + @ApiProperty() + display_name: string; @ApiProperty() pipeline_id: string; @ApiProperty() @@ -75,12 +79,14 @@ export class IDataAsset { parameters?: string[]; @ApiPropertyOptional() embedding_params?: object; - @ApiPropertyOptional() - created_at?: string; + @ApiProperty() + created_at: string; @ApiPropertyOptional() updated_at?: string; @ApiProperty({ type: [IComment] }) comments: IComment[]; + @ApiPropertyOptional() + embed?: EmbedObject; } export class IOneDataAsset { @@ -127,8 +133,9 @@ export class IUpdateDataRequest { description: string; @ApiProperty() tags: string[]; + @ApiPropertyOptional() + embed: EmbedObject; } - export class ICreateDataAsset implements CreateDataAssetRequest { @ApiProperty() display_name: string; @@ -140,6 +147,8 @@ export class ICreateDataAsset implements CreateDataAssetRequest { external_url: string; @ApiProperty() location: string; + @ApiPropertyOptional() + embed: EmbedObject; } export class IPreview { diff --git a/src/utils/ErrorBuilder.ts b/src/utils/ErrorBuilder.ts index 16567e1..faf2b7c 100644 --- a/src/utils/ErrorBuilder.ts +++ b/src/utils/ErrorBuilder.ts @@ -292,6 +292,14 @@ export function EnrichErrorCode(code: string) { message: 'Caso o erro persista, entre em contato com o suporte', code, }; + case ErrorCodes.CATALOG.DATA_ASSET_NOT_FOUND: + return { + statusCode: HttpStatus.NOT_FOUND, + error: 'Não encontramos o ativo solicitado', + message: + 'Tente realizar a ação novamente. Caso o erro persista, entre em contato com o suporte', + code, + }; case ErrorCodes.INTERNAL: case ErrorCodes.UNKNOWN: default: diff --git a/src/utils/errorCodes.ts b/src/utils/errorCodes.ts index 087ddba..19a9d22 100644 --- a/src/utils/errorCodes.ts +++ b/src/utils/errorCodes.ts @@ -67,6 +67,9 @@ const CONNECTION = { const TRANSFORMATION = { NOT_FOUND: 'TRANSFORMATION.NOT_FOUND', }; +const CATALOG = { + DATA_ASSET_NOT_FOUND: 'CATALOG.DATA_ASSET_NOT_FOUND', +}; const ErrorCodes = { UNKNOWN: 'UNKNOWN', RATE_LIMIT: 'RATE_LIMIT', @@ -82,6 +85,7 @@ const ErrorCodes = { INPUT, TRANSFORMATION, CONNECTION, + CATALOG, }; export default ErrorCodes;