From 918c3d7416cbb331d38868b2e5aeb2c2b7d9d3a4 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Mon, 15 Dec 2025 09:08:08 -0300 Subject: [PATCH 01/22] FIX: Enhance searchDataAssets to convert owner names to IDs and log the conversion --- docsfera.json | 8 ++++++++ src/modules/catalog/catalog.service.ts | 27 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/docsfera.json b/docsfera.json index 4d80f69..4f1c426 100644 --- a/docsfera.json +++ b/docsfera.json @@ -4483,6 +4483,14 @@ "schema": { "type": "string" } + }, + { + "name": "asset_type", + "required": true, + "in": "query", + "schema": { + "type": "string" + } } ], "responses": { diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 5929849..9d99f7d 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -243,6 +243,33 @@ class CatalogService implements OnModuleInit { const { search, page, size, sort_by, order, ...filters } = query; + if (filters.owner) { + const { users: customer_users } = + await this.userService.findAllUsersByCustomerId(customer_id); + + const ownerValues = Array.isArray(filters.owner) + ? filters.owner + : (typeof filters.owner === 'string' && filters.owner.includes(',') + ? filters.owner.split(',').map((o: string) => o.trim()) + : [filters.owner]); + + const ownerIds = ownerValues + .map((ownerValue: string) => { + const user = customer_users.find(u => + u.name === ownerValue || u.email === ownerValue || u.id === ownerValue + ); + return user ? user.id : ownerValue; + }) + .filter((id: string) => id); + + filters.owner = ownerIds; + + this.logger.info('Converted owner names to IDs:', { + original: ownerValues, + converted: ownerIds + }); + } + const { data_assets, total } = await lastValueFrom( this.catalogReadService.GetAllDataAssets( { From 288aaeabc0799262f16664fab42d1d6f0a9a0e98 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Mon, 15 Dec 2025 12:00:50 -0300 Subject: [PATCH 02/22] FIX: Enhance filter handling in BuildDataAssetsFilterTerms to support empty owner condition --- src/modules/catalog/catalog.service.ts | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 9d99f7d..39090b1 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -240,10 +240,10 @@ class CatalogService implements OnModuleInit { ) { this.logger.info('CatalogService - searchDataAssets'); - const { search, page, size, sort_by, order, ...filters } = query; - - if (filters.owner) { + + // Verificar se filters.owner existe + if (filters.owner !== undefined && filters.owner !== null) { const { users: customer_users } = await this.userService.findAllUsersByCustomerId(customer_id); @@ -253,7 +253,11 @@ class CatalogService implements OnModuleInit { ? filters.owner.split(',').map((o: string) => o.trim()) : [filters.owner]); - const ownerIds = ownerValues + // Separar "sem owner" (marcador especial __null__) dos owners normais + const hasEmptyOwner = ownerValues.some(v => v === '__null__'); + const normalOwners = ownerValues.filter(v => v !== '__null__'); + + const ownerIds = normalOwners .map((ownerValue: string) => { const user = customer_users.find(u => u.name === ownerValue || u.email === ownerValue || u.id === ownerValue @@ -262,13 +266,12 @@ class CatalogService implements OnModuleInit { }) .filter((id: string) => id); - filters.owner = ownerIds; - - this.logger.info('Converted owner names to IDs:', { - original: ownerValues, - converted: ownerIds - }); - } + // Se tiver "sem owner", adicionar marcador especial + if (hasEmptyOwner) { + ownerIds.push('__null__'); + } + + filters.owner = ownerIds.length > 0 ? ownerIds : undefined; const { data_assets, total } = await lastValueFrom( this.catalogReadService.GetAllDataAssets( From fcf7fb054e7fa4f5e3fc84fd27e2e45a4f85631a Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Tue, 16 Dec 2025 09:55:24 -0300 Subject: [PATCH 03/22] FIX: Update searchDataAssets to handle owner filtering and convert owner names to IDs --- src/modules/catalog/catalog.service.ts | 46 +++++++++++++++----------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 39090b1..c56313e 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -240,38 +240,44 @@ class CatalogService implements OnModuleInit { ) { this.logger.info('CatalogService - searchDataAssets'); - const { search, page, size, sort_by, order, ...filters } = query; + const { search, page, size, sort_by, order, owner, ...filters } = query; // Verificar se filters.owner existe - if (filters.owner !== undefined && filters.owner !== null) { + if (owner !== undefined && owner !== null) { const { users: customer_users } = await this.userService.findAllUsersByCustomerId(customer_id); - const ownerValues = Array.isArray(filters.owner) - ? filters.owner - : (typeof filters.owner === 'string' && filters.owner.includes(',') - ? filters.owner.split(',').map((o: string) => o.trim()) - : [filters.owner]); + let ownerValues: string[]; + if (Array.isArray(owner)) { + ownerValues = owner; + } else if (typeof owner === 'string' && owner.includes(',')) { + ownerValues = owner.split(',').map((o: string) => o.trim()); + } else { + ownerValues = [owner]; + } - // Separar "sem owner" (marcador especial __null__) dos owners normais - const hasEmptyOwner = ownerValues.some(v => v === '__null__'); - const normalOwners = ownerValues.filter(v => v !== '__null__'); + // Separar "sem owner" (marcador especial null) dos owners normais + const hasEmptyOwner = ownerValues.some(v => v === 'null'); + const normalOwners = ownerValues.filter(v => v !== 'null'); - const ownerIds = normalOwners - .map((ownerValue: string) => { - const user = customer_users.find(u => - u.name === ownerValue || u.email === ownerValue || u.id === ownerValue - ); - return user ? user.id : ownerValue; - }) - .filter((id: string) => id); + // Converter nomes de owners para IDs + const ownerIds = normalOwners.map((ownerValue: string) => { + const user = customer_users.find(u => + u.name === ownerValue || u.email === ownerValue || u.id === ownerValue + ); + return user ? user.id : ownerValue; + }); // Se tiver "sem owner", adicionar marcador especial if (hasEmptyOwner) { - ownerIds.push('__null__'); + ownerIds.push('null'); } - filters.owner = ownerIds.length > 0 ? ownerIds : undefined; + // Adicionar ao filters apenas se houver valores + if (ownerIds.length > 0) { + filters.owner = ownerIds; + } + } const { data_assets, total } = await lastValueFrom( this.catalogReadService.GetAllDataAssets( From bd231382ebf3f5567d7cd38a21c037090e0a7c22 Mon Sep 17 00:00:00 2001 From: Rafael Moraes Date: Tue, 16 Dec 2025 19:58:38 +0000 Subject: [PATCH 04/22] =?UTF-8?q?WIP:=20adiciona=20par=C3=A2metro=20asset?= =?UTF-8?q?=5Ftype=20no=20docsfera.json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docsfera.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docsfera.json b/docsfera.json index 4d80f69..4f1c426 100644 --- a/docsfera.json +++ b/docsfera.json @@ -4483,6 +4483,14 @@ "schema": { "type": "string" } + }, + { + "name": "asset_type", + "required": true, + "in": "query", + "schema": { + "type": "string" + } } ], "responses": { From fc9c0b09910238b4bc6df67e47df0f4079465148 Mon Sep 17 00:00:00 2001 From: Rafael Moraes Date: Tue, 16 Dec 2025 19:54:03 +0000 Subject: [PATCH 05/22] WIP: Filtro Source - backend --- src/modules/catalog/catalog.service.ts | 304 +++++++++++++------------ 1 file changed, 153 insertions(+), 151 deletions(-) diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index c56313e..7660cd6 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -41,7 +41,6 @@ import { import { TypeParser } from 'src/utils/FileParser/parser-types'; import { ParserBuilder } from 'src/utils/FileParser/parser.builder'; - class CatalogService implements OnModuleInit { catalogReadService: ReadService.CatalogReadServices; catalogWriteService: WriteService.CatalogWriteServices; @@ -58,7 +57,6 @@ class CatalogService implements OnModuleInit { this.logger = dadosferaLogger.logger; } - onModuleInit() { this.catalogReadService = this.grpcClient.getService( @@ -74,81 +72,65 @@ class CatalogService implements OnModuleInit { ); } - _getNimbusUrl(body) { this.logger.debug(`Body: ${JSON.stringify(body)}`); const customer = body.info.customer.toLowerCase(); - if (process.env.ENV === 'prd') { return `https://nimbus-${customer}.dadosfera.ai`; } - return `https://nimbus-${customer}.${process.env.ENV.replace( 'local', 'stg', )}.dadosfera.ai`; } - async getPiiReporter(metadata: Metadata, type: TypeParser) { - this.logger.info('getPiiReporter: ' + type) + this.logger.info('getPiiReporter: ' + type); try { - const { - data - } = await lastValueFrom( - this.catalogWriteService.GetPiiReporter({}, metadata) - ) - this.logger.info("Finish grpc call") - + const { data } = await lastValueFrom( + this.catalogWriteService.GetPiiReporter({}, metadata), + ); + this.logger.info('Finish grpc call'); const parser = ParserBuilder.build(type); - - this.logger.info('parser file to: ' + type) - const file = await parser.parse(data) - this.logger.info('finish parser') + this.logger.info('parser file to: ' + type); + const file = await parser.parse(data); + this.logger.info('finish parser'); const mimeTypes: Record = { - 'csv': 'text/csv', - 'html': 'text/html', - 'pdf': 'application/pdf' - } - + csv: 'text/csv', + html: 'text/html', + pdf: 'application/pdf', + }; const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const filename = `relatorio-pii-${timestamp}.${type}`; - return { file, filename: filename, - type: mimeTypes[type] - } + type: mimeTypes[type], + }; } catch (error) { this.logger.error(error.message); throw error; } - - } - 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), ); } - async managePermissions(data: Messages.ManagePermissionRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.ManagePermission(data, metadata), ).catch((err) => { @@ -159,11 +141,9 @@ class CatalogService implements OnModuleInit { }); } - async revokePermissions(data: Messages.RevokePermissionRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.RevokePermission(data, metadata), ).catch((err) => { @@ -174,11 +154,9 @@ class CatalogService implements OnModuleInit { }); } - async commentOnDataAsset(data: Messages.MakeACommentRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.MakeAComment(data, metadata), ).catch((err) => { @@ -189,11 +167,9 @@ class CatalogService implements OnModuleInit { }); } - async deleteComment(data: Messages.UpdateACommentRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.UpdateAComment(data, metadata), ).catch((err) => { @@ -204,11 +180,9 @@ class CatalogService implements OnModuleInit { }); } - async deleteDataAsset(data: Messages.DeleteDataAssetRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.DeleteDataAsset(data, metadata), ).catch((err) => { @@ -219,61 +193,110 @@ class CatalogService implements OnModuleInit { }); } - async getUserRolesIds(userId: string) { const result = await this.userService.findOneById(userId).catch(() => null); - if (result) { return result.user.roles.map((role) => role.id); } - return []; } - async searchDataAssets( query: Record, metadata: Metadata, customer_id: string, ) { - this.logger.info('CatalogService - searchDataAssets'); + this.logger.info('CatalogService - searchDataAssets', { query }); - const { search, page, size, sort_by, order, owner, ...filters } = query; - - // Verificar se filters.owner existe - if (owner !== undefined && owner !== null) { + const { search, page, size, sort_by, order, ...filters } = query; + + this.logger.debug('Extracted filters:', { filters }); + + console.log('MAESTRO VAI CHAMAR PI-FACTORY COM (ANTES AJUSTE):', { + search, + page, + size, + sort_by, + order, + filters, + }); + + // 🔥 AJUSTE DO manually AQUI: converte '1'/'0' string em número ou remove + if ( + filters.manually !== undefined && + filters.manually !== null && + filters.manually !== '' + ) { + filters.manually = Number(filters.manually); // 1 ou 0 + } else { + delete filters.manually; + } + + console.log('MAESTRO VAI CHAMAR PI-FACTORY COM (DEPOIS AJUSTE):', { + search, + page, + size, + sort_by, + order, + filters, + }); + + if (filters.owner) { const { users: customer_users } = await this.userService.findAllUsersByCustomerId(customer_id); - let ownerValues: string[]; - if (Array.isArray(owner)) { - ownerValues = owner; - } else if (typeof owner === 'string' && owner.includes(',')) { - ownerValues = owner.split(',').map((o: string) => o.trim()); - } else { - ownerValues = [owner]; - } - - // Separar "sem owner" (marcador especial null) dos owners normais - const hasEmptyOwner = ownerValues.some(v => v === 'null'); - const normalOwners = ownerValues.filter(v => v !== 'null'); - - // Converter nomes de owners para IDs - const ownerIds = normalOwners.map((ownerValue: string) => { - const user = customer_users.find(u => - u.name === ownerValue || u.email === ownerValue || u.id === ownerValue - ); - return user ? user.id : ownerValue; + this.logger.info('Available users in database count:', { + count: customer_users.length, + }); + this.logger.info('First 5 users:', { + users: customer_users + .slice(0, 5) + .map((u) => ({ id: u.id, email: u.email, name: u.name })), }); - // Se tiver "sem owner", adicionar marcador especial - if (hasEmptyOwner) { - ownerIds.push('null'); - } + const ownerValues = Array.isArray(filters.owner) + ? filters.owner + : typeof filters.owner === 'string' && filters.owner.includes(',') + ? filters.owner.split(',').map((o: string) => o.trim()) + : [filters.owner]; + + this.logger.info('Owner values to convert:', { + ownerValues, + ownerFiltersOriginal: filters.owner, + }); + + const ownerIds = ownerValues + .map((ownerValue: string) => { + const normalizedOwner = ownerValue.replace(/\s/g, '+'); + const user = customer_users.find((u) => { + const isIdMatch = u.id === ownerValue; + const isEmailMatch = + u.email === ownerValue || u.email === normalizedOwner; + const isNameMatch = + u.name === ownerValue || u.name === normalizedOwner; + this.logger.info('Comparing:', { + userId: u.id, + userEmail: u.email, + userName: u.name, + filterValue: ownerValue, + normalizedFilter: normalizedOwner, + idMatch: isIdMatch, + emailMatch: isEmailMatch, + nameMatch: isNameMatch, + }); + return isIdMatch || isEmailMatch || isNameMatch; + }); + this.logger.info('Looking for owner result:', { + ownerValue, + found: !!user, + userId: user?.id, + }); + return user?.id || ownerValue; + }) + .filter((id: string) => id); - // Adicionar ao filters apenas se houver valores if (ownerIds.length > 0) { filters.owner = ownerIds; } @@ -293,20 +316,18 @@ class CatalogService implements OnModuleInit { ), ); + console.log('MAESTRO RECEBEU RESPOSTA DO PI-FACTORY'); const result = JSON.parse(data_assets); - const response = await this.getAssetsUsersAndRoles( result.data_assets, customer_id, ); - return { data_assets: response, total }; } - async downloadAssets( query: Record, metadata: Metadata, @@ -314,33 +335,27 @@ class CatalogService implements OnModuleInit { ) { const data = await this.searchDataAssets(query, metadata, customer_id); - - const formatData = data.data_assets.map(asset => ({ + const formatData = data.data_assets.map((asset) => ({ id: asset.id, display_name: asset.display_name, data_asset_type: asset.data_asset_type, created_at: asset.created_at, - tags: '[' + asset.tags.join(', ') + ']' - })) - + tags: '[' + asset.tags.join(', ') + ']', + })); const parser = ParserBuilder.build('csv'); - const file = await parser.parse(formatData); - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const filename = `dadosfera_assets_${timestamp}.csv`; - return { file, - filename - } + filename, + }; } - async getOneDataAsset(data: { id: string; customer_id: string; @@ -361,11 +376,9 @@ class CatalogService implements OnModuleInit { }; asset = await this.getAssetsUsersAndRoles([asset], customer_id); - return { data_asset: asset[0] }; } - async getOneDataAssetByPipelineAndObject(data: { customer_id: string; pipeline: string; @@ -387,11 +400,9 @@ class CatalogService implements OnModuleInit { }; asset = await this.getAssetsUsersAndRoles([asset], customer_id); - return { data_asset: asset[0] }; } - async updateOneDataAsset(data: { data_asset_id: string; customer_id: string; @@ -400,7 +411,6 @@ class CatalogService implements OnModuleInit { }) { 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) }, @@ -415,7 +425,6 @@ class CatalogService implements OnModuleInit { }; asset = await this.getAssetsUsersAndRoles([asset], customer_id); - return { data_asset: asset[0] }; } @@ -423,12 +432,11 @@ class CatalogService implements OnModuleInit { const { documentation } = await lastValueFrom( this.catalogReadService.GetDatasetDoc({ id }, metadata), ); - + const docs = JSON.parse(documentation); return docs; } - async getDatasetPreview(id: string, metadata: Metadata) { const { preview } = await lastValueFrom( this.catalogReadService.GetDatasetPreview( @@ -440,7 +448,6 @@ class CatalogService implements OnModuleInit { return result; } - async getDatasetColumnsMetadata(id: string, metadata: Metadata) { const { columns_metadata } = await lastValueFrom( this.catalogReadService.GetDatasetColumnsMetadata( @@ -456,7 +463,7 @@ class CatalogService implements OnModuleInit { if (body.asset_type === 'table' || body.asset_type === 'view') { return this.createDataDocsViaNimbus(body); } - + return this.createDataDocsViaGrpc(body, metadata); } @@ -470,7 +477,6 @@ class CatalogService implements OnModuleInit { return data; } - private async createDataDocsViaGrpc(body: CreateDataDocsDTO, metadata: Metadata) { this.logger.info('Creating data docs via gRPC for other asset types'); try { @@ -483,9 +489,8 @@ class CatalogService implements OnModuleInit { metadata, ), ); - + return response; - } catch (error) { this.logger.error('Error creating data asset docs:', error); throw new HttpException( @@ -498,7 +503,6 @@ class CatalogService implements OnModuleInit { async findAllTags(data, metadata) { this.logger.info('CatalogService - findAllCustomerTags'); - const response = await lastValueFrom( this.catalogReadService.GetCustomerTags(data, metadata), ) @@ -511,9 +515,9 @@ class CatalogService implements OnModuleInit { throw new Error(err); }); - return response; } + async getAssetsUsersAndRoles(data_assets: Array, customer_id: string) { const { users: customer_users } = await this.userService.findAllUsersByCustomerId(customer_id); @@ -526,17 +530,15 @@ class CatalogService implements OnModuleInit { (u) => u.id === data_asset.owner, )?.email; - const roles = []; const users = []; - const data_asset_roles = data_asset?.roles || [] + const data_asset_roles = data_asset?.roles || []; for (const role_id of data_asset_roles) { const role = customer_roles.find((r) => r.id === role_id); if (role) roles.push({ id: role.id, name: role.name }); } - - const data_asset_users = data_asset?.users || [] + const data_asset_users = data_asset?.users || []; for (const user_id of data_asset_users) { const user = customer_users.find((r) => r.id === user_id); if (user) users.push({ id: user.id, email: user.email }); @@ -550,7 +552,6 @@ class CatalogService implements OnModuleInit { }); } - async triggerCatalog(data: TriggerCatalogReq, metadata: Metadata) { const { session } = await lastValueFrom( this.catalogWriteService.TriggerDatasetCataloging(data, metadata), @@ -564,7 +565,6 @@ class CatalogService implements OnModuleInit { return res; } - async addRlsRule(data: AddRlsRuleRequest, metadata: Metadata) { const res = await lastValueFrom( this.catalogWriteService.AddRlsRule(data, metadata), @@ -572,7 +572,6 @@ class CatalogService implements OnModuleInit { return res; } - async removeRlsRule(id: number, metadata: Metadata) { const res = await lastValueFrom( this.catalogWriteService.RemoveRlsRule({ id }, metadata), @@ -580,14 +579,12 @@ class CatalogService implements OnModuleInit { return res; } - async batchRemoveRlsRule( query: BatchRemoveRlsRulesRequest, metadata: Metadata, ) { const { id_rls, nimbus_dashboard_id } = query; - if (id_rls && nimbus_dashboard_id) { throw new BadRequestException( "You can't delete using both parameters. Choose either 'id_rls' or 'nimbus_dashboard_id'", @@ -608,7 +605,6 @@ class CatalogService implements OnModuleInit { return 'OK'; } - async getRlsRules(data: GetRlsRulesRequest, metadata: Metadata) { const res = await lastValueFrom( this.catalogReadService.GetRlsRules(data, metadata), @@ -616,7 +612,6 @@ class CatalogService implements OnModuleInit { return res.rls_rules; } - async getOneRlsRule(id: number, metadata: Metadata) { const res = await lastValueFrom( this.catalogReadService.GetOneRlsRule({ id }, metadata), @@ -624,7 +619,6 @@ class CatalogService implements OnModuleInit { return res.rls_rule; } - async getNimbusDashboards( data: GetNimbusDashboardsRequest, metadata: Metadata, @@ -635,88 +629,99 @@ class CatalogService implements OnModuleInit { return res.dashboards; } - async createTableMetadata(body: any): Promise { const nimbusUrl = this._getNimbusUrl(body); - this.logger.info(`Nimbus URL: ${nimbusUrl}`, {...body.logMetadata}); - + this.logger.info(`Nimbus URL: ${nimbusUrl}`, { ...body.logMetadata }); const endpoint = `${nimbusUrl}/api/catalog/table-metadata/`; - - this.logger.info(`Creating table metadata for table ${body.table_metadata.table_name}`, {...body.logMetadata}); - this.logger.info(`Using endpoint: ${endpoint}`, {...body.logMetadata}); - this.logger.debug(`Payload: ${JSON.stringify(body.table_metadata)}`, {...body.logMetadata}); - + this.logger.info( + `Creating table metadata for table ${body.table_metadata.table_name}`, + { ...body.logMetadata }, + ); + this.logger.info(`Using endpoint: ${endpoint}`, { ...body.logMetadata }); + this.logger.debug(`Payload: ${JSON.stringify(body.table_metadata)}`, { + ...body.logMetadata, + }); try { - const { data, status } = await axios.post(endpoint, {...body.table_metadata}); - + const { data, status } = await axios.post(endpoint, { + ...body.table_metadata, + }); this.logger.info( `Table metadata created successfully with status ${status} for table ${body.table_metadata.table_name}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); return data.id; } catch (error) { this.logger.error( `Failed to create table metadata for table ${body.table_metadata.table_name} failed with status ${ error.response?.status - } because of ${JSON.stringify(error.response?.data) || error.message}`, {...body.logMetadata}); + } because of ${JSON.stringify(error.response?.data) || error.message}`, + { ...body.logMetadata }, + ); throw new Error(error.response?.data?.message || error.message); } } - async createColumnMetadata(body: any): Promise { const nimbusUrl = this._getNimbusUrl(body); this.logger.info(`Nimbus URL: ${nimbusUrl}`, body.logMetadata); const endpoint = `${nimbusUrl}/api/catalog/column-metadata/`; - - - - try { - this.logger.info(`Creating column metadata for table ${body.column_metadata.table_name}`, {...body.logMetadata}); - this.logger.info(`Using endpoint: ${endpoint}`, {...body.logMetadata}); - this.logger.debug(`Payload: ${JSON.stringify(body.column_metadata)}`, {...body.logMetadata}); - const { data, status } = await axios.post(endpoint, body.column_metadata); - + this.logger.info( + `Creating column metadata for table ${body.column_metadata.table_name}`, + { ...body.logMetadata }, + ); + this.logger.info(`Using endpoint: ${endpoint}`, { ...body.logMetadata }); + this.logger.debug( + `Payload: ${JSON.stringify(body.column_metadata)}`, + { ...body.logMetadata }, + ); + const { data, status } = await axios.post( + endpoint, + body.column_metadata, + ); this.logger.info( `Column metadata created successfully with status ${status} for table ${body.column_metadata.table_name}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); return data.map((column) => column.id); } catch (error) { this.logger.error( `Failed to create column metadata failed with status for table ${body.column_metadata.table_name} ${ error.response?.status - } because of ${error.response?.data || error.message}`, {...body.logMetadata}); + } because of ${error.response?.data || error.message}`, + { ...body.logMetadata }, + ); throw new Error(error.response?.data?.message || error.message); } } - async createDataPreview(body: any): Promise { const nimbusUrl = this._getNimbusUrl(body); - this.logger.info(`Nimbus URL: ${nimbusUrl}`, {...body.logMetadata}); + this.logger.info(`Nimbus URL: ${nimbusUrl}`, { ...body.logMetadata }); const endpoint = `${nimbusUrl}/api/catalog/data-preview/`; - - this.logger.info(`Creating data preview for table ${body.data_preview.table_name}`, {...body.logMetadata}); - this.logger.info(`Using endpoint: ${endpoint}`, {...body.logMetadata}); - this.logger.debug(`Payload: ${JSON.stringify(body.data_preview)}`, {...body.logMetadata}); - + this.logger.info( + `Creating data preview for table ${body.data_preview.table_name}`, + { ...body.logMetadata }, + ); + this.logger.info(`Using endpoint: ${endpoint}`, { ...body.logMetadata }); + this.logger.debug( + `Payload: ${JSON.stringify(body.data_preview)}`, + { ...body.logMetadata }, + ); try { const { data, status } = await axios.post(endpoint, body.data_preview); - this.logger.info( `Data preview created successfully with status ${status} for table ${body.data_preview.table_name}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); return data.id; } catch (error) { @@ -724,17 +729,15 @@ class CatalogService implements OnModuleInit { `Failed to create data preview for table ${body.data_preview.table_name} failed with status ${ error.response?.status } because of ${error.response?.data || error.message}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); throw new Error(error.response?.data?.message || error.message); } } - async catalogDatasetItem(table_metadata_id: number, metadata: Metadata) { const customer_name_raw = metadata.get('customer_name'); - const customer_name = customer_name_raw?.[0]?.toString(); if (!customer_name) { throw new BadRequestException('Customer name not found in metadata'); @@ -757,5 +760,4 @@ class CatalogService implements OnModuleInit { } } - export { CatalogService }; From ea44a1cbb681117940acfcfba8bc311c6837e078 Mon Sep 17 00:00:00 2001 From: Rafael Moraes Date: Tue, 16 Dec 2025 20:52:28 +0000 Subject: [PATCH 06/22] FEAT: Manual/Auto filter and UX Adjusments --- src/modules/catalog/catalog.service.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 7660cd6..89dcf84 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -223,7 +223,6 @@ class CatalogService implements OnModuleInit { filters, }); - // 🔥 AJUSTE DO manually AQUI: converte '1'/'0' string em número ou remove if ( filters.manually !== undefined && filters.manually !== null && From 865140e6819ecc1c445b26f747114df4961d8a47 Mon Sep 17 00:00:00 2001 From: Rafael Date: Tue, 16 Dec 2025 21:05:21 -0300 Subject: [PATCH 07/22] fix: pass type field to Elasticsearch createPipeline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The type field was missing from the createPipeline call, causing ES documents to not have the type field set. Maps: jdbc->database, singer->application, s3->file 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/modules/platform-api/platform-api.controller.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/platform-api/platform-api.controller.ts b/src/modules/platform-api/platform-api.controller.ts index 1f1fc98..383647c 100644 --- a/src/modules/platform-api/platform-api.controller.ts +++ b/src/modules/platform-api/platform-api.controller.ts @@ -490,6 +490,7 @@ export class PlatformApiController { cron: body.cron, tables: inputId, properties, + type: this.mapConnectorToDynamoType(connectorType), }, connector, ); From e99306adbaf1ce303802e5f4cdf912ead41467fc Mon Sep 17 00:00:00 2001 From: Rafael Date: Wed, 17 Dec 2025 13:45:18 -0300 Subject: [PATCH 08/22] fix: store reference_column as object with name and type MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The protobuf definition expects reference_column to be an object with name and type fields, but it was being stored as just a string (column name). This caused pipeline fetching to fail with the error: ".NewTable.reference_column: object expected" Changes: - Update ReferenceColumn interface in DynamoDB service - Update extractTablesFromJobs to create reference_column object - Update syncJobInputToDynamoDB to handle reference_column object 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../platform-api/platform-api.controller.ts | 38 ++++++++++++------- src/services/dynamodb/dynamodb.service.ts | 11 ++++-- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/modules/platform-api/platform-api.controller.ts b/src/modules/platform-api/platform-api.controller.ts index 383647c..78b273e 100644 --- a/src/modules/platform-api/platform-api.controller.ts +++ b/src/modules/platform-api/platform-api.controller.ts @@ -22,7 +22,7 @@ import { User, RequestUser } from '../../decorators/user.decorator'; import { PlatformApiService } from './platform-api.service'; import { PERMISSIONS_GROUPS } from '../../authentication/permissions.enum'; import { ElasticsearchService } from '../../services/elasticsearch'; -import { DynamoDBService } from '../../services/dynamodb'; +import { DynamoDBService, ReferenceColumn } from '../../services/dynamodb'; import { CustomersService } from '../customers/customers.service'; import { validateCronAgainstScheduleLimit } from '../../utils/cron-validation'; @@ -155,7 +155,7 @@ export class PlatformApiController { * Extract and transform tables from jobs for DynamoDB input. * Maps connector-specific fields to a common table format. * - * - JDBC: load_type, table_name, column_include_list (columns), incremental_column_name (reference_column) + * - JDBC: load_type, table_name, column_include_list (columns), incremental_column_name/type (reference_column object) * - Singer: type maps replication_method (FULL_TABLE -> full_load, INCREMENTAL -> incremental), no columns * - S3: same mapping as Singer, no columns */ @@ -163,7 +163,7 @@ export class PlatformApiController { name: string; type: string; columns?: string[]; - reference_column?: string; + reference_column?: ReferenceColumn; }> { if (!jobs || jobs.length === 0) return []; @@ -171,7 +171,7 @@ export class PlatformApiController { name: string; type: string; columns?: string[]; - reference_column?: string; + reference_column?: ReferenceColumn; }> = []; for (const job of jobs) { @@ -179,12 +179,12 @@ export class PlatformApiController { if (!input) continue; if (connector === 'jdbc') { - // JDBC: table_name, load_type, column_include_list, incremental_column_name + // JDBC: table_name, load_type, column_include_list, incremental_column_name/type const table: { name: string; type: string; columns?: string[]; - reference_column?: string; + reference_column?: ReferenceColumn; } = { name: input.table_name || '', type: input.load_type || 'full_load', @@ -193,8 +193,11 @@ export class PlatformApiController { table.columns = input.column_include_list; } if (input.incremental_column_name) { - // reference_column is stored as a string (column name) - table.reference_column = input.incremental_column_name; + // reference_column is stored as an object with name and type + table.reference_column = { + name: input.incremental_column_name, + type: input.incremental_column_type || 'unknown', + }; } tables.push(table); } else if (connector === 'singer' || connector === 's3') { @@ -317,11 +320,11 @@ export class PlatformApiController { } // Build changes for DynamoDB table entry - // reference_column is stored as a string (column name), not an object + // reference_column is stored as an object with name and type const changes: { type?: string; columns?: string[]; - reference_column?: string | null; + reference_column?: ReferenceColumn | null; } = {}; @@ -332,8 +335,15 @@ export class PlatformApiController { changes.columns = body.column_include_list; } if ('incremental_column_name' in body) { - // reference_column is just the column name as a string - changes.reference_column = body.incremental_column_name || null; + // reference_column is stored as an object with name and type + if (body.incremental_column_name) { + changes.reference_column = { + name: body.incremental_column_name, + type: body.incremental_column_type || 'unknown', + }; + } else { + changes.reference_column = null; + } } // Update DynamoDB if there are changes @@ -466,11 +476,13 @@ export class PlatformApiController { }); } + const pipelineType = this.mapConnectorToDynamoType(connectorType); this.logger.info('Syncing pipeline to Elasticsearch', { customerName: user.customer_name, pipelineId: body.id, plugin, connector: connectorType, + type: pipelineType, properties, inputId, }); @@ -490,7 +502,7 @@ export class PlatformApiController { cron: body.cron, tables: inputId, properties, - type: this.mapConnectorToDynamoType(connectorType), + type: pipelineType, }, connector, ); diff --git a/src/services/dynamodb/dynamodb.service.ts b/src/services/dynamodb/dynamodb.service.ts index 099eb99..15dde41 100644 --- a/src/services/dynamodb/dynamodb.service.ts +++ b/src/services/dynamodb/dynamodb.service.ts @@ -11,6 +11,11 @@ import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { v4 as uuid } from 'uuid'; import { DYNAMODB_CONFIG } from './dynamodb.config'; +export interface ReferenceColumn { + name: string; + type: string; +} + export interface InputDocument { id: string; client_id: string; @@ -24,7 +29,7 @@ export interface InputDocument { name: string; type: string; columns?: string[]; - reference_column?: string; + reference_column?: ReferenceColumn; }>; credentials?: Record; } @@ -62,7 +67,7 @@ export class DynamoDBService { name: string; type: string; columns?: string[]; - reference_column?: string; + reference_column?: ReferenceColumn; }>; }, ): Promise { @@ -157,7 +162,7 @@ export class DynamoDBService { changes: { type?: string; columns?: string[]; - reference_column?: string | null; + reference_column?: ReferenceColumn | null; }, ): Promise { const dynamoTableName = DYNAMODB_CONFIG.inputsTable(); From bce73fb11f3b03f65f06df953f25ebfb627502ed Mon Sep 17 00:00:00 2001 From: Marcos Rodrigues Date: Wed, 17 Dec 2025 17:24:03 -0300 Subject: [PATCH 09/22] FEAT: update user route --- docsfera.json | 36 +++++++--------------------- package-lock.json | 9 +++---- package.json | 4 ++-- src/modules/roles/roles.service.ts | 38 +++++++++++++++++------------- src/modules/users/dtos/entities.ts | 6 +++++ src/modules/users/users.service.ts | 15 +++++++----- 6 files changed, 53 insertions(+), 55 deletions(-) diff --git a/docsfera.json b/docsfera.json index f1b040e..672c167 100644 --- a/docsfera.json +++ b/docsfera.json @@ -7225,33 +7225,6 @@ ] } }, - "/platform/pipeline/pipeline_run": { - "post": { - "operationId": "PlatformApiController_createPipelineRun", - "summary": "Create a pipeline run", - "parameters": [], - "responses": { - "201": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - } - } - }, - "tags": [ - "Platform API" - ], - "security": [ - { - "access-token": [] - } - ] - } - }, "/platform/pipeline/{pipelineId}/pipeline_run": { "get": { "operationId": "PlatformApiController_getPipelineRuns", @@ -8523,6 +8496,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "companySite": { + "type": "string" + }, + "companyName": { + "type": "string" + }, "roleNames": { "type": "array", "items": { diff --git a/package-lock.json b/package-lock.json index 5248e39..002cc39 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.38.0-beta.16", + "@dadosfera/protospack-v2": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -2970,9 +2970,10 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.16", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.16.tgz", - "integrity": "sha512-ijURcmETXdgVgXhIPxapK7w0z6begXm4WDZ6EJtUGg+oYlJd9QOxbwaD7akRzW8XTdccmIo0Vov065KB812J0A==", + "version": "0.0.0", + "resolved": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", + "integrity": "sha512-ncpMpqOES0IqEnYMigS2lFIqCVSg3gsWENQzCeEaEkpnxidIHthBniJlUfr3ihPBSGg79OvGM5Cq7Yvyru66Ag==", + "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" diff --git a/package.json b/package.json index 4a5420d..6e51bcb 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,12 @@ "@aws-crypto/sha256-js": "^5.2.0", "@aws-sdk/client-dynamodb": "^3.414.0", "@aws-sdk/client-secrets-manager": "^3.414.0", - "@aws-sdk/lib-dynamodb": "^3.414.0", "@aws-sdk/credential-provider-node": "^3.940.0", + "@aws-sdk/lib-dynamodb": "^3.414.0", "@aws-sdk/signature-v4": "^3.370.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.38.0-beta.16", + "@dadosfera/protospack-v2": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/roles/roles.service.ts b/src/modules/roles/roles.service.ts index bd41ca5..d0045e5 100644 --- a/src/modules/roles/roles.service.ts +++ b/src/modules/roles/roles.service.ts @@ -229,27 +229,33 @@ export class RolesService { const [roleTreated] = this.getRolesPermissionsName([role.role]); return { role: roleTreated }; } + getRolesPermissionsName(roles: GetRolesPermissionsName[]): RoleDto[] { const newRoles: RoleDto[] = []; for (const role of roles) { - const allPermissions = this.permissionsService.getAllPermissions( - this.language, - ); - const newPermissions = role.permissions.map((p) => { - const permission = allPermissions.find((per) => per.seqid === p.seqid); - return { - ...p, - name: permission.name, - id: p.seqid, - }; - }); - const newRole: RoleDto = { - ...role, - permissions: newPermissions, - isPublic: role.isPublic, - }; + const newRole: RoleDto = this.formatRole(role); newRoles.push(newRole); } return newRoles; } + + private formatRole(role: GetRolesPermissionsName): RoleDto { + const allPermissions = this.permissionsService.getAllPermissions( + this.language + ); + const newPermissions = role.permissions.map((p) => { + const permission = allPermissions.find((per) => per.seqid === p.seqid); + return { + ...p, + name: permission.name, + id: p.seqid, + }; + }); + + return { + ...role, + permissions: newPermissions, + isPublic: role.isPublic, + };; + } } diff --git a/src/modules/users/dtos/entities.ts b/src/modules/users/dtos/entities.ts index 8e8b852..ac35213 100644 --- a/src/modules/users/dtos/entities.ts +++ b/src/modules/users/dtos/entities.ts @@ -109,6 +109,12 @@ export class UpdateUserReq { @ApiPropertyOptional() hierarchy?: string; @ApiPropertyOptional() + bio?: string; + @ApiPropertyOptional() + companySite?: string; + @ApiPropertyOptional() + companyName?: string; + @ApiPropertyOptional() roleNames?: string[]; } diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts index 3057010..065a768 100644 --- a/src/modules/users/users.service.ts +++ b/src/modules/users/users.service.ts @@ -148,20 +148,23 @@ export class UsersService implements OnModuleInit { } async updateUser(req: UpdateUserReq, id: string, customerId: string) { - const { department, hierarchy, jobTitle, name, roleNames, email } = req; + const { roleNames, ...updateUserDTO } = req; if (roleNames) { await this.setRoles({ roleNames, userId: id }, customerId); } const { user } = await lastValueFrom( this.usersClientService.UserUpdate({ - name, + department: updateUserDTO.department, + email: updateUserDTO.email, + hierarchy: updateUserDTO.hierarchy, + jobTitle: updateUserDTO.jobTitle, + name: updateUserDTO.name, + bio: updateUserDTO.bio, + companyName: updateUserDTO.companyName, + companySite: updateUserDTO.companySite, customerId, id, - department, - hierarchy, - jobTitle, - email, metabaseUserId: undefined, }), ); From 7f5d157739871680f2dec57a2c4fcd9eba3b34bf Mon Sep 17 00:00:00 2001 From: Marcos Rodrigues Date: Thu, 18 Dec 2025 09:52:11 -0300 Subject: [PATCH 10/22] FEAT: update protospack version --- package-lock.json | 76 ++++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 43 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 002cc39..7b0f852 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": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", + "@dadosfera/protospack-v2": "3.38.0-beta.17", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -377,6 +377,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.946.0.tgz", "integrity": "sha512-sMmJRa2Y+jQ+qMzx7V3SBKsTSQzLBvSuVbMNM/YGSZkr849a4a6Frl4U8HfFj4O+o71dvQ6h5PP6vlc/fW672g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -2412,6 +2413,7 @@ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -2970,9 +2972,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "0.0.0", - "resolved": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", - "integrity": "sha512-ncpMpqOES0IqEnYMigS2lFIqCVSg3gsWENQzCeEaEkpnxidIHthBniJlUfr3ihPBSGg79OvGM5Cq7Yvyru66Ag==", + "version": "3.38.0-beta.17", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.17.tgz", + "integrity": "sha512-3E6m0ZKy5QOfuuTig05RC7Kj+zrh1GqZlTp6aePECDTrIyLhp2GIrALqJuD3LEjT+LG6eA88X2b4iXfV17Qmkg==", "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", @@ -3822,6 +3824,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.4.3.tgz", "integrity": "sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==", "license": "MIT", + "peer": true, "dependencies": { "iterare": "1.2.1", "tslib": "2.5.3", @@ -3900,6 +3903,7 @@ "integrity": "sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", @@ -4037,6 +4041,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.4.3.tgz", "integrity": "sha512-FpdczWoRSC0zz2dNL9u2AQLXKXRVtq4HgHklAhbL59X0uy+mcxhlSThG7DHzDMkoSnuuHY8ojDVf7mDxk+GtCw==", "license": "MIT", + "peer": true, "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", @@ -4400,6 +4405,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -4559,6 +4565,7 @@ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", "license": "MIT", + "peer": true, "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -5384,6 +5391,7 @@ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -5464,6 +5472,7 @@ "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "jest-diff": "^27.0.0", "pretty-format": "^27.0.0" @@ -5527,7 +5536,8 @@ "version": "16.18.126", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/oauth": { "version": "0.9.6", @@ -5757,6 +5767,7 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -6103,6 +6114,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6199,6 +6211,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -6827,6 +6840,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -6933,6 +6947,7 @@ "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-5.7.6.tgz", "integrity": "sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==", "license": "MIT", + "peer": true, "dependencies": { "eventemitter3": "^5.0.1", "lodash.clonedeep": "^4.5.0", @@ -7156,13 +7171,15 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/class-validator": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/validator": "^13.11.8", "libphonenumber-js": "^1.10.53", @@ -7826,7 +7843,8 @@ "version": "0.0.1425554", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/dezalgo": { "version": "1.0.4", @@ -8103,7 +8121,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8291,6 +8308,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -8637,7 +8655,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -8684,7 +8701,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -8709,7 +8725,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -8719,7 +8734,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -8728,22 +8742,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -8772,8 +8783,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", @@ -9008,7 +9018,6 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -9027,7 +9036,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -9036,8 +9044,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", @@ -9831,6 +9838,7 @@ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "license": "MIT", + "peer": true, "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -10172,6 +10180,7 @@ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -11461,7 +11470,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -12234,6 +12242,7 @@ "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", "license": "MIT", + "peer": true, "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", @@ -12623,6 +12632,7 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -13125,7 +13135,8 @@ "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/relative-microtime": { "version": "2.0.0", @@ -13312,6 +13323,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -13373,6 +13385,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -13416,7 +13429,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -13441,7 +13453,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -13450,15 +13461,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -13467,8 +13476,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -13484,7 +13492,6 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -14462,6 +14469,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -14691,6 +14699,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -15018,7 +15027,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "license": "MIT", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", diff --git a/package.json b/package.json index 6e51bcb..6bd76c9 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": "file:../protospack-v2/dadosfera-protospack-v2-0.0.0.tgz", + "@dadosfera/protospack-v2": "3.38.0-beta.17", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", From 61109f8ae9d58f31a90f4b91e4e6e13f8ddffd33 Mon Sep 17 00:00:00 2001 From: Marcos Rodrigues Date: Thu, 18 Dec 2025 10:24:29 -0300 Subject: [PATCH 11/22] FIX: send new user info --- docsfera.json | 36 ++++++++++++++++++++++++++++++ package-lock.json | 8 +++---- package.json | 2 +- src/modules/users/dtos/entities.ts | 6 +++++ 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/docsfera.json b/docsfera.json index 672c167..d79ce2d 100644 --- a/docsfera.json +++ b/docsfera.json @@ -8166,6 +8166,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "companySite": { + "type": "string" + }, "mfaStatus": { "type": "string" }, @@ -8196,6 +8205,9 @@ "jobTitle", "department", "hierarchy", + "bio", + "companyName", + "companySite", "mfaStatus", "createdAt", "updatedAt", @@ -8329,6 +8341,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "companySite": { + "type": "string" + }, "customer": { "$ref": "#/components/schemas/Customer" }, @@ -8356,6 +8377,9 @@ "jobTitle", "department", "hierarchy", + "bio", + "companyName", + "companySite", "mfaStatus", "createdAt", "updatedAt", @@ -8545,6 +8569,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "companySite": { + "type": "string" + }, "mfaStatus": { "type": "string" }, @@ -8568,6 +8601,9 @@ "jobTitle", "department", "hierarchy", + "bio", + "companyName", + "companySite", "mfaStatus", "createdAt", "updatedAt", diff --git a/package-lock.json b/package-lock.json index 7b0f852..6f67e12 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.38.0-beta.17", + "@dadosfera/protospack-v2": "3.38.0-beta.18", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -2972,9 +2972,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.17", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.17.tgz", - "integrity": "sha512-3E6m0ZKy5QOfuuTig05RC7Kj+zrh1GqZlTp6aePECDTrIyLhp2GIrALqJuD3LEjT+LG6eA88X2b4iXfV17Qmkg==", + "version": "3.38.0-beta.18", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.18.tgz", + "integrity": "sha512-rD2UOKa0P17A6YXIpclXF7F9b86mhRNE7fImTrbFamOcHpGmXBBVU8U53mCfLzzOA+MdDZ4/1uDNurCyQCjsLQ==", "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", diff --git a/package.json b/package.json index 6bd76c9..0aaef32 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.38.0-beta.17", + "@dadosfera/protospack-v2": "3.38.0-beta.18", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/users/dtos/entities.ts b/src/modules/users/dtos/entities.ts index ac35213..0f0e5a3 100644 --- a/src/modules/users/dtos/entities.ts +++ b/src/modules/users/dtos/entities.ts @@ -38,6 +38,12 @@ export class User { department?: string; @ApiProperty() hierarchy?: string; + @ApiProperty() + bio?: string; + @ApiProperty() + companyName?: string; + @ApiProperty() + companySite?: string; @ApiPropertyOptional() customer?: Customer; @ApiProperty() From 8b93d4e97b5658be357116a3ebc0a84eaf3bc393 Mon Sep 17 00:00:00 2001 From: Marcos Rodrigues Date: Thu, 18 Dec 2025 12:32:53 -0300 Subject: [PATCH 12/22] FEAT: protected update route with admin seqid or if user request to equal a jwt user id claim --- docsfera.json | 3 --- src/modules/users/users.controller.ts | 5 ++++- src/modules/users/users.service.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docsfera.json b/docsfera.json index d79ce2d..68b2806 100644 --- a/docsfera.json +++ b/docsfera.json @@ -1321,9 +1321,6 @@ "Users" ], "security": [ - { - "access-token": [] - }, { "access-token": [] } diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index e565f18..b5cb32b 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -266,7 +266,6 @@ export class UsersController { } @Patch(':id') - @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) @ApiOkResponse({ type: UpdateUserRes }) async updateUser( @User() user: RequestUser, @@ -274,6 +273,10 @@ export class UsersController { @Param('id') id: string, @Language() language: LanguageEnum, ) { + + if (user.user_id !== id || !user.permissions.includes(PERMISSIONS_GROUPS.USERS.permissions.ADMIN.seqid)) { + throw new ErrorBuilder(ErrorCodes.AUTH.FORBIDDEN); + } this.logger.info('updateUser', { user }); this.userService.setLanguage(language); return await this.userService.updateUser(body, id, user.customer_id); diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts index 065a768..278188c 100644 --- a/src/modules/users/users.service.ts +++ b/src/modules/users/users.service.ts @@ -149,7 +149,7 @@ export class UsersService implements OnModuleInit { async updateUser(req: UpdateUserReq, id: string, customerId: string) { const { roleNames, ...updateUserDTO } = req; - if (roleNames) { + if (roleNames && roleNames.length > 0) { await this.setRoles({ roleNames, userId: id }, customerId); } From 653d4f53b58c0e363aab03fe9cd6f2e51551aa41 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Thu, 18 Dec 2025 16:16:00 -0300 Subject: [PATCH 13/22] FEAT: Add optional 'docs' field to IDataAsset, IUpdateDataRequest, and ICreateDataAsset --- src/modules/catalog/dtos/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/modules/catalog/dtos/index.ts b/src/modules/catalog/dtos/index.ts index d8e3c2d..f35e6e0 100644 --- a/src/modules/catalog/dtos/index.ts +++ b/src/modules/catalog/dtos/index.ts @@ -98,6 +98,8 @@ export class IDataAsset { embed?: EmbedObject; @ApiPropertyOptional({ enum: DataAssetShareType }) share_type?: DataAssetShareType; + @ApiPropertyOptional() + docs?: string; } export class IOneDataAsset { @@ -200,6 +202,8 @@ export class IUpdateDataRequest { embed: EmbedObject; @ApiPropertyOptional({ enum: DataAssetShareType }) share_type?: DataAssetShareType; + @ApiPropertyOptional() + docs?: string; } export class ICreateDataAsset implements CreateDataAssetRequest { @ApiProperty() @@ -214,6 +218,8 @@ export class ICreateDataAsset implements CreateDataAssetRequest { location: string; @ApiPropertyOptional() embed: EmbedObject; + @ApiPropertyOptional() + docs: string; } export class IPreview { From 039c652b28cfb5252b5033ab280bdf4e8e82c279 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Thu, 18 Dec 2025 17:11:18 -0300 Subject: [PATCH 14/22] DOC: Update @dadosfera/protospack-v2 to version 3.38.0-beta.19 in package.json and package-lock.json --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5248e39..0cc2e80 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.38.0-beta.16", + "@dadosfera/protospack-v2": "3.38.0-beta.19", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/package.json b/package.json index 4a5420d..5764dee 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.38.0-beta.16", + "@dadosfera/protospack-v2": "3.38.0-beta.19", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", From 0aaa4384c36dac89189c3f3a8d956d04ed2544c8 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Thu, 18 Dec 2025 17:43:54 -0300 Subject: [PATCH 15/22] DOCS: Add 'docs' field to schemas in docsfera.json and update protospack-v2 to version 3.38.0-beta.19 in package-lock.json --- docsfera.json | 9 +++++++++ package-lock.json | 6 +++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/docsfera.json b/docsfera.json index f1b040e..4e44ae2 100644 --- a/docsfera.json +++ b/docsfera.json @@ -9634,6 +9634,9 @@ "public", "private" ] + }, + "docs": { + "type": "string" } }, "required": [ @@ -9888,6 +9891,9 @@ "public", "private" ] + }, + "docs": { + "type": "string" } }, "required": [ @@ -9927,6 +9933,9 @@ }, "embed": { "$ref": "#/components/schemas/EmbedObject" + }, + "docs": { + "type": "string" } }, "required": [ diff --git a/package-lock.json b/package-lock.json index 0cc2e80..2e9169f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2970,9 +2970,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.16", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.16.tgz", - "integrity": "sha512-ijURcmETXdgVgXhIPxapK7w0z6begXm4WDZ6EJtUGg+oYlJd9QOxbwaD7akRzW8XTdccmIo0Vov065KB812J0A==", + "version": "3.38.0-beta.19", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.19.tgz", + "integrity": "sha512-qevGunl1IKv4POa2hhXNaDpqlh/bvnq5Hxo6534OHYPZ//S+XcRZgTrxFnylK3+uoROM8epF3Mey5GwynxY7Tw==", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" From 76485f929dbf8f4fe3e3a30e41e33dd0dd23317c Mon Sep 17 00:00:00 2001 From: Marcos Rodrigues Date: Fri, 26 Dec 2025 17:53:02 -0300 Subject: [PATCH 16/22] FIX: user patch route --- src/modules/users/users.controller.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index b5cb32b..71ba19c 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -274,9 +274,17 @@ export class UsersController { @Language() language: LanguageEnum, ) { - if (user.user_id !== id || !user.permissions.includes(PERMISSIONS_GROUPS.USERS.permissions.ADMIN.seqid)) { + const isSameUser = user.user_id === id; + const isSuperAdmin = user.permissions.includes(PERMISSIONS_GROUPS.USERS.permissions.ADMIN.seqid) + if (!isSameUser && !isSuperAdmin) { throw new ErrorBuilder(ErrorCodes.AUTH.FORBIDDEN); } + + if (isSameUser && !isSuperAdmin && body.roleNames) { + // Prevent users from updating their own roles + delete body.roleNames; + } + this.logger.info('updateUser', { user }); this.userService.setLanguage(language); return await this.userService.updateUser(body, id, user.customer_id); From 5dbc644d1d0f5dcc525b37bd69d0fa999903321a Mon Sep 17 00:00:00 2001 From: Rafael Date: Mon, 29 Dec 2025 11:42:04 -0300 Subject: [PATCH 17/22] fix: security vulnerability - upgrade multer to 2.0.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update multer override from 1.4.5-lts.1 to 2.0.2 to fix HIGH vulnerabilities: - CVE-2025-47935 (DoS via memory leaks) - CVE-2025-47944 - CVE-2025-48997 - CVE-2025-7338 Reduces HIGH vulnerabilities from 4 to 0 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- package-lock.json | 540 +++++++++++++++------------------------------- package.json | 2 +- 2 files changed, 180 insertions(+), 362 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3f4d787..612a6b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -283,15 +283,15 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.957.0.tgz", - "integrity": "sha512-H/uHYgZTmFUq2qb4b/GTxT2F8Yyqyb3pMpI3mldGINZkPYQYN9pP246pqnf+OYOClPMxSMRchrbjZgZhADMi8Q==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.958.0.tgz", + "integrity": "sha512-R3G5cxf3fsL0CEcTbY1VkSwU1FJtImrhA5I9Eepd8nEO6isZ6C99qVKZtDG9eG7qVNK6zTzUigXac/GFrn6hYA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", - "@aws-sdk/credential-provider-node": "3.957.0", + "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/dynamodb-codec": "3.957.0", "@aws-sdk/middleware-endpoint-discovery": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", @@ -349,15 +349,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.957.0.tgz", - "integrity": "sha512-6YjutprAfYSus+slJ0TTokzyF+eU41xRHYwDgsAlddrGQ82NVd1v9tIpEsXwiLCsebiYouqxR6qbRl6VCPEs9g==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.958.0.tgz", + "integrity": "sha512-bd1Eu4vgas9pLTfqFs0CrWwmrRSucDdVmsoD2bFHngx/Q9uqp/ypo0IsjgPYhZpdLYwJbgfjkn5cW9IjhPIVbw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", - "@aws-sdk/credential-provider-node": "3.957.0", + "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", @@ -412,9 +412,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.957.0.tgz", - "integrity": "sha512-iRdRjd+IpOogqRPt8iNRcg30J53z4rRfMviGwpKgsEa/fx3inCUPOuca3Ap7ZDES0atnEg3KGSJ3V/NQiEJ4BA==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.958.0.tgz", + "integrity": "sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -548,19 +548,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.957.0.tgz", - "integrity": "sha512-YuoZmIeE91YIeUfihh8SiSu546KtTvU+4rG5SaL30U9+nGq6P11GRRgqF0ANUyRseLC9ONHt+utar4gbO3++og==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.958.0.tgz", + "integrity": "sha512-u7twvZa1/6GWmPBZs6DbjlegCoNzNjBsMS/6fvh5quByYrcJr/uLd8YEr7S3UIq4kR/gSnHqcae7y2nL2bqZdg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", - "@aws-sdk/credential-provider-login": "3.957.0", + "@aws-sdk/credential-provider-login": "3.958.0", "@aws-sdk/credential-provider-process": "3.957.0", - "@aws-sdk/credential-provider-sso": "3.957.0", - "@aws-sdk/credential-provider-web-identity": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/credential-provider-sso": "3.958.0", + "@aws-sdk/credential-provider-web-identity": "3.958.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", @@ -573,13 +573,13 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.957.0.tgz", - "integrity": "sha512-XcD5NEQDWYk8B4gs89bkwf2d+DNF8oS2NR5RoHJEbX4l8KErVATUjpEYVn6/rAFEktungxlYTnQ5wh0cIQvP5w==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.958.0.tgz", + "integrity": "sha512-sDwtDnBSszUIbzbOORGh5gmXGl9aK25+BHb4gb1aVlqB+nNL2+IUEJA62+CE55lXSH8qXF90paivjK8tOHTwPA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", @@ -592,17 +592,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.957.0.tgz", - "integrity": "sha512-b9FT/7BQcJ001w+3JbTiJXfxHrWvPb7zDvvC1i1FKcNOvyCt3BGu04n4nO/b71a3iBnbfBXI89hCIZQsuLcEgw==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.958.0.tgz", + "integrity": "sha512-vdoZbNG2dt66I7EpN3fKCzi6fp9xjIiwEA/vVVgqO4wXCGw8rKPIdDUus4e13VvTr330uQs2W0UNg/7AgtquEQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", - "@aws-sdk/credential-provider-ini": "3.957.0", + "@aws-sdk/credential-provider-ini": "3.958.0", "@aws-sdk/credential-provider-process": "3.957.0", - "@aws-sdk/credential-provider-sso": "3.957.0", - "@aws-sdk/credential-provider-web-identity": "3.957.0", + "@aws-sdk/credential-provider-sso": "3.958.0", + "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", @@ -632,14 +632,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.957.0.tgz", - "integrity": "sha512-gTLPJFOkGtn3tVGglRhCar2oOobK1YctZRAT8nfJr17uaSRoAP46zIIHNYBZZUMqImb0qAHD9Ugm+Zd9sIqxyA==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.958.0.tgz", + "integrity": "sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.957.0", + "@aws-sdk/client-sso": "3.958.0", "@aws-sdk/core": "3.957.0", - "@aws-sdk/token-providers": "3.957.0", + "@aws-sdk/token-providers": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -651,13 +651,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.957.0.tgz", - "integrity": "sha512-x17xMeD7c+rKEsWachGIMifACqkugskrETWz18QDWismFcrmUuOcZu5rUa8s9y1pnITLKUQ1xU/qDLPH52jLlA==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.958.0.tgz", + "integrity": "sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -751,13 +751,13 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.957.0.tgz", - "integrity": "sha512-v/GnmDIFfqDQub4tEp/QtsWOMMvSilMbbhCv0l5rPV9sd1NUmCtrH8iBHqVKeEmwSsiCzEKNTakmxSUJszrEww==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.958.0.tgz", + "integrity": "sha512-ojqEe4ojhk/MINaaEzqFLcZ9abBGP+zwUxTJh9x2mM2Y7Y4Gvqmwvs5aT790pI8yiPKPDkeF/E+DNEmSCUPtlA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/util-dynamodb": "3.957.0", + "@aws-sdk/util-dynamodb": "3.958.0", "@smithy/core": "^3.20.0", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", @@ -767,7 +767,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.957.0" + "@aws-sdk/client-dynamodb": "^3.958.0" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { @@ -851,9 +851,9 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.957.0.tgz", - "integrity": "sha512-PZUFtaUTSZWO+mbgQGWSiwz3EqedsuKNb7Xoxjzh5rfJE352DD4/jScQEhVPxvdLw62IK9b5UDu5kZlxzBs9Ow==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.958.0.tgz", + "integrity": "sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -973,13 +973,13 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", - "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.958.0.tgz", + "integrity": "sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -1017,9 +1017,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.957.0.tgz", - "integrity": "sha512-EqFfOkNZt4oJdyxFoP+PxO4JoEnAnTNOiwLKr57F0Hi+Qp5WYPJHdMFtHrzw6j2+atXQIfQUvtk1q6eQbcvMTw==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.958.0.tgz", + "integrity": "sha512-wNGCmCBaj+Om4e93+zkiWv7L+sPGlJuDKHWpndCLdHp3EyHt46KxQpAC5QOMTzbRS0obxl2LqXilX8fbQZxU6A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1028,7 +1028,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.957.0" + "@aws-sdk/client-dynamodb": "^3.958.0" } }, "node_modules/@aws-sdk/util-endpoints": { @@ -1747,6 +1747,7 @@ "version": "3.38.0-beta.19", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.19.tgz", "integrity": "sha512-qevGunl1IKv4POa2hhXNaDpqlh/bvnq5Hxo6534OHYPZ//S+XcRZgTrxFnylK3+uoROM8epF3Mey5GwynxY7Tw==", + "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" @@ -2692,7 +2693,6 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.4.3.tgz", "integrity": "sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==", "license": "MIT", - "peer": true, "dependencies": { "iterare": "1.2.1", "tslib": "2.5.3", @@ -2762,7 +2762,6 @@ "integrity": "sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==", "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", @@ -2900,7 +2899,6 @@ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.4.3.tgz", "integrity": "sha512-FpdczWoRSC0zz2dNL9u2AQLXKXRVtq4HgHklAhbL59X0uy+mcxhlSThG7DHzDMkoSnuuHY8ojDVf7mDxk+GtCw==", "license": "MIT", - "peer": true, "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", @@ -3038,6 +3036,22 @@ "node": ">= 0.6" } }, + "node_modules/@nestjs/platform-express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3092,6 +3106,21 @@ "node": ">= 0.6" } }, + "node_modules/@nestjs/platform-express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@nestjs/platform-express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3326,7 +3355,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -3506,7 +3534,6 @@ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", "license": "MIT", - "peer": true, "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -4432,7 +4459,6 @@ "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -4513,7 +4539,6 @@ "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "jest-diff": "^27.0.0", "pretty-format": "^27.0.0" @@ -4577,8 +4602,7 @@ "version": "16.18.126", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/oauth": { "version": "0.9.6", @@ -4812,7 +4836,6 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -5160,7 +5183,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5270,7 +5292,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5785,9 +5806,9 @@ } }, "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5861,47 +5882,12 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bowser": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", @@ -5971,7 +5957,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -6079,7 +6064,6 @@ "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-5.7.6.tgz", "integrity": "sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==", "license": "MIT", - "peer": true, "dependencies": { "eventemitter3": "^5.0.1", "lodash.clonedeep": "^4.5.0", @@ -6297,15 +6281,13 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/class-validator": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", "license": "MIT", - "peer": true, "dependencies": { "@types/validator": "^13.15.3", "libphonenumber-js": "^1.11.1", @@ -6521,44 +6503,20 @@ "license": "MIT" }, "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "engines": [ - "node >= 0.8" + "node >= 6.0" ], "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", - "readable-stream": "^2.2.2", + "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -7248,6 +7206,7 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8" } @@ -7436,7 +7395,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7762,6 +7720,13 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -7792,6 +7757,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -7830,76 +7796,16 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/express/node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", + "peer": true, "engines": { "node": ">=6.6.0" } }, - "node_modules/express/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", - "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", - "license": "MIT", - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/express/node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -7910,37 +7816,6 @@ "node": ">= 0.8" } }, - "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "peer": true, - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/express/node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -8185,6 +8060,7 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", @@ -8288,18 +8164,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", @@ -8613,15 +8477,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -8825,28 +8680,23 @@ "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-headers": { @@ -9058,7 +8908,6 @@ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", "license": "MIT", - "peer": true, "dependencies": { "@ioredis/commands": "1.4.0", "cluster-key-slot": "^1.1.0", @@ -9279,12 +9128,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9402,7 +9245,6 @@ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -10797,6 +10639,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -10871,22 +10722,21 @@ } }, "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "deprecated": "Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version.", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "type-is": "^1.6.18", + "xtend": "^4.0.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.16.0" } }, "node_modules/mute-stream": { @@ -11462,7 +11312,6 @@ "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", "license": "MIT", - "peer": true, "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", @@ -11648,15 +11497,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-to-regexp": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", @@ -11837,7 +11677,6 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -11849,9 +11688,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -11889,12 +11728,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/process-warning": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", @@ -12174,12 +12007,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -12255,26 +12088,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -12361,8 +12174,7 @@ "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/relative-microtime": { "version": "2.0.0", @@ -12484,6 +12296,12 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -12566,7 +12384,6 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -12628,7 +12445,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -12672,6 +12488,7 @@ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", + "peer": true, "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", @@ -12693,31 +12510,12 @@ "url": "https://opencollective.com/express" } }, - "node_modules/send/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -12733,6 +12531,7 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", + "peer": true, "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", @@ -12887,10 +12686,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sisteransi": { "version": "1.0.5", @@ -13717,7 +13522,6 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -13968,7 +13772,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -14323,6 +14126,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "license": "MIT", + "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -14341,6 +14145,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "dev": true, "license": "MIT", "dependencies": { @@ -14446,6 +14251,12 @@ "node": ">=8.12.0" } }, + "node_modules/windows-release/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/winston": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", @@ -14571,6 +14382,13 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", diff --git a/package.json b/package.json index b01cb74..2a2c4b8 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "swagger-ui-express": "^4.6.3" }, "overrides": { - "multer": "1.4.5-lts.1", + "multer": "2.0.2", "form-data": "^4.0.4", "body-parser": "^1.20.3", "cross-spawn": "^7.0.5", From 55b0961b82bb18a04465d7d81774f4572fede40d Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Fri, 2 Jan 2026 09:21:46 -0300 Subject: [PATCH 18/22] FEAT: add organization info endpoints and DTOs for update and retrieval new organization forms --- package.json | 2 +- src/modules/customers/customers.controller.ts | 28 ++++++++++ src/modules/customers/customers.service.ts | 55 ++++++++++++++++++- src/modules/customers/dtos/organization.ts | 27 +++++++++ 4 files changed, 110 insertions(+), 2 deletions(-) create mode 100644 src/modules/customers/dtos/organization.ts diff --git a/package.json b/package.json index 2a2c4b8..575634b 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.38.0-beta.19", + "@dadosfera/protospack-v2": "^3.38.0-beta.23", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/customers/customers.controller.ts b/src/modules/customers/customers.controller.ts index 2606ebd..b3f6c37 100644 --- a/src/modules/customers/customers.controller.ts +++ b/src/modules/customers/customers.controller.ts @@ -136,4 +136,32 @@ export class CustomersController { const result = await this.customersService.getAccessDashboardUrl(user.customer_name, metadata); return result; } + + @Get(':id/organization-info') + @Authenticated() + @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) + @ApiOkResponse({ description: 'Organization information' }) + async getOrganizationInfo(@Param('id') id: string) { + this.logger.info('getOrganizationInfo', { id }); + return this.customersService.getOrganizationInfo(id); + } + + @Put(':id/organization-info') + @Authenticated() + @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) + @HttpCode(HttpStatus.OK) + @ApiOkResponse({ description: 'Organization information updated' }) + async updateOrganizationInfo( + @Param('id') id: string, + @Body() body: { + name: string; + companySite: string; + domain: string; + cnpj: string; + description: string; + }, + ) { + return this.customersService.updateOrganizationInfo(id, body); + } + } diff --git a/src/modules/customers/customers.service.ts b/src/modules/customers/customers.service.ts index 8b28171..92b18ea 100644 --- a/src/modules/customers/customers.service.ts +++ b/src/modules/customers/customers.service.ts @@ -223,4 +223,57 @@ export class CustomersService implements OnModuleInit { }) ) } -} + + async updateOrganizationInfo( + customerId: string, + data: { + name: string; + companySite: string; + domain: string; + cnpj: string; + description: string; + }, + ) { + try { + const result = await lastValueFrom( + this.customerService.OrganizationUpdate({ + customerId, + name: data.name || '', + companySite: data.companySite || '', + domain: data.domain || '', + cnpj: data.cnpj || '', + description: data.description || '', + }), + ); + + return result; + } catch (err) { + if (err.details === ErrorCodes.CUSTOMER.NOT_FOUND) + throw new HttpException(err.details, HttpStatus.NOT_FOUND); + else throw err; + } + } + + async getOrganizationInfo(customerId: string) { + try { + const customerResponse = await lastValueFrom( + this.customerService.CustomerFindOneById({ id: customerId }) + ); + + const customer = customerResponse.customer; + + return { + name: customer.name || '', + companySite: customer.companySite || '', + domain: customer.domain || '', + cnpj: customer.cnpj || '', + description: customer.description || '' + }; + } catch (err) { + if (err.details === ErrorCodes.CUSTOMER.NOT_FOUND) + throw new HttpException(err.details, HttpStatus.NOT_FOUND); + else throw err; + } + } + +} \ No newline at end of file diff --git a/src/modules/customers/dtos/organization.ts b/src/modules/customers/dtos/organization.ts new file mode 100644 index 0000000..50c3df7 --- /dev/null +++ b/src/modules/customers/dtos/organization.ts @@ -0,0 +1,27 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class OrganizationUpdateRequest { + @ApiProperty() + name: string; + @ApiPropertyOptional() + companySite: string; + @ApiProperty() + domain: string; + @ApiPropertyOptional() + info: string; + @ApiPropertyOptional() + cnpj: string; +} + +export class OrganizationResponse { + @ApiProperty() + name: string; + @ApiPropertyOptional() + companySite: string; + @ApiProperty() + domain: string; + @ApiPropertyOptional() + info: string; + @ApiPropertyOptional() + cnpj: string; +} \ No newline at end of file From da23ad76db6514b7044155e2fc7be2660aca2ab5 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Fri, 2 Jan 2026 09:22:27 -0300 Subject: [PATCH 19/22] DOCS: update docs to organization forms --- docsfera.json | 60 +++++++++++++++++++++++++++++++++++++++++++++++ package-lock.json | 9 ++++--- 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/docsfera.json b/docsfera.json index 29c24b7..157ccbb 100644 --- a/docsfera.json +++ b/docsfera.json @@ -5461,6 +5461,66 @@ ] } }, + "/customers/{id}/organization-info": { + "get": { + "operationId": "CustomersController_getOrganizationInfo", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Organization information" + } + }, + "tags": [ + "Customers" + ], + "security": [ + { + "access-token": [] + }, + { + "access-token": [] + } + ] + }, + "put": { + "operationId": "CustomersController_updateOrganizationInfo", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Organization information updated" + } + }, + "tags": [ + "Customers" + ], + "security": [ + { + "access-token": [] + }, + { + "access-token": [] + } + ] + } + }, "/catalog/data-asset/share/{id}": { "get": { "operationId": "ShareController_getShareDataAsset", diff --git a/package-lock.json b/package-lock.json index 612a6b1..97c8c79 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.38.0-beta.19", + "@dadosfera/protospack-v2": "^3.38.0-beta.23", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1744,10 +1744,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.19", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.19.tgz", - "integrity": "sha512-qevGunl1IKv4POa2hhXNaDpqlh/bvnq5Hxo6534OHYPZ//S+XcRZgTrxFnylK3+uoROM8epF3Mey5GwynxY7Tw==", - "license": "ISC", + "version": "3.38.0-beta.23", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.23.tgz", + "integrity": "sha512-Juse1l1lleROO0uUrR5cGruGjkS/6NQau9v6eakvryv7FcLWJwgKV5qXMRkaTAMVTumAbxSqoKX8kGH5yZPKbw==", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" From e2a7d2b92b51ac5e7d9228214957fabcf291a300 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Mon, 5 Jan 2026 11:47:20 -0300 Subject: [PATCH 20/22] FIX: update organization info field from 'name' to 'companyName' --- package-lock.json | 8 ++++---- package.json | 2 +- src/modules/customers/customers.service.ts | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 97c8c79..b2ab985 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.38.0-beta.23", + "@dadosfera/protospack-v2": "^3.38.0-beta.24", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1744,9 +1744,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.23", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.23.tgz", - "integrity": "sha512-Juse1l1lleROO0uUrR5cGruGjkS/6NQau9v6eakvryv7FcLWJwgKV5qXMRkaTAMVTumAbxSqoKX8kGH5yZPKbw==", + "version": "3.38.0-beta.24", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.24.tgz", + "integrity": "sha512-RUDPY1WAy/eu+tN1sGMdYCBKt+UQ61dAjaiG+VyL/5WWP/vxcCW3QpFimSbFN04B8ZZW19a2V7UM61om8f4ywQ==", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" diff --git a/package.json b/package.json index 575634b..010b6f8 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.38.0-beta.23", + "@dadosfera/protospack-v2": "^3.38.0-beta.24", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/customers/customers.service.ts b/src/modules/customers/customers.service.ts index 92b18ea..602943b 100644 --- a/src/modules/customers/customers.service.ts +++ b/src/modules/customers/customers.service.ts @@ -227,7 +227,7 @@ export class CustomersService implements OnModuleInit { async updateOrganizationInfo( customerId: string, data: { - name: string; + companyName: string; companySite: string; domain: string; cnpj: string; @@ -238,7 +238,7 @@ export class CustomersService implements OnModuleInit { const result = await lastValueFrom( this.customerService.OrganizationUpdate({ customerId, - name: data.name || '', + companyName: data.companyName || '', companySite: data.companySite || '', domain: data.domain || '', cnpj: data.cnpj || '', @@ -263,7 +263,7 @@ export class CustomersService implements OnModuleInit { const customer = customerResponse.customer; return { - name: customer.name || '', + companyName: customer.companyName || '', companySite: customer.companySite || '', domain: customer.domain || '', cnpj: customer.cnpj || '', From 285de97375713b5e81ec0b26e7263f5d5cb69533 Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Mon, 5 Jan 2026 12:01:04 -0300 Subject: [PATCH 21/22] FIX: update organization info field from 'name' to 'companyName' in updateOrganizationInfo method --- src/modules/customers/customers.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/customers/customers.controller.ts b/src/modules/customers/customers.controller.ts index b3f6c37..8ac5b3b 100644 --- a/src/modules/customers/customers.controller.ts +++ b/src/modules/customers/customers.controller.ts @@ -154,7 +154,7 @@ export class CustomersController { async updateOrganizationInfo( @Param('id') id: string, @Body() body: { - name: string; + companyName: string; companySite: string; domain: string; cnpj: string; From 8ac0a8a79f7d7209dbcda4f341a454415755a66f Mon Sep 17 00:00:00 2001 From: viniciusgadea Date: Mon, 5 Jan 2026 15:43:35 -0300 Subject: [PATCH 22/22] REFACTOR: rename 'companySite' to 'personalSite' in user DTOs and related services --- docsfera.json | 14 +++++++------- package-lock.json | 8 ++++---- package.json | 2 +- src/modules/users/dtos/entities.ts | 4 ++-- src/modules/users/users.service.ts | 2 +- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/docsfera.json b/docsfera.json index 157ccbb..572609f 100644 --- a/docsfera.json +++ b/docsfera.json @@ -8229,7 +8229,7 @@ "companyName": { "type": "string" }, - "companySite": { + "personalSite": { "type": "string" }, "mfaStatus": { @@ -8264,7 +8264,7 @@ "hierarchy", "bio", "companyName", - "companySite", + "personalSite", "mfaStatus", "createdAt", "updatedAt", @@ -8404,7 +8404,7 @@ "companyName": { "type": "string" }, - "companySite": { + "personalSite": { "type": "string" }, "customer": { @@ -8436,7 +8436,7 @@ "hierarchy", "bio", "companyName", - "companySite", + "personalSite", "mfaStatus", "createdAt", "updatedAt", @@ -8580,7 +8580,7 @@ "bio": { "type": "string" }, - "companySite": { + "personalSite": { "type": "string" }, "companyName": { @@ -8632,7 +8632,7 @@ "companyName": { "type": "string" }, - "companySite": { + "personalSite": { "type": "string" }, "mfaStatus": { @@ -8660,7 +8660,7 @@ "hierarchy", "bio", "companyName", - "companySite", + "personalSite", "mfaStatus", "createdAt", "updatedAt", diff --git a/package-lock.json b/package-lock.json index b2ab985..e0de21d 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.38.0-beta.24", + "@dadosfera/protospack-v2": "^3.38.0-beta.25", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -1744,9 +1744,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.24", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.24.tgz", - "integrity": "sha512-RUDPY1WAy/eu+tN1sGMdYCBKt+UQ61dAjaiG+VyL/5WWP/vxcCW3QpFimSbFN04B8ZZW19a2V7UM61om8f4ywQ==", + "version": "3.38.0-beta.25", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.25.tgz", + "integrity": "sha512-OsOl9hJezmtWlVy+2vl3qbWP5yHmLktJ01r5aL475lcfKJtzFPZieUT9ES87C1Emrqe21E6IM/BkJK2rm/aUiA==", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" diff --git a/package.json b/package.json index 010b6f8..fa47b52 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.38.0-beta.24", + "@dadosfera/protospack-v2": "^3.38.0-beta.25", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", diff --git a/src/modules/users/dtos/entities.ts b/src/modules/users/dtos/entities.ts index 0f0e5a3..ab5e43c 100644 --- a/src/modules/users/dtos/entities.ts +++ b/src/modules/users/dtos/entities.ts @@ -43,7 +43,7 @@ export class User { @ApiProperty() companyName?: string; @ApiProperty() - companySite?: string; + personalSite?: string; @ApiPropertyOptional() customer?: Customer; @ApiProperty() @@ -117,7 +117,7 @@ export class UpdateUserReq { @ApiPropertyOptional() bio?: string; @ApiPropertyOptional() - companySite?: string; + personalSite?: string; @ApiPropertyOptional() companyName?: string; @ApiPropertyOptional() diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts index 278188c..d402ff1 100644 --- a/src/modules/users/users.service.ts +++ b/src/modules/users/users.service.ts @@ -162,7 +162,7 @@ export class UsersService implements OnModuleInit { name: updateUserDTO.name, bio: updateUserDTO.bio, companyName: updateUserDTO.companyName, - companySite: updateUserDTO.companySite, + personalSite: updateUserDTO.personalSite, customerId, id, metabaseUserId: undefined,