From d739eaf659ed4e1f31f9183840ce2c949c11b8a1 Mon Sep 17 00:00:00 2001 From: Wroud Date: Wed, 5 Aug 2020 10:25:11 +0300 Subject: [PATCH 1/2] refactor(plugin-connection-preconfigured): update to new API and rename db-source to template connection --- .../ConnectionInfoResource.ts | 2 +- .../ConnectionsManagerService.ts | 4 +- .../queries/connections/closeConnection.gql | 1 + .../queries/connections/connectionState.gql | 1 + .../queries/connections/createConnection.gql | 1 + .../queries/connections/initConnection.gql | 1 + .../queries/connections/openConnection.gql | 1 + .../connections/templateDataSourceList.gql | 11 +- webapp/packages/core-sdk/src/sdk.ts | 132 ++++++++++++------ .../src/BasicConnectionPluginBootstrap.ts | 18 +-- .../ConnectionDialog/ConnectionController.ts | 44 +++--- .../src/ConnectionDialog/ConnectionDialog.tsx | 22 +-- .../DBSourceSelector/DBSourceItem.tsx | 25 ---- .../TemplateConnectionItem.tsx | 29 ++++ .../TemplateConnectionSelector.tsx} | 30 ++-- ...urce.ts => TemplateConnectionsResource.ts} | 10 +- .../src/locales/en.ts | 2 +- .../src/locales/ru.ts | 2 +- .../src/manifest.ts | 4 +- 19 files changed, 203 insertions(+), 137 deletions(-) delete mode 100644 webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/DBSourceSelector/DBSourceItem.tsx create mode 100644 webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/TemplateConnectionSelector/TemplateConnectionItem.tsx rename webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/{DBSourceSelector/DBSourceSelector.tsx => TemplateConnectionSelector/TemplateConnectionSelector.tsx} (53%) rename webapp/packages/plugin-connection-preconfigured/src/{DataSourcesResource.ts => TemplateConnectionsResource.ts} (76%) diff --git a/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionInfoResource.ts b/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionInfoResource.ts index 27457abb37..072aa63d6a 100644 --- a/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionInfoResource.ts +++ b/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionInfoResource.ts @@ -14,7 +14,7 @@ import { ObjectPropertyInfo } from '@cloudbeaver/core-sdk'; -export type Connection = Pick & { authProperties?: ObjectPropertyInfo[] } +export type Connection = Pick & { authProperties?: ObjectPropertyInfo[] } @injectable() export class ConnectionInfoResource extends CachedMapResource { diff --git a/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionsManagerService.ts b/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionsManagerService.ts index d2ff509cf6..cb7b82edcd 100644 --- a/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionsManagerService.ts +++ b/webapp/packages/core-app/src/shared/ConnectionsManager/ConnectionsManagerService.ts @@ -11,7 +11,7 @@ import { Subject } from 'rxjs'; import { injectable } from '@cloudbeaver/core-di'; import { NotificationService } from '@cloudbeaver/core-events'; import { SessionResource } from '@cloudbeaver/core-root'; -import { DataSourceInfo, isResourceKeyList } from '@cloudbeaver/core-sdk'; +import { isResourceKeyList } from '@cloudbeaver/core-sdk'; import { ROOT_NODE_PATH } from '../NodesManager/NavNodeInfoResource'; import { NavNodeManagerService } from '../NodesManager/NavNodeManagerService'; @@ -20,8 +20,6 @@ import { ConnectionInfoResource, Connection } from './ConnectionInfoResource'; import { ContainerResource, ObjectContainer } from './ContainerResource'; import { EConnectionFeature } from './EConnectionFeature'; -export type DBSource = Pick - @injectable() export class ConnectionsManagerService { onOpenConnection = new Subject(); diff --git a/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql b/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql index 828c0a5743..a116480f34 100644 --- a/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql +++ b/webapp/packages/core-sdk/src/queries/connections/closeConnection.gql @@ -2,6 +2,7 @@ mutation closeConnection($id: ID!) { connection: closeConnection(id: $id) { id name + description driverId connected features diff --git a/webapp/packages/core-sdk/src/queries/connections/connectionState.gql b/webapp/packages/core-sdk/src/queries/connections/connectionState.gql index e32da0837a..030cc32e88 100644 --- a/webapp/packages/core-sdk/src/queries/connections/connectionState.gql +++ b/webapp/packages/core-sdk/src/queries/connections/connectionState.gql @@ -2,6 +2,7 @@ query connectionState($id: ID!) { connection: connectionState(id: $id) { id name + description driverId connected features diff --git a/webapp/packages/core-sdk/src/queries/connections/createConnection.gql b/webapp/packages/core-sdk/src/queries/connections/createConnection.gql index bf2a2dfefe..0dfb8d3fee 100644 --- a/webapp/packages/core-sdk/src/queries/connections/createConnection.gql +++ b/webapp/packages/core-sdk/src/queries/connections/createConnection.gql @@ -2,6 +2,7 @@ mutation createConnection($config: ConnectionConfig!) { createConnection(config: $config) { id name + description driverId connected features diff --git a/webapp/packages/core-sdk/src/queries/connections/initConnection.gql b/webapp/packages/core-sdk/src/queries/connections/initConnection.gql index f369375ff0..bf94edba5d 100644 --- a/webapp/packages/core-sdk/src/queries/connections/initConnection.gql +++ b/webapp/packages/core-sdk/src/queries/connections/initConnection.gql @@ -2,6 +2,7 @@ mutation initConnection($id: ID!, $credentials: Object) { connection: initConnection(id: $id, credentials: $credentials) { id name + description driverId connected features diff --git a/webapp/packages/core-sdk/src/queries/connections/openConnection.gql b/webapp/packages/core-sdk/src/queries/connections/openConnection.gql index d01deb3041..618cfac0fc 100644 --- a/webapp/packages/core-sdk/src/queries/connections/openConnection.gql +++ b/webapp/packages/core-sdk/src/queries/connections/openConnection.gql @@ -2,6 +2,7 @@ mutation openConnection($config: ConnectionConfig!) { connection: openConnection(config: $config) { id name + description driverId connected features diff --git a/webapp/packages/core-sdk/src/queries/connections/templateDataSourceList.gql b/webapp/packages/core-sdk/src/queries/connections/templateDataSourceList.gql index 4a4fad36e8..353cb4294d 100644 --- a/webapp/packages/core-sdk/src/queries/connections/templateDataSourceList.gql +++ b/webapp/packages/core-sdk/src/queries/connections/templateDataSourceList.gql @@ -1,8 +1,13 @@ -query templateDataSourceList { - sources: templateDataSources { +query getTemplateConnections { + connections: templateConnections { id name - driverId description + driverId + connected + features + + authNeeded + authModel } } \ No newline at end of file diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index de5cccbfd4..297973d55e 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -16,6 +16,7 @@ export type Scalars = { }; export type Query = { + allConnections: Array; authLogin: UserAuthInfo; authLogout?: Maybe; authModels: Array; @@ -23,14 +24,14 @@ export type Query = { connectionInfo: ConnectionInfo; /** @deprecated Field no longer supported */ connectionState: ConnectionInfo; + createConnectionConfiguration: ConnectionInfo; createRole: AdminRoleInfo; createUser: AdminUserInfo; - /** @deprecated Field no longer supported */ - dataSourceList: Array; dataTransferAvailableStreamProcessors: Array; dataTransferExportDataFromContainer: AsyncTaskInfo; dataTransferExportDataFromResults: AsyncTaskInfo; dataTransferRemoveDataFile?: Maybe; + deleteConnectionConfiguration?: Maybe; deleteRole?: Maybe; deleteUser?: Maybe; driverList: Array; @@ -49,12 +50,16 @@ export type Query = { sessionPermissions: Array>; sessionState: SessionInfo; sessionUser?: Maybe; - setRolePermissions?: Maybe; + setConnectionAccess?: Maybe; + setSubjectPermissions?: Maybe; setUserCredentials?: Maybe; sqlCompletionProposals?: Maybe>>; sqlDialectInfo?: Maybe; sqlListContexts?: Maybe>>; + templateConnections: Array; + /** @deprecated Field no longer supported */ templateDataSources: Array; + updateConnectionConfiguration: ConnectionInfo; }; export type QueryAuthLoginArgs = { @@ -70,6 +75,10 @@ export type QueryConnectionStateArgs = { id: Scalars['ID']; }; +export type QueryCreateConnectionConfigurationArgs = { + config: ConnectionConfig; +}; + export type QueryCreateRoleArgs = { roleId: Scalars['ID']; }; @@ -95,6 +104,10 @@ export type QueryDataTransferRemoveDataFileArgs = { dataFileId: Scalars['String']; }; +export type QueryDeleteConnectionConfigurationArgs = { + id: Scalars['ID']; +}; + export type QueryDeleteRoleArgs = { roleId: Scalars['ID']; }; @@ -155,9 +168,14 @@ export type QueryRevokeUserRoleArgs = { roleId: Scalars['ID']; }; -export type QuerySetRolePermissionsArgs = { +export type QuerySetConnectionAccessArgs = { + connectionId: Scalars['ID']; + subjects: Array; +}; + +export type QuerySetSubjectPermissionsArgs = { roleId: Scalars['ID']; - permissions: Array>; + permissions: Array; }; export type QuerySetUserCredentialsArgs = { @@ -182,9 +200,17 @@ export type QuerySqlListContextsArgs = { connectionId: Scalars['ID']; }; +export type QueryUpdateConnectionConfigurationArgs = { + id: Scalars['ID']; + config: ConnectionConfig; +}; + export type Mutation = { asyncSqlExecuteQuery: AsyncTaskInfo; + asyncSqlExecuteResults: SqlExecuteInfo; asyncTaskCancel?: Maybe; + asyncTaskInfo: AsyncTaskInfo; + /** @deprecated Field no longer supported */ asyncTaskStatus: AsyncTaskInfo; changeSessionLanguage?: Maybe; closeConnection: ConnectionInfo; @@ -216,10 +242,19 @@ export type MutationAsyncSqlExecuteQueryArgs = { filter?: Maybe; }; +export type MutationAsyncSqlExecuteResultsArgs = { + taskId: Scalars['ID']; +}; + export type MutationAsyncTaskCancelArgs = { id: Scalars['String']; }; +export type MutationAsyncTaskInfoArgs = { + id: Scalars['String']; + removeOnFinish?: Maybe; +}; + export type MutationAsyncTaskStatusArgs = { id: Scalars['String']; }; @@ -335,6 +370,7 @@ export type AsyncTaskInfo = { running: Scalars['Boolean']; status?: Maybe; error?: Maybe; + /** @deprecated Field no longer supported */ result?: Maybe; taskResult?: Maybe; }; @@ -427,6 +463,27 @@ export type DriverInfo = { applicableAuthModel: Array; }; +export type ConnectionInfo = { + id: Scalars['ID']; + driverId: Scalars['ID']; + name: Scalars['String']; + description?: Maybe; + properties?: Maybe; + template: Scalars['Boolean']; + connected: Scalars['Boolean']; + provided: Scalars['Boolean']; + readOnly: Scalars['Boolean']; + connectTime?: Maybe; + connectionError?: Maybe; + serverVersion?: Maybe; + clientVersion?: Maybe; + authNeeded: Scalars['Boolean']; + authModel?: Maybe; + authProperties: Array; + features: Array; + navigatorSettings: NavigatorSettings; +}; + export type DataSourceInfo = { id: Scalars['ID']; driverId: Scalars['ID']; @@ -440,19 +497,22 @@ export type DataSourceInfo = { }; export type ConnectionConfig = { - driverId?: Maybe; name?: Maybe; description?: Maybe; - dataSourceId?: Maybe; + templateId?: Maybe; + driverId?: Maybe; host?: Maybe; port?: Maybe; databaseName?: Maybe; url?: Maybe; properties?: Maybe; - userName?: Maybe; - userPassword?: Maybe; + template?: Maybe; + readOnly?: Maybe; authModelId?: Maybe; credentials?: Maybe; + dataSourceId?: Maybe; + userName?: Maybe; + userPassword?: Maybe; }; export type NavigatorSettings = { @@ -475,25 +535,6 @@ export type NavigatorSettingsInput = { hideVirtualModel: Scalars['Boolean']; }; -export type ConnectionInfo = { - id: Scalars['ID']; - driverId: Scalars['ID']; - name: Scalars['String']; - description?: Maybe; - properties?: Maybe; - connected: Scalars['Boolean']; - provided: Scalars['Boolean']; - connectTime?: Maybe; - connectionError?: Maybe; - serverVersion?: Maybe; - clientVersion?: Maybe; - authNeeded: Scalars['Boolean']; - authModel?: Maybe; - authProperties: Array; - features: Array; - navigatorSettings: NavigatorSettings; -}; - export type LogEntry = { time?: Maybe; type: Scalars['String']; @@ -793,7 +834,7 @@ export type CloseConnectionMutationVariables = Exact<{ id: Scalars['ID']; }>; -export type CloseConnectionMutation = { connection: Pick }; +export type CloseConnectionMutation = { connection: Pick }; export type ConnectionAuthPropertiesQueryVariables = Exact<{ id: Scalars['ID']; @@ -805,13 +846,13 @@ export type ConnectionStateQueryVariables = Exact<{ id: Scalars['ID']; }>; -export type ConnectionStateQuery = { connection: Pick }; +export type ConnectionStateQuery = { connection: Pick }; export type CreateConnectionMutationVariables = Exact<{ config: ConnectionConfig; }>; -export type CreateConnectionMutation = { createConnection: Pick }; +export type CreateConnectionMutation = { createConnection: Pick }; export type DeleteConnectionMutationVariables = Exact<{ id: Scalars['ID']; @@ -850,17 +891,17 @@ export type InitConnectionMutationVariables = Exact<{ credentials?: Maybe; }>; -export type InitConnectionMutation = { connection: Pick }; +export type InitConnectionMutation = { connection: Pick }; export type OpenConnectionMutationVariables = Exact<{ config: ConnectionConfig; }>; -export type OpenConnectionMutation = { connection: Pick }; +export type OpenConnectionMutation = { connection: Pick }; -export type TemplateDataSourceListQueryVariables = Exact<{ [key: string]: never }>; +export type GetTemplateConnectionsQueryVariables = Exact<{ [key: string]: never }>; -export type TemplateDataSourceListQuery = { sources: Array> }; +export type GetTemplateConnectionsQuery = { connections: Array> }; export type TestConnectionMutationVariables = Exact<{ config: ConnectionConfig; @@ -1281,6 +1322,7 @@ export const CloseConnectionDocument = ` connection: closeConnection(id: $id) { id name + description driverId connected features @@ -1311,6 +1353,7 @@ export const ConnectionStateDocument = ` connection: connectionState(id: $id) { id name + description driverId connected features @@ -1324,6 +1367,7 @@ export const CreateConnectionDocument = ` createConnection(config: $config) { id name + description driverId connected features @@ -1404,6 +1448,7 @@ export const InitConnectionDocument = ` connection: initConnection(id: $id, credentials: $credentials) { id name + description driverId connected features @@ -1417,6 +1462,7 @@ export const OpenConnectionDocument = ` connection: openConnection(config: $config) { id name + description driverId connected features @@ -1425,13 +1471,17 @@ export const OpenConnectionDocument = ` } } `; -export const TemplateDataSourceListDocument = ` - query templateDataSourceList { - sources: templateDataSources { +export const GetTemplateConnectionsDocument = ` + query getTemplateConnections { + connections: templateConnections { id name - driverId description + driverId + connected + features + authNeeded + authModel } } `; @@ -2022,8 +2072,8 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = openConnection(variables: OpenConnectionMutationVariables): Promise { return withWrapper(() => client.request(OpenConnectionDocument, variables)); }, - templateDataSourceList(variables?: TemplateDataSourceListQueryVariables): Promise { - return withWrapper(() => client.request(TemplateDataSourceListDocument, variables)); + getTemplateConnections(variables?: GetTemplateConnectionsQueryVariables): Promise { + return withWrapper(() => client.request(GetTemplateConnectionsDocument, variables)); }, testConnection(variables: TestConnectionMutationVariables): Promise { return withWrapper(() => client.request(TestConnectionDocument, variables)); diff --git a/webapp/packages/plugin-connection-preconfigured/src/BasicConnectionPluginBootstrap.ts b/webapp/packages/plugin-connection-preconfigured/src/BasicConnectionPluginBootstrap.ts index f13062147e..b6da11958f 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/BasicConnectionPluginBootstrap.ts +++ b/webapp/packages/plugin-connection-preconfigured/src/BasicConnectionPluginBootstrap.ts @@ -13,7 +13,7 @@ import { NotificationService } from '@cloudbeaver/core-events'; import { PermissionsService, EPermission } from '@cloudbeaver/core-root'; import { ConnectionDialog } from './ConnectionDialog/ConnectionDialog'; -import { TemplateDataSourceListResource } from './DataSourcesResource'; +import { TemplateConnectionsResource } from './TemplateConnectionsResource'; @injectable() export class BasicConnectionPluginBootstrap { @@ -21,7 +21,7 @@ export class BasicConnectionPluginBootstrap { constructor( private connectionDialogsService: ConnectionDialogsService, private mainMenuService: MainMenuService, - private templateDataSourceListResource: TemplateDataSourceListResource, + private templateConnectionsResource: TemplateConnectionsResource, private commonDialogService: CommonDialogService, private notificationService: NotificationService, private permissionsService: PermissionsService @@ -29,7 +29,7 @@ export class BasicConnectionPluginBootstrap { } bootstrap() { - this.loadDbSources(); + this.loadTemplateConnections(); this.mainMenuService.registerMenuItem( this.connectionDialogsService.newConnectionMenuToken, { @@ -44,20 +44,20 @@ export class BasicConnectionPluginBootstrap { } private async openConnectionsDialog() { - this.loadDbSources(); + this.loadTemplateConnections(); await this.commonDialogService.open(ConnectionDialog, null); } private isDisabled() { - this.loadDbSources(); - return !this.templateDataSourceListResource.data.length; + this.loadTemplateConnections(); + return !this.templateConnectionsResource.data.length; } - private async loadDbSources() { + private async loadTemplateConnections() { try { - await this.templateDataSourceListResource.loadAll(); + await this.templateConnectionsResource.loadAll(); } catch (error) { - this.notificationService.logException(error, 'Template Data Sources loading failed'); + this.notificationService.logException(error, 'Template Connections loading failed'); } } } diff --git a/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionController.ts b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionController.ts index 036aacb430..09443f46b6 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionController.ts +++ b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionController.ts @@ -9,7 +9,7 @@ import { observable, action } from 'mobx'; import { - DBDriverResource, DBSource, ErrorDetailsDialog, DatabaseAuthModelsResource + DBDriverResource, Connection, ErrorDetailsDialog, DatabaseAuthModelsResource } from '@cloudbeaver/core-app'; import { injectable, IInitializableController, IDestructibleController } from '@cloudbeaver/core-di'; import { CommonDialogService } from '@cloudbeaver/core-dialogs'; @@ -17,15 +17,15 @@ import { NotificationService } from '@cloudbeaver/core-events'; import { ConnectionConfig, GQLError, DatabaseAuthModel } from '@cloudbeaver/core-sdk'; import { BasicConnectionService } from '../BasicConnectionService'; -import { TemplateDataSourceListResource } from '../DataSourcesResource'; +import { TemplateConnectionsResource } from '../TemplateConnectionsResource'; export enum ConnectionStep { - DBSource, + ConnectionTemplateSelect, Connection } export interface IConnectionController { - dbSource: DBSource | null; + template: Connection | null; config: ConnectionConfig; isConnecting: boolean; onConnect(): void; @@ -34,10 +34,10 @@ export interface IConnectionController { @injectable() export class ConnectionController implements IInitializableController, IDestructibleController, IConnectionController { - @observable step = ConnectionStep.DBSource + @observable step = ConnectionStep.ConnectionTemplateSelect @observable isLoading = true; @observable isConnecting = false; - @observable dbSource: DBSource | null = null + @observable template: Connection | null = null @observable authModel?: DatabaseAuthModel; @observable config: ConnectionConfig = { credentials: {}, @@ -49,8 +49,8 @@ implements IInitializableController, IDestructibleController, IConnectionControl private onClose!: () => void private isDistructed = false; - get dbSources() { - return this.templateDataSourceListResource.data; + get templateConnections() { + return this.templateConnectionsResource.data; } get dbDrivers() { @@ -58,15 +58,15 @@ implements IInitializableController, IDestructibleController, IConnectionControl } get dbDriver() { - if (!this.dbSource) { + if (!this.template) { return undefined; } - return this.dbDrivers.get(this.dbSource.driverId); + return this.dbDrivers.get(this.template.driverId); } constructor( private dbDriverResource: DBDriverResource, - private templateDataSourceListResource: TemplateDataSourceListResource, + private templateConnectionsResource: TemplateConnectionsResource, private basicConnectionService: BasicConnectionService, private notificationService: NotificationService, private commonDialogService: CommonDialogService, @@ -75,7 +75,7 @@ implements IInitializableController, IDestructibleController, IConnectionControl init(onClose: () => void) { this.onClose = onClose; - this.loadDBSources(); + this.loadTemplateConnections(); } destruct(): void { @@ -85,6 +85,10 @@ implements IInitializableController, IDestructibleController, IConnectionControl onStep = (step: ConnectionStep) => { this.step = step; this.clearError(); + + if (step === ConnectionStep.ConnectionTemplateSelect) { + this.template = null; + } } onConnect = async () => { @@ -102,12 +106,12 @@ implements IInitializableController, IDestructibleController, IConnectionControl } } - onDBSourceSelect = async (sourceId: string) => { - this.dbSource = this.dbSources.find(dbSource => dbSource.id === sourceId)!; + onTemplateSelect = async (templateId: string) => { + this.template = this.templateConnections.find(template => template.id === templateId)!; await this.loadAuthModel(); this.clearError(); - this.setDBSourceDefaults(); + this.seTemplateDefaults(); this.step = ConnectionStep.Connection; if (!this.authModel) { @@ -123,7 +127,7 @@ implements IInitializableController, IDestructibleController, IConnectionControl private getConnectionConfig(): ConnectionConfig { const config: ConnectionConfig = {}; - config.dataSourceId = this.config.dataSourceId; + config.templateId = this.config.templateId; config.authModelId = this.config.authModelId; config.credentials = this.config.credentials; @@ -131,8 +135,8 @@ implements IInitializableController, IDestructibleController, IConnectionControl } @action - private setDBSourceDefaults() { - this.config.dataSourceId = this.dbSource?.id; + private seTemplateDefaults() { + this.config.templateId = this.template?.id; this.config.authModelId = this.dbDriver?.defaultAuthModel; this.config.credentials = {}; } @@ -153,9 +157,9 @@ implements IInitializableController, IDestructibleController, IConnectionControl } } - private async loadDBSources() { + private async loadTemplateConnections() { try { - await this.templateDataSourceListResource.loadAll(); + await this.templateConnectionsResource.loadAll(); await this.dbDriverResource.loadAll(); } catch (exception) { this.notificationService.logException(exception, 'Can\'t load database sources'); diff --git a/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionDialog.tsx b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionDialog.tsx index ca161017d8..88763d14a5 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionDialog.tsx +++ b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/ConnectionDialog.tsx @@ -20,7 +20,7 @@ import { useStyles } from '@cloudbeaver/core-theming'; import { ConnectionController, ConnectionStep } from './ConnectionController'; import { ConnectionDialogFooter } from './ConnectionDialogFooter'; -import { DBSourceSelector } from './DBSourceSelector/DBSourceSelector'; +import { TemplateConnectionSelector } from './TemplateConnectionSelector/TemplateConnectionSelector'; const styles = css` CommonDialogWrapper { @@ -51,30 +51,30 @@ export const ConnectionDialog = observer(function ConnectionDialog({ const translate = useTranslate(); let title = translate('basicConnection_connectionDialog_newConnection'); - if (controller.step === ConnectionStep.Connection && controller.dbSource?.name) { - title = controller.dbSource.name; + if (controller.step === ConnectionStep.Connection && controller.template?.name) { + title = controller.template.name; } return styled(useStyles(styles))( controller.onStep(ConnectionStep.DBSource)} + onBack={() => controller.onStep(ConnectionStep.ConnectionTemplateSelect)} onConnect={controller.onConnect} /> )} onReject={rejectDialog} > {controller.isLoading && } - {!controller.isLoading && controller.step === ConnectionStep.DBSource && ( - )} {controller.step === ConnectionStep.Connection && (!controller.authModel ? ( @@ -84,8 +84,8 @@ export const ConnectionDialog = observer(function ConnectionDialog({ ) : ( }> onSelect(dbSource.id), [dbSource]); - - return ; -}); diff --git a/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/TemplateConnectionSelector/TemplateConnectionItem.tsx b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/TemplateConnectionSelector/TemplateConnectionItem.tsx new file mode 100644 index 0000000000..dc3381af2a --- /dev/null +++ b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/TemplateConnectionSelector/TemplateConnectionItem.tsx @@ -0,0 +1,29 @@ +/* + * 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 { observer } from 'mobx-react'; +import { useCallback } from 'react'; + +import { DBDriver, Connection } from '@cloudbeaver/core-app'; +import { ListItem } from '@cloudbeaver/core-blocks'; + +type Props = { + template: Connection; + dbDriver?: DBDriver; + onSelect(connectionId: string): void; +} + +export const TemplateConnectionItem = observer(function TemplateConnectionItem({ + template, + dbDriver, + onSelect, +}: Props) { + const select = useCallback(() => onSelect(template.id), [template]); + + return ; +}); diff --git a/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/DBSourceSelector/DBSourceSelector.tsx b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/TemplateConnectionSelector/TemplateConnectionSelector.tsx similarity index 53% rename from webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/DBSourceSelector/DBSourceSelector.tsx rename to webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/TemplateConnectionSelector/TemplateConnectionSelector.tsx index bcb4f76261..300e9f03db 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/DBSourceSelector/DBSourceSelector.tsx +++ b/webapp/packages/plugin-connection-preconfigured/src/ConnectionDialog/TemplateConnectionSelector/TemplateConnectionSelector.tsx @@ -9,40 +9,40 @@ import { observer } from 'mobx-react'; import { useState, useMemo } from 'react'; -import { DBDriver, DBSource } from '@cloudbeaver/core-app'; +import { DBDriver, Connection } from '@cloudbeaver/core-app'; import { ItemList, ItemListSearch } from '@cloudbeaver/core-blocks'; -import { DBSourceItem } from './DBSourceItem'; +import { TemplateConnectionItem } from './TemplateConnectionItem'; -type DBSourceSelectorProps = { - dbSources: DBSource[]; +type Props = { + templateConnections: Connection[]; dbDrivers: Map; className?: string; onSelect(dbSourceId: string): void; } -export const DBSourceSelector = observer(function DBSourceSelector({ - dbSources, +export const TemplateConnectionSelector = observer(function TemplateConnectionSelector({ + templateConnections, dbDrivers, className, onSelect, -}: DBSourceSelectorProps) { +}: Props) { const [search, setSearch] = useState(''); const filteredDBSources = useMemo(() => { if (!search) { - return dbSources; + return templateConnections; } - return dbSources.filter(source => source.name.toUpperCase().includes(search.toUpperCase())); - }, [search, dbSources]); + return templateConnections.filter(template => template.name.toUpperCase().includes(search.toUpperCase())); + }, [search, templateConnections]); return ( - {filteredDBSources.map(dbSource => ( - ( + ))} diff --git a/webapp/packages/plugin-connection-preconfigured/src/DataSourcesResource.ts b/webapp/packages/plugin-connection-preconfigured/src/TemplateConnectionsResource.ts similarity index 76% rename from webapp/packages/plugin-connection-preconfigured/src/DataSourcesResource.ts rename to webapp/packages/plugin-connection-preconfigured/src/TemplateConnectionsResource.ts index 337ab28d45..c16eb6140c 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/DataSourcesResource.ts +++ b/webapp/packages/plugin-connection-preconfigured/src/TemplateConnectionsResource.ts @@ -6,13 +6,13 @@ * you may not use this file except in compliance with the License. */ -import { DBSource } from '@cloudbeaver/core-app'; +import { Connection } from '@cloudbeaver/core-app'; import { injectable } from '@cloudbeaver/core-di'; import { EPermission, PermissionsService } from '@cloudbeaver/core-root'; import { GraphQLService, CachedDataResource } from '@cloudbeaver/core-sdk'; @injectable() -export class TemplateDataSourceListResource extends CachedDataResource { +export class TemplateConnectionsResource extends CachedDataResource { constructor( private graphQLService: GraphQLService, private permissionsService: PermissionsService @@ -35,13 +35,13 @@ export class TemplateDataSourceListResource extends CachedDataResource { + protected async loader(key: null): Promise { if (!await this.permissionsService.hasAsync(EPermission.public)) { this.markUpdated(key); return []; } - const { sources } = await this.graphQLService.gql.templateDataSourceList(); + const { connections } = await this.graphQLService.gql.getTemplateConnections(); this.markUpdated(key); - return sources; + return connections; } } diff --git a/webapp/packages/plugin-connection-preconfigured/src/locales/en.ts b/webapp/packages/plugin-connection-preconfigured/src/locales/en.ts index 07e9d3cef8..d09aacb3f2 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/locales/en.ts +++ b/webapp/packages/plugin-connection-preconfigured/src/locales/en.ts @@ -9,5 +9,5 @@ export default [ ['basicConnection_connectionDialog_connecting', 'Connecting...'], ['basicConnection_connectionDialog_connect', 'Connect'], ['basicConnection_connectionDialog_connecting_message', 'Connecting to database...'], - ['basicConnection_main_menu_item', 'Preconfigured'], + ['basicConnection_main_menu_item', 'Template'], ]; diff --git a/webapp/packages/plugin-connection-preconfigured/src/locales/ru.ts b/webapp/packages/plugin-connection-preconfigured/src/locales/ru.ts index 56172a475d..8facbcfb1a 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/locales/ru.ts +++ b/webapp/packages/plugin-connection-preconfigured/src/locales/ru.ts @@ -9,5 +9,5 @@ export default [ ['basicConnection_connectionDialog_connecting', 'Подключение...'], ['basicConnection_connectionDialog_connect', 'Подключиться'], ['basicConnection_connectionDialog_connecting_message', 'Подключение к базе...'], - ['basicConnection_main_menu_item', 'Подключиться'], + ['basicConnection_main_menu_item', 'Шаблон'], ]; diff --git a/webapp/packages/plugin-connection-preconfigured/src/manifest.ts b/webapp/packages/plugin-connection-preconfigured/src/manifest.ts index b80b7bfd38..07aef4dfb8 100644 --- a/webapp/packages/plugin-connection-preconfigured/src/manifest.ts +++ b/webapp/packages/plugin-connection-preconfigured/src/manifest.ts @@ -10,8 +10,8 @@ import { PluginManifest } from '@cloudbeaver/core-di'; import { BasicConnectionPluginBootstrap } from './BasicConnectionPluginBootstrap'; import { BasicConnectionService } from './BasicConnectionService'; -import { TemplateDataSourceListResource } from './DataSourcesResource'; import { LocaleService } from './LocaleService'; +import { TemplateConnectionsResource } from './TemplateConnectionsResource'; export const basicConnectionPluginManifest: PluginManifest = { info: { @@ -20,7 +20,7 @@ export const basicConnectionPluginManifest: PluginManifest = { providers: [ BasicConnectionService, - TemplateDataSourceListResource, + TemplateConnectionsResource, LocaleService, ], From fb597af04534c15d5b69ba5d794e3101793f8ccf Mon Sep 17 00:00:00 2001 From: Wroud Date: Wed, 5 Aug 2020 12:15:26 +0300 Subject: [PATCH 2/2] refactor(core): async task API CB-197 --- ...ortTaskStatus.gql => getAsyncTaskInfo.gql} | 6 +- .../src/queries/grid/asyncSqlExecuteQuery.gql | 29 +-- .../src/queries/grid/asyncTaskStatus.gql | 41 ---- ...Query.gql => getSqlExecuteTaskResults.gql} | 14 +- webapp/packages/core-sdk/src/sdk.ts | 182 +++++------------- .../src/ExportFromContainerProcess.ts | 12 +- .../src/ExportFromResultsProcess.ts | 12 +- .../SqlResultTabs/SQLQueryExecutionProcess.ts | 20 +- 8 files changed, 82 insertions(+), 234 deletions(-) rename webapp/packages/core-sdk/src/queries/{data-transfer/asyncExportTaskStatus.gql => getAsyncTaskInfo.gql} (64%) delete mode 100644 webapp/packages/core-sdk/src/queries/grid/asyncTaskStatus.gql rename webapp/packages/core-sdk/src/queries/grid/{executeSqlQuery.gql => getSqlExecuteTaskResults.gql} (69%) diff --git a/webapp/packages/core-sdk/src/queries/data-transfer/asyncExportTaskStatus.gql b/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql similarity index 64% rename from webapp/packages/core-sdk/src/queries/data-transfer/asyncExportTaskStatus.gql rename to webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql index 35f3e38ce3..d7cd7064d4 100644 --- a/webapp/packages/core-sdk/src/queries/data-transfer/asyncExportTaskStatus.gql +++ b/webapp/packages/core-sdk/src/queries/getAsyncTaskInfo.gql @@ -1,8 +1,10 @@ -mutation asyncExportTaskStatus( +mutation getAsyncTaskInfo( $taskId: String! + $removeOnFinish: Boolean! ) { - taskInfo: asyncTaskStatus( + taskInfo: asyncTaskInfo( id: $taskId + removeOnFinish: $removeOnFinish ) { id name diff --git a/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql b/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql index bf8b6fa6ae..32c3b9bd68 100644 --- a/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql +++ b/webapp/packages/core-sdk/src/queries/grid/asyncSqlExecuteQuery.gql @@ -11,37 +11,14 @@ mutation asyncSqlExecuteQuery( filter: $filter ) { id + name running - result { - duration - statusMessage - results { - updateRowCount - sourceQuery - title - resultSet { - id - columns { - dataKind - entityName - fullTypeName - icon - label - maxLength - name - position - precision - scale - typeName - } - rows - } - } - } + status error { message errorCode stackTrace } + taskResult } } diff --git a/webapp/packages/core-sdk/src/queries/grid/asyncTaskStatus.gql b/webapp/packages/core-sdk/src/queries/grid/asyncTaskStatus.gql deleted file mode 100644 index 0b14f2da86..0000000000 --- a/webapp/packages/core-sdk/src/queries/grid/asyncTaskStatus.gql +++ /dev/null @@ -1,41 +0,0 @@ -mutation asyncTaskStatus( - $taskId: String! -) { - taskInfo: asyncTaskStatus( - id: $taskId - ) { - id - running - result { - duration - statusMessage - results { - updateRowCount - sourceQuery - title - resultSet { - id - columns { - dataKind - entityName - fullTypeName - icon - label - maxLength - name - position - precision - scale - typeName - } - rows - } - } - } - error { - message - errorCode - stackTrace - } - } -} diff --git a/webapp/packages/core-sdk/src/queries/grid/executeSqlQuery.gql b/webapp/packages/core-sdk/src/queries/grid/getSqlExecuteTaskResults.gql similarity index 69% rename from webapp/packages/core-sdk/src/queries/grid/executeSqlQuery.gql rename to webapp/packages/core-sdk/src/queries/grid/getSqlExecuteTaskResults.gql index 84e74c8a74..c21a079bac 100644 --- a/webapp/packages/core-sdk/src/queries/grid/executeSqlQuery.gql +++ b/webapp/packages/core-sdk/src/queries/grid/getSqlExecuteTaskResults.gql @@ -1,14 +1,8 @@ -mutation executeSqlQuery( - $connectionId: ID! - $contextId: ID! - $query: String! - $filter: SQLDataFilter +mutation getSqlExecuteTaskResults( + $taskId: ID! ) { - result: sqlExecuteQuery( - connectionId: $connectionId - contextId: $contextId - sql: $query - filter: $filter + result: asyncSqlExecuteResults( + taskId: $taskId ) { duration statusMessage diff --git a/webapp/packages/core-sdk/src/sdk.ts b/webapp/packages/core-sdk/src/sdk.ts index 297973d55e..bcd2a12e0e 100644 --- a/webapp/packages/core-sdk/src/sdk.ts +++ b/webapp/packages/core-sdk/src/sdk.ts @@ -252,7 +252,7 @@ export type MutationAsyncTaskCancelArgs = { export type MutationAsyncTaskInfoArgs = { id: Scalars['String']; - removeOnFinish?: Maybe; + removeOnFinish: Scalars['Boolean']; }; export type MutationAsyncTaskStatusArgs = { @@ -909,15 +909,6 @@ export type TestConnectionMutationVariables = Exact<{ export type TestConnectionMutation = { testConnection: Pick }; -export type AsyncExportTaskStatusMutationVariables = Exact<{ - taskId: Scalars['String']; -}>; - -export type AsyncExportTaskStatusMutation = { taskInfo: ( - Pick - & { error?: Maybe> } - ); }; - export type ExportDataFromContainerQueryVariables = Exact<{ connectionId: Scalars['ID']; containerNodePath: Scalars['ID']; @@ -961,6 +952,16 @@ export type NavGetStructContainersQueryVariables = Exact<{ export type NavGetStructContainersQuery = { navGetStructContainers: { catalogList: Array>; schemaList: Array> } }; +export type GetAsyncTaskInfoMutationVariables = Exact<{ + taskId: Scalars['String']; + removeOnFinish: Scalars['Boolean']; +}>; + +export type GetAsyncTaskInfoMutation = { taskInfo: ( + Pick + & { error?: Maybe> } + ); }; + export type AsyncSqlExecuteQueryMutationVariables = Exact<{ connectionId: Scalars['ID']; contextId: Scalars['ID']; @@ -969,45 +970,15 @@ export type AsyncSqlExecuteQueryMutationVariables = Exact<{ }>; export type AsyncSqlExecuteQueryMutation = { taskInfo: ( - Pick - & { result?: Maybe<( - Pick - & { results: Array<( - Pick - & { resultSet?: Maybe<( - Pick - & { columns?: Maybe>>> } - )>; } - )>; } - )>; error?: Maybe>; } + Pick + & { error?: Maybe> } ); }; -export type AsyncTaskStatusMutationVariables = Exact<{ - taskId: Scalars['String']; +export type GetSqlExecuteTaskResultsMutationVariables = Exact<{ + taskId: Scalars['ID']; }>; -export type AsyncTaskStatusMutation = { taskInfo: ( - Pick - & { result?: Maybe<( - Pick - & { results: Array<( - Pick - & { resultSet?: Maybe<( - Pick - & { columns?: Maybe>>> } - )>; } - )>; } - )>; error?: Maybe>; } - ); }; - -export type ExecuteSqlQueryMutationVariables = Exact<{ - connectionId: Scalars['ID']; - contextId: Scalars['ID']; - query: Scalars['String']; - filter?: Maybe; -}>; - -export type ExecuteSqlQueryMutation = { result?: Maybe<( +export type GetSqlExecuteTaskResultsMutation = { result: ( Pick & { results: Array<( Pick @@ -1016,7 +987,7 @@ export type ExecuteSqlQueryMutation = { result?: Maybe<( & { columns?: Maybe>>> } )>; } )>; } - )>; }; + ); }; export type ReadDataFromContainerMutationVariables = Exact<{ connectionId: Scalars['ID']; @@ -1492,22 +1463,6 @@ export const TestConnectionDocument = ` } } `; -export const AsyncExportTaskStatusDocument = ` - mutation asyncExportTaskStatus($taskId: String!) { - taskInfo: asyncTaskStatus(id: $taskId) { - id - name - running - status - error { - message - errorCode - stackTrace - } - taskResult - } -} - `; export const ExportDataFromContainerDocument = ` query exportDataFromContainer($connectionId: ID!, $containerNodePath: ID!, $parameters: DataTransferParameters!) { taskInfo: dataTransferExportDataFromContainer(connectionId: $connectionId, containerNodePath: $containerNodePath, parameters: $parameters) { @@ -1585,87 +1540,41 @@ export const NavGetStructContainersDocument = ` } } `; +export const GetAsyncTaskInfoDocument = ` + mutation getAsyncTaskInfo($taskId: String!, $removeOnFinish: Boolean!) { + taskInfo: asyncTaskInfo(id: $taskId, removeOnFinish: $removeOnFinish) { + id + name + running + status + error { + message + errorCode + stackTrace + } + taskResult + } +} + `; export const AsyncSqlExecuteQueryDocument = ` mutation asyncSqlExecuteQuery($connectionId: ID!, $contextId: ID!, $query: String!, $filter: SQLDataFilter) { taskInfo: asyncSqlExecuteQuery(connectionId: $connectionId, contextId: $contextId, sql: $query, filter: $filter) { id + name running - result { - duration - statusMessage - results { - updateRowCount - sourceQuery - title - resultSet { - id - columns { - dataKind - entityName - fullTypeName - icon - label - maxLength - name - position - precision - scale - typeName - } - rows - } - } - } + status error { message errorCode stackTrace } + taskResult } } `; -export const AsyncTaskStatusDocument = ` - mutation asyncTaskStatus($taskId: String!) { - taskInfo: asyncTaskStatus(id: $taskId) { - id - running - result { - duration - statusMessage - results { - updateRowCount - sourceQuery - title - resultSet { - id - columns { - dataKind - entityName - fullTypeName - icon - label - maxLength - name - position - precision - scale - typeName - } - rows - } - } - } - error { - message - errorCode - stackTrace - } - } -} - `; -export const ExecuteSqlQueryDocument = ` - mutation executeSqlQuery($connectionId: ID!, $contextId: ID!, $query: String!, $filter: SQLDataFilter) { - result: sqlExecuteQuery(connectionId: $connectionId, contextId: $contextId, sql: $query, filter: $filter) { +export const GetSqlExecuteTaskResultsDocument = ` + mutation getSqlExecuteTaskResults($taskId: ID!) { + result: asyncSqlExecuteResults(taskId: $taskId) { duration statusMessage results { @@ -2078,9 +1987,6 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = testConnection(variables: TestConnectionMutationVariables): Promise { return withWrapper(() => client.request(TestConnectionDocument, variables)); }, - asyncExportTaskStatus(variables: AsyncExportTaskStatusMutationVariables): Promise { - return withWrapper(() => client.request(AsyncExportTaskStatusDocument, variables)); - }, exportDataFromContainer(variables: ExportDataFromContainerQueryVariables): Promise { return withWrapper(() => client.request(ExportDataFromContainerDocument, variables)); }, @@ -2096,14 +2002,14 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = navGetStructContainers(variables: NavGetStructContainersQueryVariables): Promise { return withWrapper(() => client.request(NavGetStructContainersDocument, variables)); }, + getAsyncTaskInfo(variables: GetAsyncTaskInfoMutationVariables): Promise { + return withWrapper(() => client.request(GetAsyncTaskInfoDocument, variables)); + }, asyncSqlExecuteQuery(variables: AsyncSqlExecuteQueryMutationVariables): Promise { return withWrapper(() => client.request(AsyncSqlExecuteQueryDocument, variables)); }, - asyncTaskStatus(variables: AsyncTaskStatusMutationVariables): Promise { - return withWrapper(() => client.request(AsyncTaskStatusDocument, variables)); - }, - executeSqlQuery(variables: ExecuteSqlQueryMutationVariables): Promise { - return withWrapper(() => client.request(ExecuteSqlQueryDocument, variables)); + getSqlExecuteTaskResults(variables: GetSqlExecuteTaskResultsMutationVariables): Promise { + return withWrapper(() => client.request(GetSqlExecuteTaskResultsDocument, variables)); }, readDataFromContainer(variables: ReadDataFromContainerMutationVariables): Promise { return withWrapper(() => client.request(ReadDataFromContainerDocument, variables)); diff --git a/webapp/packages/plugin-data-export/src/ExportFromContainerProcess.ts b/webapp/packages/plugin-data-export/src/ExportFromContainerProcess.ts index ed13359336..22ab723a15 100644 --- a/webapp/packages/plugin-data-export/src/ExportFromContainerProcess.ts +++ b/webapp/packages/plugin-data-export/src/ExportFromContainerProcess.ts @@ -40,7 +40,7 @@ export class ExportFromContainerProcess extends Deferred { containerNodePath, parameters, }); - this.applyResult(taskInfo); + await this.applyResult(taskInfo); this.taskId = taskInfo.id; if (this.getState() === EDeferredState.CANCELLING) { await this.cancelAsync(this.taskId); @@ -80,8 +80,11 @@ export class ExportFromContainerProcess extends Deferred { } // run the first check immediately because usually the query execution is fast try { - const { taskInfo } = await this.graphQLService.gql.asyncExportTaskStatus({ taskId: this.taskId }); - this.applyResult(taskInfo); + const { taskInfo } = await this.graphQLService.gql.getAsyncTaskInfo({ + taskId: this.taskId, + removeOnFinish: false, + }); + await this.applyResult(taskInfo); if (this.isFinished) { return; } @@ -111,7 +114,7 @@ export class ExportFromContainerProcess extends Deferred { } } - private applyResult(taskInfo: AsyncTaskInfo): void { + private async applyResult(taskInfo: AsyncTaskInfo) { // task is running if (taskInfo.running) { return; @@ -128,6 +131,7 @@ export class ExportFromContainerProcess extends Deferred { } // task execution successful this.toResolved(taskInfo.taskResult); + await this.graphQLService.gql.getAsyncTaskInfo({ taskId: taskInfo.id, removeOnFinish: true }); } private onError(error: Error, status?: string) { diff --git a/webapp/packages/plugin-data-export/src/ExportFromResultsProcess.ts b/webapp/packages/plugin-data-export/src/ExportFromResultsProcess.ts index aa83a4989e..3d202d56d8 100644 --- a/webapp/packages/plugin-data-export/src/ExportFromResultsProcess.ts +++ b/webapp/packages/plugin-data-export/src/ExportFromResultsProcess.ts @@ -42,7 +42,7 @@ export class ExportFromResultsProcess extends Deferred { resultsId, parameters, }); - this.applyResult(taskInfo); + await this.applyResult(taskInfo); this.taskId = taskInfo.id; if (this.getState() === EDeferredState.CANCELLING) { await this.cancelAsync(this.taskId); @@ -82,8 +82,11 @@ export class ExportFromResultsProcess extends Deferred { } // run the first check immediately because usually the query execution is fast try { - const { taskInfo } = await this.graphQLService.gql.asyncExportTaskStatus({ taskId: this.taskId }); - this.applyResult(taskInfo); + const { taskInfo } = await this.graphQLService.gql.getAsyncTaskInfo({ + taskId: this.taskId, + removeOnFinish: false, + }); + await this.applyResult(taskInfo); if (this.isFinished) { return; } @@ -113,7 +116,7 @@ export class ExportFromResultsProcess extends Deferred { } } - private applyResult(taskInfo: AsyncTaskInfo): void { + private async applyResult(taskInfo: AsyncTaskInfo) { // task is running if (taskInfo.running) { return; @@ -130,6 +133,7 @@ export class ExportFromResultsProcess extends Deferred { } // task execution successful this.toResolved(taskInfo.taskResult); + await this.graphQLService.gql.getAsyncTaskInfo({ taskId: taskInfo.id, removeOnFinish: true }); } private onError(error: Error, status?: string) { diff --git a/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts b/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts index 6d6843ff7b..34c218ebe7 100644 --- a/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts +++ b/webapp/packages/plugin-sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts @@ -38,7 +38,7 @@ export class SQLQueryExecutionProcess extends Deferred { // start async task try { const taskInfo = await this.executeQueryAsync(sqlQueryParams, filter); - this.applyResult(taskInfo); + await this.applyResult(taskInfo); this.taskId = taskInfo.id; if (this.getState() === EDeferredState.CANCELLING) { await this.cancelAsync(this.taskId); @@ -60,7 +60,7 @@ export class SQLQueryExecutionProcess extends Deferred { // run the first check immediately because usually the query execution is fast try { const taskInfo = await this.getQueryStatusAsync(this.taskId); - this.applyResult(taskInfo); + await this.applyResult(taskInfo); if (this.isFinished) { return; } @@ -119,7 +119,7 @@ export class SQLQueryExecutionProcess extends Deferred { } private async getQueryStatusAsync(taskId: string): Promise { - const { taskInfo } = await this.graphQLService.gql.asyncTaskStatus({ taskId }); + const { taskInfo } = await this.graphQLService.gql.getAsyncTaskInfo({ taskId, removeOnFinish: false }); return taskInfo; } @@ -127,7 +127,7 @@ export class SQLQueryExecutionProcess extends Deferred { await this.graphQLService.gql.asyncTaskCancel({ taskId }); } - private applyResult(taskInfo: AsyncTaskInfo): void { + private async applyResult(taskInfo: AsyncTaskInfo) { // task is running if (taskInfo.running) { return; @@ -138,12 +138,14 @@ export class SQLQueryExecutionProcess extends Deferred { this.onError(serverError, taskInfo.status); return; } - if (!taskInfo.result) { - this.onError(new Error('Tasks execution returns no result'), taskInfo.status); - return; - } + try { // task execution successful - this.toResolved(taskInfo.result); + const { result } = await this.graphQLService.gql.getSqlExecuteTaskResults({ taskId: taskInfo.id }); + this.toResolved(result); + await this.graphQLService.gql.getAsyncTaskInfo({ taskId: taskInfo.id, removeOnFinish: true }); + } catch (exception) { + this.onError(new Error('Tasks execution returns no result'), exception); + } } private onError(error: Error, status?: string) {