From 1223e21ac43002723d1f53b00e33cda279025100 Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Mon, 11 May 2026 12:52:07 -0300 Subject: [PATCH 1/6] FEAT: pipeline upgrade route --- docsfera.json | 45 ++++++++++++++++++- package-lock.json | 8 ++-- package.json | 2 +- .../pipelinesV2/pipelines.controller.ts | 16 +++++++ src/modules/pipelinesV2/pipelines.service.ts | 9 ++++ 5 files changed, 74 insertions(+), 6 deletions(-) diff --git a/docsfera.json b/docsfera.json index 7ec6259..00b43df 100644 --- a/docsfera.json +++ b/docsfera.json @@ -3580,7 +3580,10 @@ "content": { "application/json": { "schema": { - "type": "string" + "type": "array", + "items": { + "type": "object" + } } } } @@ -3644,6 +3647,46 @@ ] } }, + "/pipelinesV2/{id}/upgrade": { + "patch": { + "operationId": "PipelinesController_upgradeConnector", + "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" + } + } + ], + "responses": { + "204": { + "description": "" + } + }, + "tags": [ + "PipelinesV2" + ], + "security": [ + { + "access-token": [] + } + ] + } + }, "/pipelinesV2/init-upload": { "post": { "operationId": "PipelinesController_initUploadFile", diff --git a/package-lock.json b/package-lock.json index a5470e6..f26f5fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@aws-sdk/signature-v4": "^3.370.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.40.0-beta.8", + "@dadosfera/protospack-v2": "3.40.0-beta.9", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1745,9 +1745,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.40.0-beta.8", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.40.0-beta.8.tgz", - "integrity": "sha512-JE5qMjqB3UOM+tCUxB1EwYLQW0PecsaQIa1KDpKEaG3lrzG/H13z8iJi3WH/DuVav2EI94i9VcJWJ1Y0F7ribw==", + "version": "3.40.0-beta.9", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.40.0-beta.9.tgz", + "integrity": "sha512-8jbCpzxQnDax41yhw8yQJLB1VVp4PY8grj2H5oBgV+BCUf2y5lp0EPzLwVZsnOsfsXNAXHyNmbZbAjmJC1ipaw==", "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", diff --git a/package.json b/package.json index ab6d629..878d46a 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@aws-sdk/signature-v4": "^3.370.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.40.0-beta.8", + "@dadosfera/protospack-v2": "3.40.0-beta.9", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/pipelinesV2/pipelines.controller.ts b/src/modules/pipelinesV2/pipelines.controller.ts index c424f51..e90af52 100644 --- a/src/modules/pipelinesV2/pipelines.controller.ts +++ b/src/modules/pipelinesV2/pipelines.controller.ts @@ -15,6 +15,7 @@ import { HttpException, BadRequestException, UseGuards, + Res, } from '@nestjs/common'; import { ApiCreatedResponse, @@ -368,6 +369,21 @@ export class PipelinesController { return response; } + @Patch('/:id/upgrade') + @RequireSomePermission(PERMISSIONS_GROUPS.PIPELINE.permissions.UPDATE) + @HttpCode(HttpStatus.NO_CONTENT) + async upgradeConnector( + @Language() language: LanguageEnum, + @Param('id') id: string, + @User() user: RequestUser + ) { + this.logger.info('PipelinesController - upgrade connector'); + + const metadata = PackTheMetadata(user); + + await this.pipelinesClientService.upgrade(id, metadata); + } + @Delete(':id') @ApiNoContentResponse() @HttpCode(HttpStatus.NO_CONTENT) diff --git a/src/modules/pipelinesV2/pipelines.service.ts b/src/modules/pipelinesV2/pipelines.service.ts index b07330f..53d7711 100644 --- a/src/modules/pipelinesV2/pipelines.service.ts +++ b/src/modules/pipelinesV2/pipelines.service.ts @@ -176,6 +176,15 @@ export class PipelinesService implements OnModuleInit { return updatePipelineResponse; } + async upgrade(id: string, metadata: Metadata) { + await lastValueFrom( + this.pipelineWriteService.Upgrade( + { id }, + metadata, + ), + ); + } + async remove(data: { id: string; metadata: Metadata; user: RequestUser }) { const { id, metadata, user } = data; const info = { From 39c66f030abb3d6923ca76167125c9eac5e0701f Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Mon, 25 May 2026 14:01:00 -0300 Subject: [PATCH 2/6] FIX: release note endpoint --- docsfera.json | 23 ++++++++++ src/app.module.ts | 3 ++ .../release_note/dto/release_note.dto.ts | 14 ++++++ .../release_note.controller.spec.ts | 20 ++++++++ .../release_note/release_note.controller.ts | 26 +++++++++++ .../release_note/release_note.module.ts | 10 ++++ .../release_note/release_note.service.spec.ts | 18 ++++++++ .../release_note/release_note.service.ts | 46 +++++++++++++++++++ 8 files changed, 160 insertions(+) create mode 100644 src/modules/release_note/dto/release_note.dto.ts create mode 100644 src/modules/release_note/release_note.controller.spec.ts create mode 100644 src/modules/release_note/release_note.controller.ts create mode 100644 src/modules/release_note/release_note.module.ts create mode 100644 src/modules/release_note/release_note.service.spec.ts create mode 100644 src/modules/release_note/release_note.service.ts diff --git a/docsfera.json b/docsfera.json index 00b43df..c68e491 100644 --- a/docsfera.json +++ b/docsfera.json @@ -8636,6 +8636,29 @@ "Health" ] } + }, + "/release_note": { + "get": { + "operationId": "ReleaseNoteController_getLatestReleaseNote", + "parameters": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + } + }, + "security": [ + { + "access-token": [] + } + ] + } } }, "info": { diff --git a/src/app.module.ts b/src/app.module.ts index 0865ad2..4db914b 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -35,6 +35,8 @@ import { ShareMetadataModule } from './modules/share-metadata/share-metadata.mod import { ApiKeyModule } from './modules/api-key/api-key.module'; import { PlatformApiModule } from './modules/platform-api/platform-api.module'; import { StorageExplorerModule } from './modules/storage-explorer/storage-explorer.module'; +import { ReleaseNoteModule } from './modules/release_note/release_note.module'; + @Module({ providers: [ @@ -79,6 +81,7 @@ import { StorageExplorerModule } from './modules/storage-explorer/storage-explor StorageExplorerModule, //Always leave HealthModule last, so it is on the bottom of swagger HealthModule, + ReleaseNoteModule, ], }) export class AppModule {} diff --git a/src/modules/release_note/dto/release_note.dto.ts b/src/modules/release_note/dto/release_note.dto.ts new file mode 100644 index 0000000..22cc745 --- /dev/null +++ b/src/modules/release_note/dto/release_note.dto.ts @@ -0,0 +1,14 @@ +export type ReleaseNoteDTO = { + id: string; + date: string; + tag: string; + title: string; + visible: boolean; + expiryDate: string; + content: string; + showEmojis: boolean; + image?: string; + link?: string; + linkText?: string; + }; + \ No newline at end of file diff --git a/src/modules/release_note/release_note.controller.spec.ts b/src/modules/release_note/release_note.controller.spec.ts new file mode 100644 index 0000000..921eca1 --- /dev/null +++ b/src/modules/release_note/release_note.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ReleaseNoteController } from './release_note.controller'; +import { ReleaseNoteService } from './release_note.service'; + +describe('ReleaseNoteController', () => { + let controller: ReleaseNoteController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ReleaseNoteController], + providers: [ReleaseNoteService], + }).compile(); + + controller = module.get(ReleaseNoteController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/modules/release_note/release_note.controller.ts b/src/modules/release_note/release_note.controller.ts new file mode 100644 index 0000000..fde44bd --- /dev/null +++ b/src/modules/release_note/release_note.controller.ts @@ -0,0 +1,26 @@ +import { Controller, Get, Inject } from '@nestjs/common'; +import { ReleaseNoteService } from './release_note.service'; +import { Authenticated } from 'src/decorators/authentication.decorator'; +import { Language } from 'src/decorators/language.decorator'; +import { LanguageEnum } from 'src/utils/languages.enum'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; + +@Controller('release_note') +@Authenticated() +export class ReleaseNoteController { + logger: DadosferaLogger; + + constructor( + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + private readonly releaseNoteService: ReleaseNoteService, + ) { + this.logger = dadosferaLogger.logger; + } + + @Get() + async getLatestReleaseNote(@Language() language: LanguageEnum) { + this.logger.info(`Fetching latest release note for language: ${language}`); + return await this.releaseNoteService.getLatestReleaseNote(language); + } +} diff --git a/src/modules/release_note/release_note.module.ts b/src/modules/release_note/release_note.module.ts new file mode 100644 index 0000000..60cb55c --- /dev/null +++ b/src/modules/release_note/release_note.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { ReleaseNoteService } from './release_note.service'; +import { ReleaseNoteController } from './release_note.controller'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; + +@Module({ + controllers: [ReleaseNoteController], + providers: [ReleaseNoteService, DadosferaLogger] +}) +export class ReleaseNoteModule {} diff --git a/src/modules/release_note/release_note.service.spec.ts b/src/modules/release_note/release_note.service.spec.ts new file mode 100644 index 0000000..72add9d --- /dev/null +++ b/src/modules/release_note/release_note.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ReleaseNoteService } from './release_note.service'; + +describe('ReleaseNoteService', () => { + let service: ReleaseNoteService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ReleaseNoteService], + }).compile(); + + service = module.get(ReleaseNoteService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/modules/release_note/release_note.service.ts b/src/modules/release_note/release_note.service.ts new file mode 100644 index 0000000..776d6e0 --- /dev/null +++ b/src/modules/release_note/release_note.service.ts @@ -0,0 +1,46 @@ +import { Inject, Injectable } from '@nestjs/common'; +import axios, { AxiosInstance } from 'axios'; +import { LanguageEnum } from 'src/utils/languages.enum'; +import { ReleaseNoteDTO } from './dto/release_note.dto'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; + +@Injectable() +export class ReleaseNoteService { + client: AxiosInstance; + logger: DadosferaLogger; + + constructor( + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + ) { + this.logger = dadosferaLogger.logger; + this.client = axios.create({ + baseURL: process.env.FIREBASE_BASE_URL, + }); + } + + async getLatestReleaseNote(lang: LanguageEnum) { + try { + const lng = lang.split('-'); + const language = lng[0] + '-' + lng[1].toUpperCase(); + + const endpoint = `/release_note/${language}.json`; + const { + data, + status, + config + } = await this.client.get(endpoint) + this.logger.info(`Fetched release note for language: ${lang} with status: ${status}`); + this.logger.info(`Request URL: ${config.baseURL}/${config.url}`); + + return data; + } catch (error) { + this.logger.error(`Error fetching release note: ${error.message}`); + + if (axios.isAxiosError(error)) { + this.logger.error(`Axios error details: ${error.toJSON()}`); + } + } + + } +} From 0a99ce1aa45637f9f470c2475e1c6721265be9b9 Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Mon, 25 May 2026 14:09:16 -0300 Subject: [PATCH 3/6] FEAT: update deployment to include firebase base url --- deploy/helm-chart/templates/deployment.yaml | 2 ++ deploy/helm-chart/values-stg.yaml | 1 + deploy/helm-chart/values.yaml | 1 + 3 files changed, 4 insertions(+) diff --git a/deploy/helm-chart/templates/deployment.yaml b/deploy/helm-chart/templates/deployment.yaml index 68b8e1d..518fd7b 100644 --- a/deploy/helm-chart/templates/deployment.yaml +++ b/deploy/helm-chart/templates/deployment.yaml @@ -113,6 +113,8 @@ spec: value: {{ .Values.maestro.platform_api_url }} - name: STORAGE_EXPLORER_API_URL value: {{ .Values.maestro.storage_explorer_api_url | quote }} + - name: FIREBASE_BASE_URL + value: {{ .Values.maestro.firebase_base_url }} - name: JWT_PRIVATE_KEY valueFrom: secretKeyRef: diff --git a/deploy/helm-chart/values-stg.yaml b/deploy/helm-chart/values-stg.yaml index 2c1737d..70d2170 100644 --- a/deploy/helm-chart/values-stg.yaml +++ b/deploy/helm-chart/values-stg.yaml @@ -10,6 +10,7 @@ maestro: redis_database: "1" platform_api_url: https://xs2hkhq07k.execute-api.us-east-1.amazonaws.com storage_explorer_api_url: "http://storage-explorer-{customer}.data-apps.svc.cluster.local:8000/api" + firebase_base_url: https://feature-flag-25bf6-default-rtdb.firebaseio.com/stg hostname: maestro.stg.dadosfera.ai diff --git a/deploy/helm-chart/values.yaml b/deploy/helm-chart/values.yaml index 4e431f5..5042b24 100644 --- a/deploy/helm-chart/values.yaml +++ b/deploy/helm-chart/values.yaml @@ -55,6 +55,7 @@ maestro: redis_database: "0" redis_tls: "true" cookie_secret: "13cc5e136d3074bcc05bec8697092ec1f5f376bf" + firebase_base_url: https://feature-flag-25bf6-default-rtdb.firebaseio.com/prd autoscaling: enabled: false minReplicas: 1 From db2c7d6c02bb08d19ca30bd8ae9b86b86f70c5cb Mon Sep 17 00:00:00 2001 From: marcos-silva-rodrigues Date: Mon, 25 May 2026 17:43:38 -0300 Subject: [PATCH 4/6] FIX: tests --- src/modules/release_note/release_note.controller.spec.ts | 3 ++- src/modules/release_note/release_note.service.spec.ts | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/modules/release_note/release_note.controller.spec.ts b/src/modules/release_note/release_note.controller.spec.ts index 921eca1..6086196 100644 --- a/src/modules/release_note/release_note.controller.spec.ts +++ b/src/modules/release_note/release_note.controller.spec.ts @@ -1,6 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ReleaseNoteController } from './release_note.controller'; import { ReleaseNoteService } from './release_note.service'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; describe('ReleaseNoteController', () => { let controller: ReleaseNoteController; @@ -8,7 +9,7 @@ describe('ReleaseNoteController', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [ReleaseNoteController], - providers: [ReleaseNoteService], + providers: [ReleaseNoteService, DadosferaLogger], }).compile(); controller = module.get(ReleaseNoteController); diff --git a/src/modules/release_note/release_note.service.spec.ts b/src/modules/release_note/release_note.service.spec.ts index 72add9d..266146d 100644 --- a/src/modules/release_note/release_note.service.spec.ts +++ b/src/modules/release_note/release_note.service.spec.ts @@ -1,12 +1,13 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ReleaseNoteService } from './release_note.service'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; describe('ReleaseNoteService', () => { let service: ReleaseNoteService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [ReleaseNoteService], + providers: [ReleaseNoteService, DadosferaLogger], }).compile(); service = module.get(ReleaseNoteService); From e03900811b3b5e89cd2f989993d84882c2b95e37 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Mon, 13 Jul 2026 08:33:35 -0300 Subject: [PATCH 5/6] FEAT: add documentation status enum and property to data asset --- docsfera.json | 9 +++++++++ src/modules/catalog/dtos/index.ts | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/docsfera.json b/docsfera.json index c68e491..0a384a1 100644 --- a/docsfera.json +++ b/docsfera.json @@ -11046,6 +11046,15 @@ }, "docs": { "type": "string" + }, + "documentation_status": { + "type": "string", + "enum": [ + "draft", + "in_review", + "approved", + "deprecated" + ] } }, "required": [ diff --git a/src/modules/catalog/dtos/index.ts b/src/modules/catalog/dtos/index.ts index f35e6e0..09a57b6 100644 --- a/src/modules/catalog/dtos/index.ts +++ b/src/modules/catalog/dtos/index.ts @@ -6,6 +6,12 @@ export enum DataAssetShareType { public = 'public', private = 'private', } +export enum DocumentationStatus { + draft = 'draft', + in_review = 'in_review', + approved = 'approved', + deprecated = 'deprecated', +} export enum OrderEnum { asc = 'asc', desc = 'desc', @@ -204,6 +210,8 @@ export class IUpdateDataRequest { share_type?: DataAssetShareType; @ApiPropertyOptional() docs?: string; + @ApiPropertyOptional({ enum: DocumentationStatus }) + documentation_status?: DocumentationStatus; } export class ICreateDataAsset implements CreateDataAssetRequest { @ApiProperty() From 2e181e70af972b4a25618dbb86fbed960a4c49c2 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Thu, 16 Jul 2026 09:08:11 -0300 Subject: [PATCH 6/6] FEAT: rename documentation_status to certification_status in docs and update package.json for protospack versioning --- docsfera.json | 2 +- package-lock.json | 3 +-- package.json | 2 +- src/modules/catalog/dtos/index.ts | 6 +++--- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docsfera.json b/docsfera.json index c57e7eb..715ab9a 100644 --- a/docsfera.json +++ b/docsfera.json @@ -11014,7 +11014,7 @@ "docs": { "type": "string" }, - "documentation_status": { + "certification_status": { "type": "string", "enum": [ "draft", diff --git a/package-lock.json b/package-lock.json index 28b3128..dcb4ea9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@aws-sdk/lib-dynamodb": "^3.414.0", "@aws-sdk/signature-v4": "^3.370.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "3.40.0-beta.10", + "@dadosfera/protospack-v2": "^3.40.0-beta.10", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1738,7 +1738,6 @@ "version": "3.40.0-beta.10", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.40.0-beta.10.tgz", "integrity": "sha512-F45dSEIKG+gwwDMYHayA242bFwhFTJbZm26KesQbGhf4I45ur6hYZD8dK0voNuVQInLMQhtm6+7th6/jJ8xpTQ==", - "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" diff --git a/package.json b/package.json index dbd506b..fdbc61e 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@aws-sdk/lib-dynamodb": "^3.414.0", "@aws-sdk/signature-v4": "^3.370.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "3.40.0-beta.10", + "@dadosfera/protospack-v2": "^3.40.0-beta.10", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/catalog/dtos/index.ts b/src/modules/catalog/dtos/index.ts index 09a57b6..dab295a 100644 --- a/src/modules/catalog/dtos/index.ts +++ b/src/modules/catalog/dtos/index.ts @@ -6,7 +6,7 @@ export enum DataAssetShareType { public = 'public', private = 'private', } -export enum DocumentationStatus { +export enum CertificationStatus { draft = 'draft', in_review = 'in_review', approved = 'approved', @@ -210,8 +210,8 @@ export class IUpdateDataRequest { share_type?: DataAssetShareType; @ApiPropertyOptional() docs?: string; - @ApiPropertyOptional({ enum: DocumentationStatus }) - documentation_status?: DocumentationStatus; + @ApiPropertyOptional({ enum: CertificationStatus }) + certification_status?: CertificationStatus; } export class ICreateDataAsset implements CreateDataAssetRequest { @ApiProperty()