diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index 839a52b..aece0b5 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -615,7 +615,7 @@ export const DADOSFERA_MODULES_KEYS = { ACCESS_DASHBOARD: 'access-dashboard', DANGER_ZONE: 'danger-zone', PII: 'pii', - PUBLIC_ASSIGN_EMBED: 'public-assign-embed', + EMBED: 'embedded-analytics', } export const DADOSFERA_MODULES: Array = [ diff --git a/src/modules/assign/assign.controller.ts b/src/modules/assign/assign.controller.ts index 361524c..f2a5777 100644 --- a/src/modules/assign/assign.controller.ts +++ b/src/modules/assign/assign.controller.ts @@ -15,7 +15,7 @@ export class AssignController { @RequireSomePermission( PERMISSIONS_GROUPS.USERS.permissions.ADMIN ) - @RequireModule(DADOSFERA_MODULES_KEYS.PUBLIC_ASSIGN_EMBED) + @RequireModule(DADOSFERA_MODULES_KEYS.EMBED) create(@Body() createAssignDto: CreateAssignDto, @User() user: RequestUser) { const metadata = PackTheMetadata(user); return this.assignService.create(createAssignDto, metadata); @@ -25,7 +25,7 @@ export class AssignController { @RequireSomePermission( PERMISSIONS_GROUPS.USERS.permissions.ADMIN ) - @RequireModule(DADOSFERA_MODULES_KEYS.PUBLIC_ASSIGN_EMBED) + @RequireModule(DADOSFERA_MODULES_KEYS.EMBED) async get(@User() user: RequestUser) { const metadata = PackTheMetadata(user); return await this.assignService.get(metadata); diff --git a/src/modules/assign/assign.service.ts b/src/modules/assign/assign.service.ts index 01a8c20..3205e9b 100644 --- a/src/modules/assign/assign.service.ts +++ b/src/modules/assign/assign.service.ts @@ -33,6 +33,6 @@ export class AssignService implements OnModuleInit { } async get(metadata: Metadata) { - return await lastValueFrom(this.ducService.GetAssignPublicKey(metadata)) + return await lastValueFrom(this.ducService.GetAssignPublicKey({}, metadata)) } } diff --git a/src/modules/catalog/share/share.controller.ts b/src/modules/catalog/share/share.controller.ts index efc394e..4d74737 100644 --- a/src/modules/catalog/share/share.controller.ts +++ b/src/modules/catalog/share/share.controller.ts @@ -41,23 +41,22 @@ export class ShareController { @Get('/:id') async getShareDataAsset( @Param('id') id: string, - @User() user: RequestUser, @Req() request: Request ) { this.logger.info(`GET //:id`); - return await this.catalogShareService.getOneDataAssetPublic(id, user, request); + return await this.catalogShareService.getOneDataAssetPublic(id, request); } @Get('/:id/columns-metadata') async getShareDataAssetColumnsMetadata( @Language() language: LanguageEnum, @Param('id') id: string, - @User() user: RequestUser + @Req() request: Request ): Promise { this.logger.info(`GET /:id/columns-metadata`); const columns_metadata = - await this.catalogShareService.getDatasetColumnsMetadata(id, user); + await this.catalogShareService.getDatasetColumnsMetadata(id, request); return { columns_metadata }; @@ -67,10 +66,10 @@ export class ShareController { async getShareDataAssetPreview( @Language() language: LanguageEnum, @Param('id') id: string, - @User() user: RequestUser + @Req() request: Request ): Promise { this.logger.info(`GET /:id/preview`); - const preview = await this.catalogShareService.getDatasetPreview(id, user); + const preview = await this.catalogShareService.getDatasetPreview(id, request); return { preview }; } @@ -79,10 +78,10 @@ export class ShareController { async getShareDataAssetDocs( @Language() language: LanguageEnum, @Param('id') id: string, - @User() user: RequestUser + @Req() request: Request ): Promise { this.logger.info(`GET /:id/docs`); - const docs = await this.catalogShareService.getDataDocs(id, user); + const docs = await this.catalogShareService.getDataDocs(id, request); return { docs }; } diff --git a/src/modules/catalog/share/share.module.ts b/src/modules/catalog/share/share.module.ts index ce7021c..6f88e42 100644 --- a/src/modules/catalog/share/share.module.ts +++ b/src/modules/catalog/share/share.module.ts @@ -9,6 +9,7 @@ import { ShareController } from "./share.controller"; import DadosferaLogger from "@dadosfera/dadosfera-logs"; import { ShareService } from "./share.service"; import { MixpanelModule } from "src/modules/mixpanel/mixpanel.module"; +import { AuthModule } from "src/modules/auth/auth.module"; const client = new CatalogClientConfiguration(); @@ -19,7 +20,8 @@ const client = new CatalogClientConfiguration(); RolesModule, CustomersModule, ShareMetadataModule, - MixpanelModule + MixpanelModule, + AuthModule ], controllers: [ShareController], providers: [ShareService, DadosferaLogger], diff --git a/src/modules/catalog/share/share.service.ts b/src/modules/catalog/share/share.service.ts index da8d3fe..3e088a6 100644 --- a/src/modules/catalog/share/share.service.ts +++ b/src/modules/catalog/share/share.service.ts @@ -22,6 +22,9 @@ import { ShareMetadataService } from 'src/modules/share-metadata/share-metadata. import { isJWT } from 'class-validator'; import { MixpanelService } from 'src/modules/mixpanel/mixpanel.service'; import { Request } from 'express'; +import jwt from 'jsonwebtoken'; +import { AuthClientService } from 'src/modules/auth/auth.service'; + export class ShareService implements OnModuleInit { catalogReadService: ReadService.CatalogReadServices; @@ -36,6 +39,7 @@ export class ShareService implements OnModuleInit { private readonly roleService: RolesService, private readonly shareMetadataService: ShareMetadataService, private readonly mixpanelService: MixpanelService, + private authClient: AuthClientService, ) { this.logger = dadosferaLogger.logger; } @@ -47,8 +51,8 @@ export class ShareService implements OnModuleInit { ); } - async getDatasetColumnsMetadata(id: string, user: RequestUser) { - const shareMetadata = await this.getShareMetadata(id, user); + async getDatasetColumnsMetadata(id: string, request: Request) { + const shareMetadata = await this.getShareMetadata(id, request); const metadata = PackTheMetadata({ customer_id: shareMetadata.customerId, customer_name: shareMetadata.customerName, @@ -63,8 +67,8 @@ export class ShareService implements OnModuleInit { return result; } - async getDatasetPreview(id: string, user: RequestUser) { - const shareMetadata = await this.getShareMetadata(id, user); + async getDatasetPreview(id: string, request: Request) { + const shareMetadata = await this.getShareMetadata(id, request); const metadata = PackTheMetadata({ customer_id: shareMetadata.customerId, customer_name: shareMetadata.customerName, @@ -79,14 +83,14 @@ export class ShareService implements OnModuleInit { return result; } - async getOneDataAssetPublic(id: string, user: RequestUser, request: Request) { + async getOneDataAssetPublic(id: string, request: Request) { this.logger.info("getOneDataAssetPublic: " + JSON.stringify({ - id, - userId: user?.user_id, - customerId: user?.customer_id + id })) try { - const shareMetadata = await this.getShareMetadata(id, user); + const user = await this.getUserFromRequest(request); + + const shareMetadata = await this.getShareMetadata(id, request); const mixpanelTracker = { asset: shareMetadata.assetId, @@ -148,8 +152,8 @@ export class ShareService implements OnModuleInit { return { data_asset: asset[0] }; } - async getDataDocs(id: string, user: RequestUser) { - const shareMetadata = await this.getShareMetadata(id, user); + async getDataDocs(id: string, request: Request) { + const shareMetadata = await this.getShareMetadata(id, request); const metadata = PackTheMetadata({ customer_id: shareMetadata.customerId, customer_name: shareMetadata.customerName, @@ -197,21 +201,8 @@ export class ShareService implements OnModuleInit { }); } - // private async validateShareAssign(token: string) { - // const tokenDecoded = jwt.decode(token, { - // complete: true, - // }); - // jwt.verify(token, this.pemValue, { - // algorithms: ['RS256'], - // }); - - // const shareId = (tokenDecoded.payload as JwtPayload).sub; - // const metadata = PackTheMetadata({}); - // return await this.shareMetadataService.get(shareId, metadata); - // } - - private async getShareMetadata(id: string, user: RequestUser) { + private async getShareMetadata(id: string, request: Request) { const metadata = PackTheMetadata({}); this.logger.info('GET share metadata') const info = await this.shareMetadataService.get(id, metadata); @@ -219,6 +210,8 @@ export class ShareService implements OnModuleInit { return info; } + const user = await this.getUserFromRequest(request); + if (info.type === 'private') { if (!user) { throw new ForbiddenException( @@ -244,4 +237,39 @@ export class ShareService implements OnModuleInit { } return info; } + + private async getUserFromRequest(request: Request): Promise { + const accessToken = request.get('Authorization'); + if (accessToken) { + const accessTokenDecoded: any = jwt.decode(accessToken, { + complete: true, + }); + + const { kid } = accessTokenDecoded.header; + + const { keys } = await this.authClient.getPublicKeys(); + + const pemValue = keys.find((key) => key.kid === kid); + + if (!pemValue) { + return null; + } + + jwt.verify(accessToken, pemValue.pem); + const accessTokenPayload = accessTokenDecoded.payload; + + return { + user_id: accessTokenPayload.user_id, + username: accessTokenPayload.username, + permissions: accessTokenPayload.permissions, + customer_id: accessTokenPayload.customer_id, + customer_name: accessTokenPayload.customer_name, + customer_tier: accessTokenPayload.customer_tier, + customer_modules: accessTokenPayload.customer_modules, + access_token: accessToken, + }; + } + + return null; + } }