From d8bf03dd70e509772697b5f7fee86f44013a5119 Mon Sep 17 00:00:00 2001 From: Wroud Date: Thu, 7 May 2020 18:10:01 +0300 Subject: [PATCH] feat(core): permissions service CB-103 --- webapp/packages/core/src/AppBootstrap.ts | 5 +- webapp/packages/core/src/manifest.ts | 3 +- .../core/src/root/PermissionsService.ts | 56 +++++++++++++++++++ webapp/packages/core/src/root/index.ts | 1 + .../src/root/queries/sessionPermissions.gql | 3 + webapp/packages/core/src/sdk/sdk.ts | 19 +++++++ 6 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 webapp/packages/core/src/root/PermissionsService.ts create mode 100644 webapp/packages/core/src/root/queries/sessionPermissions.gql diff --git a/webapp/packages/core/src/AppBootstrap.ts b/webapp/packages/core/src/AppBootstrap.ts index a138b389e6..289b7ab883 100644 --- a/webapp/packages/core/src/AppBootstrap.ts +++ b/webapp/packages/core/src/AppBootstrap.ts @@ -18,6 +18,7 @@ import { ThemeService } from '@dbeaver/core/theming'; import { SessionExpireService } from './dialogs'; import { LocalizationService } from './localization'; +import { PermissionsService } from './root'; /** * AppBootstrap.init() will be executed between first and second phase of App initialization, @@ -38,7 +39,8 @@ export class AppBootstrap { private navigationTreeContextMenuService: NavigationTreeContextMenuService, private nodesManagerService: NodesManagerService, private navigationTabsService: NavigationTabsService, - private connectionSchemaManagerService: ConnectionSchemaManagerService) { + private connectionSchemaManagerService: ConnectionSchemaManagerService, + private permissionsService: PermissionsService) { } async init() { @@ -47,6 +49,7 @@ export class AppBootstrap { await this.localizationService.init(); await this.themeService.init(); + await this.permissionsService.update(); this.connectionSchemaManagerService.registerCallbacks(); this.navigationTreeContextMenuService.registerMenuItems(); diff --git a/webapp/packages/core/src/manifest.ts b/webapp/packages/core/src/manifest.ts index 9c00618b09..c620ef01f4 100644 --- a/webapp/packages/core/src/manifest.ts +++ b/webapp/packages/core/src/manifest.ts @@ -20,7 +20,7 @@ import { LocalizationService } from '@dbeaver/core/localization'; import { PluginManagerService } from '@dbeaver/core/plugin'; import { ProductManagerService, ProductSettingsService } from '@dbeaver/core/product'; import { - SessionService, ServerService, SessionSettingsService, ServerSettingsService + SessionService, ServerService, SessionSettingsService, ServerSettingsService, PermissionsService } from '@dbeaver/core/root'; import { EnvironmentService, GraphQLService } from '@dbeaver/core/sdk'; import { LocalStorageSaveService, SettingsService } from '@dbeaver/core/settings'; @@ -40,6 +40,7 @@ export const coreManifest: PluginManifest = { PluginManagerService, ServerSettingsService, SessionSettingsService, + PermissionsService, CoreSettingsService, CommonDialogService, SessionExpireService, diff --git a/webapp/packages/core/src/root/PermissionsService.ts b/webapp/packages/core/src/root/PermissionsService.ts new file mode 100644 index 0000000000..9cbc835e50 --- /dev/null +++ b/webapp/packages/core/src/root/PermissionsService.ts @@ -0,0 +1,56 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { injectable } from '@dbeaver/core/di'; +import { GraphQLService, CachedResource } from '@dbeaver/core/sdk'; + +type PermissionsMetadata = { + loaded: boolean; +} + +@injectable() +export class PermissionsService { + private permissions = new CachedResource( + new Map(), + this.refreshAsync.bind(this), + (_, { loaded }) => loaded + ); + + constructor( + private graphQLService: GraphQLService, + ) { } + + has(id: string): boolean { + return this.permissions.data.has(id); + } + + async hasAsync(id: string): Promise { + const permissions = await this.permissions.load(); + + return permissions.has(id); + } + + async update() { + await this.permissions.refresh(); + } + + private async refreshAsync( + data: Map, + metadata: PermissionsMetadata + ): Promise> { + const { permissions } = await this.graphQLService.gql.sessionPermissions(); + + data.clear(); + for (const permission of permissions) { + data.set(permission, permission); + } + metadata.loaded = true; + + return data; + } +} diff --git a/webapp/packages/core/src/root/index.ts b/webapp/packages/core/src/root/index.ts index 08ca84e35b..9b72ea2ab3 100644 --- a/webapp/packages/core/src/root/index.ts +++ b/webapp/packages/core/src/root/index.ts @@ -1,4 +1,5 @@ export * from './SessionService'; export * from './ServerService'; +export * from './PermissionsService'; export * from './ServerSettingsService'; export * from './SessionSettingsService'; diff --git a/webapp/packages/core/src/root/queries/sessionPermissions.gql b/webapp/packages/core/src/root/queries/sessionPermissions.gql new file mode 100644 index 0000000000..064f5b4bd7 --- /dev/null +++ b/webapp/packages/core/src/root/queries/sessionPermissions.gql @@ -0,0 +1,3 @@ +query sessionPermissions { + permissions: sessionPermissions +} \ No newline at end of file diff --git a/webapp/packages/core/src/sdk/sdk.ts b/webapp/packages/core/src/sdk/sdk.ts index 64259a5b1b..be3a18b4cc 100644 --- a/webapp/packages/core/src/sdk/sdk.ts +++ b/webapp/packages/core/src/sdk/sdk.ts @@ -1286,6 +1286,12 @@ export type ServerConfigQuery = { >; }; +export type SessionPermissionsQueryVariables = {}; + +export type SessionPermissionsQuery = { + permissions: Query["sessionPermissions"]; +}; + export type SessionStateQueryVariables = {}; export type SessionStateQuery = { @@ -1929,6 +1935,11 @@ export const ServerConfigDocument = gql` } } `; +export const SessionPermissionsDocument = gql` + query sessionPermissions { + permissions: sessionPermissions + } +`; export const SessionStateDocument = gql` query sessionState { sessionState { @@ -2238,6 +2249,14 @@ export function getSdk(client: GraphQLClient) { variables, ); }, + sessionPermissions( + variables?: SessionPermissionsQueryVariables, + ): Promise { + return client.request( + print(SessionPermissionsDocument), + variables, + ); + }, sessionState( variables?: SessionStateQueryVariables, ): Promise {