diff --git a/docsfera.json b/docsfera.json index c209f44..ae1444f 100644 --- a/docsfera.json +++ b/docsfera.json @@ -2334,6 +2334,20 @@ ] } }, + "/pipelinesV2/{id}/objects": { + "get": { + "operationId": "PipelinesController_getPipelineObjects", + "parameters": [], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "PipelinesV2" + ] + } + }, "/pipelinesV2/{id}": { "get": { "operationId": "PipelinesController_findOne", @@ -2722,6 +2736,20 @@ ] } }, + "/catalog/data-asset": { + "get": { + "operationId": "CatalogController_findByPipelineAndObject", + "parameters": [], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Catalog" + ] + } + }, "/catalog/tags": { "get": { "operationId": "CatalogController_findAllTags", @@ -3297,7 +3325,7 @@ } }, "info": { - "title": "Maestro - feat/update-connection", + "title": "Maestro - feature/pipeline-object-to-data-asset", "description": "Documentation for Maestro gateway", "version": "1.0.0", "contact": {} diff --git a/package-lock.json b/package-lock.json index 2ddafe8..8ac298f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "dependencies": { "@aws-sdk/client-secrets-manager": "^3.112.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "3.24.0", + "@dadosfera/protospack-v2": "^3.26.0", "@grpc/grpc-js": "^1.6.7", "@grpc/proto-loader": "^0.6.13", "@nestjs/common": "^8.4.7", @@ -1727,9 +1727,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.24.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.24.0.tgz", - "integrity": "sha512-CZmRK2shS8y7t6F2e1PSe8T+GgQJVXQPNYmcBqeWfb/ZmfL9zS2dDCACqbJpzBg2nmEneznYtpTw4nfH8n3utw==", + "version": "3.26.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.26.0.tgz", + "integrity": "sha512-/qq16JFg1lDYRTKpc//7yJ794gs6Zw/pJKpu1EZPYZCEPgGU0G3hLRpfeXueP1t1c8PFad9yawlaWQZ1b3MZzg==", "dependencies": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", @@ -12324,9 +12324,9 @@ } }, "@dadosfera/protospack-v2": { - "version": "3.24.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.24.0.tgz", - "integrity": "sha512-CZmRK2shS8y7t6F2e1PSe8T+GgQJVXQPNYmcBqeWfb/ZmfL9zS2dDCACqbJpzBg2nmEneznYtpTw4nfH8n3utw==", + "version": "3.26.0", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.26.0.tgz", + "integrity": "sha512-/qq16JFg1lDYRTKpc//7yJ794gs6Zw/pJKpu1EZPYZCEPgGU0G3hLRpfeXueP1t1c8PFad9yawlaWQZ1b3MZzg==", "requires": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", diff --git a/package.json b/package.json index 2267d06..a70d923 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "dependencies": { "@aws-sdk/client-secrets-manager": "^3.112.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", - "@dadosfera/protospack-v2": "3.24.0", + "@dadosfera/protospack-v2": "^3.26.0", "@grpc/grpc-js": "^1.6.7", "@grpc/proto-loader": "^0.6.13", "@nestjs/common": "^8.4.7", diff --git a/src/modules/catalog/catalog.controller.ts b/src/modules/catalog/catalog.controller.ts index e6703b6..dcbe404 100644 --- a/src/modules/catalog/catalog.controller.ts +++ b/src/modules/catalog/catalog.controller.ts @@ -88,6 +88,60 @@ export class CatalogController { return res; } + @Get('data-asset') + async findByPipelineAndObject(@User() user: RequestUser, @Query() query) { + const { username, user_id, customer_id, customer_name, permissions } = user; + const { pipeline, object } = query; + this.logger.info(`/catalog - ON GET DATA ASSET BY PIPELINE AND OBJECT`, { + username, + customer_name, + }); + + if (!pipeline || !object) { + throw new HttpException('Query params not provided', 400); + } + + const is_data_manager = permissions.includes( + PERMISSIONS_GROUPS.CATALOG.permissions.DATA_MANAGER.seqid, + ); + let has_permission = false; + const metadata = PackTheMetadata({ + username, + user_id: undefined, + customer_id, + customer_name, + }); + + const user_roles = await this.catalogService.getUserRolesIds(user_id); + + const { data_asset } = + await this.catalogService.getOneDataAssetByPipelineAndObject({ + pipeline: query.pipeline, + object: query.object, + customer_id, + metadata, + }); + + if (data_asset?.owner === username) has_permission = true; + + for (const role of user_roles) { + if (data_asset.p_roles.includes(role)) has_permission = true; + } + + if (data_asset.p_users.includes(user_id)) has_permission = true; + + if (is_data_manager || has_permission) { + delete data_asset.p_roles; + delete data_asset.p_users; + return { data_asset }; + } + + throw new HttpException( + 'You do not have permission to access this data asset.', + 403, + ); + } + @Get('tags') @RequireSomePermission( PERMISSIONS_GROUPS.CATALOG.permissions.GET, diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 2b0f21f..cd0adf3 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -197,6 +197,30 @@ class CatalogService implements OnModuleInit { return { data_asset: asset[0] }; } + async getOneDataAssetByPipelineAndObject(data: { + customer_id: string; + pipeline: string; + object: string; + metadata: Metadata; + }) { + const { customer_id, metadata, pipeline, object } = data; + const { data_asset } = await lastValueFrom( + this.catalogReadService.GetOneDataAssetByPipelineAndObject( + { pipeline, object }, + metadata, + ), + ); + let asset = JSON.parse(data_asset); + asset = { + ...asset, + p_roles: asset.roles, + p_users: asset.users, + }; + asset = await this.getAssetsUsersAndRoles([asset], customer_id); + + return { data_asset: asset[0] }; + } + async updateOneDataAsset(data: { data_asset_id: string; customer_id: string; diff --git a/src/modules/pipelinesV2/pipelines.controller.ts b/src/modules/pipelinesV2/pipelines.controller.ts index 6f71afc..ba4d5f7 100644 --- a/src/modules/pipelinesV2/pipelines.controller.ts +++ b/src/modules/pipelinesV2/pipelines.controller.ts @@ -147,6 +147,20 @@ export class PipelinesController { return this.pipelinesClientService.findOneProperties(id, metadata); } + @Get(':id/objects') + async getPipelineObjects( + @Headers('Dadosfera-Lang') language, + @User() user: RequestUser, + @Param('id') id, + ) { + this.logger.info('PipelinesController - getPipelineObjects', { user }); + const metadata = PackTheMetadata({ + ...user, + language: language || 'pt-br', + }); + return this.pipelinesClientService.findOneObjects(id, metadata); + } + @Get('/:id') async findOne( @Headers('Dadosfera-Lang') language, diff --git a/src/modules/pipelinesV2/pipelines.service.ts b/src/modules/pipelinesV2/pipelines.service.ts index 042a06b..8368668 100644 --- a/src/modules/pipelinesV2/pipelines.service.ts +++ b/src/modules/pipelinesV2/pipelines.service.ts @@ -250,6 +250,17 @@ export class PipelinesService implements OnModuleInit { }; } + async findOneObjects(id: string, metadata: Metadata) { + this.logger.info('PipelinesClientService - FindOneObjects'); + + const { objects } = await lastValueFrom( + this.pipelineReadService.PipelineV2FindObjects({ id }, metadata), + ); + this.logger.info('Done'); + + return { objects: JSON.parse(objects) }; + } + async uploadFile(uploadFile, metadata) { const body: Messages.PipelineV2UploadFileRequest = { file: { diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts index 8cadc9e..f181de1 100644 --- a/src/modules/users/users.service.ts +++ b/src/modules/users/users.service.ts @@ -122,6 +122,7 @@ export class UsersService implements OnModuleInit { if (roleNames) { await this.setRoles({ roleNames, userId: id }, customerId); } + const { user } = await lastValueFrom( this.usersClientService.UserUpdate({ name, @@ -131,6 +132,7 @@ export class UsersService implements OnModuleInit { hierarchy, jobTitle, email, + metabaseUserId: undefined, }), ); return { user: this.adjustUsersPayload([user])[0] };