From b38e9f26c3359e01ff7d7fc3b6ff45ed331bbbeb Mon Sep 17 00:00:00 2001 From: Anderson Feitosa Date: Thu, 22 Dec 2022 17:00:56 -0300 Subject: [PATCH] FEAT: add route to get data asset by pipeline and object --- docsfera.json | 14 ++++++ package-lock.json | 14 +++--- package.json | 2 +- src/modules/catalog/catalog.controller.ts | 54 +++++++++++++++++++++++ src/modules/catalog/catalog.service.ts | 24 ++++++++++ src/modules/users/users.service.ts | 2 + 6 files changed, 102 insertions(+), 8 deletions(-) diff --git a/docsfera.json b/docsfera.json index b4a6111..ae1444f 100644 --- a/docsfera.json +++ b/docsfera.json @@ -2736,6 +2736,20 @@ ] } }, + "/catalog/data-asset": { + "get": { + "operationId": "CatalogController_findByPipelineAndObject", + "parameters": [], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Catalog" + ] + } + }, "/catalog/tags": { "get": { "operationId": "CatalogController_findAllTags", diff --git a/package-lock.json b/package-lock.json index d964f22..a0d4390 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.26.0-beta.1", + "@dadosfera/protospack-v2": "^3.26.0-beta.5", "@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.26.0-beta.1", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.26.0-beta.1.tgz", - "integrity": "sha512-7DQdvTq8Z7N1xH4ZDdLBzFu8y9qMZHjkJjMEzXOj1wL1YbfHvtLrXu+FUdwQ2d/tNNeQRrswMewGoB/XM1Y9qQ==", + "version": "3.26.0-beta.5", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.26.0-beta.5.tgz", + "integrity": "sha512-sOLJ04RZIT4xOu7Djd1xty5mo6OXTTyKIfT1OIZuP74nqnNGdqOjsK4Z1h5LBASrCY4GMRQQfNMFIz+OnUA1Hg==", "dependencies": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", @@ -12324,9 +12324,9 @@ } }, "@dadosfera/protospack-v2": { - "version": "3.26.0-beta.1", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.26.0-beta.1.tgz", - "integrity": "sha512-7DQdvTq8Z7N1xH4ZDdLBzFu8y9qMZHjkJjMEzXOj1wL1YbfHvtLrXu+FUdwQ2d/tNNeQRrswMewGoB/XM1Y9qQ==", + "version": "3.26.0-beta.5", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.26.0-beta.5.tgz", + "integrity": "sha512-sOLJ04RZIT4xOu7Djd1xty5mo6OXTTyKIfT1OIZuP74nqnNGdqOjsK4Z1h5LBASrCY4GMRQQfNMFIz+OnUA1Hg==", "requires": { "@grpc/grpc-js": "^1.6.7", "rxjs": "^7.5.5", diff --git a/package.json b/package.json index 9cd07b6..4bd5697 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.26.0-beta.1", + "@dadosfera/protospack-v2": "^3.26.0-beta.5", "@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/users/users.service.ts b/src/modules/users/users.service.ts index 8cadc9e..e61604d 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 metabaseUserId = '1'; const { user } = await lastValueFrom( this.usersClientService.UserUpdate({ name, @@ -131,6 +132,7 @@ export class UsersService implements OnModuleInit { hierarchy, jobTitle, email, + metabaseUserId, }), ); return { user: this.adjustUsersPayload([user])[0] };