From 8eb7fd0169cd608176ba5bf327481a377356a6ff Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Fri, 17 Jul 2026 09:55:17 -0300 Subject: [PATCH] FEAT: add endpoint and logic to update data asset certification status --- docsfera.json | 86 ++++++++++++++++++++--- src/authentication/permissions.enum.ts | 10 +++ src/modules/catalog/catalog.controller.ts | 31 ++++++++ src/modules/catalog/catalog.service.ts | 23 ++++++ src/modules/catalog/dtos/index.ts | 10 ++- 5 files changed, 149 insertions(+), 11 deletions(-) diff --git a/docsfera.json b/docsfera.json index 715ab9a..e0aea4c 100644 --- a/docsfera.json +++ b/docsfera.json @@ -5952,6 +5952,66 @@ ] } }, + "/catalog/data-asset/{id}/certification-status": { + "put": { + "operationId": "CatalogController_updateDataAssetCertificationStatus", + "parameters": [ + { + "name": "dadosfera-lang", + "in": "header", + "required": false, + "schema": { + "enum": [ + "pt-br", + "en-us" + ], + "type": "string" + } + }, + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IUpdateCertificationStatusRequest" + } + } + } + }, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IUpdateCertificationStatusRequest" + } + } + } + } + }, + "tags": [ + "Catalog" + ], + "security": [ + { + "access-token": [] + }, + { + "access-token": [] + } + ] + } + }, "/catalog/data-asset/{id}/manage-permissions": { "put": { "operationId": "CatalogController_manageDataAssetPermissions", @@ -11013,15 +11073,6 @@ }, "docs": { "type": "string" - }, - "certification_status": { - "type": "string", - "enum": [ - "draft", - "in_review", - "approved", - "deprecated" - ] } }, "required": [ @@ -11041,6 +11092,23 @@ "data_asset" ] }, + "IUpdateCertificationStatusRequest": { + "type": "object", + "properties": { + "certification_status": { + "type": "string", + "enum": [ + "draft", + "in_review", + "approved", + "deprecated" + ] + } + }, + "required": [ + "certification_status" + ] + }, "ICreateDataAsset": { "type": "object", "properties": { diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index ca5e9ac..82ee026 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -357,6 +357,16 @@ export const PERMISSIONS_GROUPS = { 'es-es': 'Crear y editar atributos en el catálogo', }, }, + CERTIFY: { + seqid: 53, + claim: 'catalog:certify', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Alterar o status de certificação dos Ativos', + 'en-us': "Change Assets' certification status", + 'es-es': 'Cambiar el estado de certificación de los Activos', + }, + }, DELETE: { seqid: 1, claim: 'catalog:delete', diff --git a/src/modules/catalog/catalog.controller.ts b/src/modules/catalog/catalog.controller.ts index f097115..308a082 100644 --- a/src/modules/catalog/catalog.controller.ts +++ b/src/modules/catalog/catalog.controller.ts @@ -17,6 +17,7 @@ import { HttpStatus, Res, } from '@nestjs/common'; +import { ValidationPipe } from '../../pipes/object-validation.pipe'; import { ApiCreatedResponse, ApiHeaders, @@ -46,6 +47,7 @@ import { IMakeAComment, IOneDataAsset, IPreviewResponse, + IUpdateCertificationStatusRequest, IUpdateDataRequest, TriggerCatalogReq, TriggerCatalogRes, @@ -493,6 +495,8 @@ export class CatalogController { language, }); + delete (body as any).certification_status; + const result = await this.catalogService.updateOneDataAsset({ body, data_asset_id, @@ -506,6 +510,33 @@ export class CatalogController { return result; } + @Put('data-asset/:id/certification-status') + @RequireSomePermission( + PERMISSIONS_GROUPS.CATALOG.permissions.CERTIFY, + PERMISSIONS_GROUPS.CATALOG.permissions.DATA_MANAGER, + ) + async updateDataAssetCertificationStatus( + @User() user: RequestUser, + @Language() language: LanguageEnum, + @Param('id') data_asset_id: string, + @Body(new ValidationPipe()) body: IUpdateCertificationStatusRequest, + ): Promise { + const { customer_id, customer_name, user_id, username } = user; + const metadata = PackTheMetadata({ + customer_id, + customer_name, + user_id, + username, + language, + }); + + return this.catalogService.updateCertificationStatus({ + body, + data_asset_id, + metadata, + }); + } + @Post('data-asset/:id/docs') @RequireSomePermission( PERMISSIONS_GROUPS.CATALOG.permissions.UPDATE, diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 638e7b4..f0fced8 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -29,6 +29,7 @@ import { AssetReporter, BatchRemoveRlsRulesRequest, CreateDataDocsDTO, + IUpdateCertificationStatusRequest, IUpdateDataRequest, TriggerCatalogReq, } from './dtos'; @@ -384,6 +385,28 @@ class CatalogService implements OnModuleInit { return { data_asset: asset[0] }; } + async updateCertificationStatus(data: { + data_asset_id: string; + body: IUpdateCertificationStatusRequest; + metadata: Metadata; + }) { + const { body, data_asset_id, metadata } = data; + + await lastValueFrom( + this.catalogWriteService.UpdateDataAsset( + { + id: data_asset_id, + changes: JSON.stringify({ + certification_status: body.certification_status, + }), + }, + metadata, + ), + ); + + return { certification_status: body.certification_status }; + } + async updateOneDataAsset(data: { data_asset_id: string; customer_id: string; diff --git a/src/modules/catalog/dtos/index.ts b/src/modules/catalog/dtos/index.ts index dab295a..770b01c 100644 --- a/src/modules/catalog/dtos/index.ts +++ b/src/modules/catalog/dtos/index.ts @@ -1,4 +1,5 @@ import { ApiProperty, ApiPropertyOptional, PickType } from '@nestjs/swagger'; +import { IsEnum } from 'class-validator'; import { CreateDataAssetRequest } from '@dadosfera/protospack-v2/dist/lib/Catalog/interfaces/messages'; export enum DataAssetShareType { @@ -210,9 +211,14 @@ export class IUpdateDataRequest { share_type?: DataAssetShareType; @ApiPropertyOptional() docs?: string; - @ApiPropertyOptional({ enum: CertificationStatus }) - certification_status?: CertificationStatus; } + +export class IUpdateCertificationStatusRequest { + @ApiProperty({ enum: CertificationStatus }) + @IsEnum(CertificationStatus) + certification_status: CertificationStatus; +} + export class ICreateDataAsset implements CreateDataAssetRequest { @ApiProperty() display_name: string;