From 3cfdc38f160b444c82a148b79d8dabde41f8ea5c Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Tue, 1 Aug 2023 18:26:30 +0800 Subject: [PATCH 01/28] feat: update public workspace Signed-off-by: SuZhou-Joe --- src/core/public/saved_objects/saved_objects_client.ts | 3 ++- src/core/public/utils/index.ts | 2 +- .../saved_objects/service/lib/search_dsl/query_params.ts | 3 ++- .../saved_objects/workspace_saved_objects_client_wrapper.ts | 4 ++-- src/core/utils/constants.ts | 2 ++ src/core/utils/index.ts | 2 +- .../management_section/objects_table/saved_objects_table.tsx | 3 ++- .../workspace/public/components/utils/workspace_column.tsx | 3 ++- 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts index 356e555cfc53..8c5878c469fc 100644 --- a/src/core/public/saved_objects/saved_objects_client.ts +++ b/src/core/public/saved_objects/saved_objects_client.ts @@ -42,6 +42,7 @@ import { import { SimpleSavedObject } from './simple_saved_object'; import { HttpFetchOptions, HttpSetup } from '../http'; +import { PUBLIC_WORKSPACE } from '../../utils'; type SavedObjectsFindOptions = Omit< SavedObjectFindOptionsServer, @@ -368,7 +369,7 @@ export class SavedObjectsClient { const workspaces = [ ...(options.workspaces || [await this._getCurrentWorkspace()]), - 'public', + PUBLIC_WORKSPACE, ].filter((item) => item); const renamedQuery = renameKeys(renameMap, { diff --git a/src/core/public/utils/index.ts b/src/core/public/utils/index.ts index ad363c53bd42..a6d76a87e313 100644 --- a/src/core/public/utils/index.ts +++ b/src/core/public/utils/index.ts @@ -32,4 +32,4 @@ export { shareWeakReplay } from './share_weak_replay'; export { Sha256 } from './crypto'; export { MountWrapper, mountReactNode } from './mount'; export { getWorkspaceIdFromUrl, WORKSPACE_TYPE } from './workspace'; -export { WORKSPACE_PATH_PREFIX } from '../../utils'; +export { WORKSPACE_PATH_PREFIX, PUBLIC_WORKSPACE } from '../../utils'; diff --git a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts index 4ddbe992bcfc..c30b1001d99f 100644 --- a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts +++ b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts @@ -34,6 +34,7 @@ type KueryNode = any; import { ISavedObjectTypeRegistry } from '../../../saved_objects_type_registry'; import { ALL_NAMESPACES_STRING, DEFAULT_NAMESPACE_STRING } from '../utils'; +import { PUBLIC_WORKSPACE } from '../../../../../utils'; /** * Gets the types based on the type. Uses mappings to support @@ -142,7 +143,7 @@ function getClauseForWorkspace(workspace: string) { }; } - if (workspace === 'public') { + if (workspace === PUBLIC_WORKSPACE) { return { bool: { must_not: [{ exists: { field: 'workspaces' } }], diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index 0a028b7e356e..9eca07bd7f49 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -22,7 +22,7 @@ import { } from 'opensearch-dashboards/server'; import { SavedObjectsPermissionControlContract } from '../../saved_objects/permission_control/client'; import { WORKSPACE_TYPE } from '../constants'; -import { PermissionMode } from '../../../utils'; +import { PUBLIC_WORKSPACE, PermissionMode } from '../../../utils'; import { ACL } from '../../saved_objects/permission_control/acl'; // Can't throw unauthorized for now, the page will be refreshed if unauthorized @@ -215,7 +215,7 @@ export class WorkspaceSavedObjectsClientWrapper { if (options.workspaces) { const isEveryWorkspaceIsPermitted = options.workspaces.every((item) => // TODO modify this line to use permittedWorkspaceIds if public workspace is also a workspace - ['public', ...(permittedWorkspaceIds || [])]?.includes(item) + [PUBLIC_WORKSPACE, ...(permittedWorkspaceIds || [])]?.includes(item) ); if (!isEveryWorkspaceIsPermitted) { throw generateWorkspacePermissionError(); diff --git a/src/core/utils/constants.ts b/src/core/utils/constants.ts index a58af8947131..85ef17472f09 100644 --- a/src/core/utils/constants.ts +++ b/src/core/utils/constants.ts @@ -17,3 +17,5 @@ export enum PrincipalType { Users = 'users', Groups = 'groups', } + +export const PUBLIC_WORKSPACE = 'public'; diff --git a/src/core/utils/index.ts b/src/core/utils/index.ts index 9f19132ea8bc..53271eafa974 100644 --- a/src/core/utils/index.ts +++ b/src/core/utils/index.ts @@ -37,4 +37,4 @@ export { IContextProvider, } from './context'; export { DEFAULT_APP_CATEGORIES } from './default_app_categories'; -export { WORKSPACE_PATH_PREFIX, PermissionMode } from './constants'; +export { WORKSPACE_PATH_PREFIX, PermissionMode, PUBLIC_WORKSPACE } from './constants'; diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx index ca0aad55a0cb..7814ffb9090e 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx @@ -94,6 +94,7 @@ import { import { Header, Table, Flyout, Relationships } from './components'; import { DataPublicPluginStart } from '../../../../../plugins/data/public'; import { SavedObjectsCopyModal } from './components/copy_modal'; +import { PUBLIC_WORKSPACE } from '../../../../../core/public/utils'; interface ExportAllOption { id: string; @@ -179,7 +180,7 @@ export class SavedObjectsTable extends Component{publicWsName}; } From 8f3b29fa44586c4ec9dfd8d7d222e8f9b5df8195 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 2 Aug 2023 18:50:19 +0800 Subject: [PATCH 02/28] refractor: change public objects logic Signed-off-by: SuZhou-Joe --- .../saved_objects/saved_objects_client.ts | 45 ++++++++++++++----- .../service/lib/search_dsl/query_params.ts | 9 ---- .../objects_table/saved_objects_table.tsx | 4 +- .../components/utils/workspace_column.tsx | 2 +- src/plugins/workspace/public/plugin.ts | 2 +- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts index 8c5878c469fc..d77abdfad21d 100644 --- a/src/core/public/saved_objects/saved_objects_client.ts +++ b/src/core/public/saved_objects/saved_objects_client.ts @@ -185,7 +185,11 @@ const getObjectsToFetch = (queue: BatchQueueEntry[]): ObjectTypeAndId[] => { export class SavedObjectsClient { private http: HttpSetup; private batchQueue: BatchQueueEntry[]; - private currentWorkspaceId?: string; + /** + * if currentWorkspaceId is undefined, it means + * we should not carry out workspace info when doing any operation. + */ + private currentWorkspaceId: string | undefined; /** * Throttled processing of get requests into bulk requests at 100ms interval @@ -230,11 +234,11 @@ export class SavedObjectsClient { this.batchQueue = []; } - private async _getCurrentWorkspace(): Promise { - return this.currentWorkspaceId || null; + private _getCurrentWorkspace(): string | undefined { + return this.currentWorkspaceId; } - public async setCurrentWorkspace(workspaceId: string): Promise { + public setCurrentWorkspace(workspaceId: string): boolean { this.currentWorkspaceId = workspaceId; return true; } @@ -260,7 +264,17 @@ export class SavedObjectsClient { const query = { overwrite: options.overwrite, }; - const currentWorkspaceId = await this._getCurrentWorkspace(); + const currentWorkspaceId = this._getCurrentWorkspace(); + let finalWorkspaces; + if (options.workspaces) { + finalWorkspaces = options.workspaces; + } else if (typeof currentWorkspaceId === 'string') { + /** + * When the currentWorkspaceId is an empty string instead of undefined + * It means user is creating object in public workspace. + */ + finalWorkspaces = currentWorkspaceId ? [currentWorkspaceId] : [PUBLIC_WORKSPACE]; + } const createRequest: Promise> = this.savedObjectsFetch(path, { method: 'POST', @@ -269,9 +283,9 @@ export class SavedObjectsClient { attributes, migrationVersion: options.migrationVersion, references: options.references, - ...(options.workspaces || currentWorkspaceId + ...(finalWorkspaces ? { - workspaces: options.workspaces || [currentWorkspaceId], + workspaces: finalWorkspaces, } : {}), }), @@ -367,14 +381,21 @@ export class SavedObjectsClient { queryDSL: 'queryDSL', }; - const workspaces = [ - ...(options.workspaces || [await this._getCurrentWorkspace()]), - PUBLIC_WORKSPACE, - ].filter((item) => item); + const currentWorkspaceId = this._getCurrentWorkspace(); + let finalWorkspaces; + if (options.workspaces) { + finalWorkspaces = options.workspaces; + } else if (typeof currentWorkspaceId === 'string') { + finalWorkspaces = currentWorkspaceId ? [PUBLIC_WORKSPACE, currentWorkspaceId] : undefined; + } const renamedQuery = renameKeys(renameMap, { ...options, - workspaces, + ...(finalWorkspaces + ? { + workspaces: finalWorkspaces, + } + : {}), }); const query = pick.apply(null, [renamedQuery, ...Object.values(renameMap)]) as Partial< Record diff --git a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts index c30b1001d99f..d9fbf7199c18 100644 --- a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts +++ b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts @@ -34,7 +34,6 @@ type KueryNode = any; import { ISavedObjectTypeRegistry } from '../../../saved_objects_type_registry'; import { ALL_NAMESPACES_STRING, DEFAULT_NAMESPACE_STRING } from '../utils'; -import { PUBLIC_WORKSPACE } from '../../../../../utils'; /** * Gets the types based on the type. Uses mappings to support @@ -143,14 +142,6 @@ function getClauseForWorkspace(workspace: string) { }; } - if (workspace === PUBLIC_WORKSPACE) { - return { - bool: { - must_not: [{ exists: { field: 'workspaces' } }], - }, - }; - } - return { bool: { must: [{ term: { workspaces: workspace } }], diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx index 7814ffb9090e..b82fede2498e 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx @@ -180,7 +180,9 @@ export class SavedObjectsTable extends Component{publicWsName}; } diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index 2d6da177165e..9e5ca205b0ea 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -194,7 +194,7 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep if (this.coreStart) { return this.coreStart.workspaces.client.currentWorkspaceId$.subscribe( (currentWorkspaceId) => { - this.coreStart?.savedObjects.client.setCurrentWorkspace(currentWorkspaceId); + this.coreStart?.savedObjects.client.setCurrentWorkspace(currentWorkspaceId || ''); } ); } From e09a8870369a9008f1e06423c4d0637b4d747e78 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Thu, 3 Aug 2023 13:21:48 +0800 Subject: [PATCH 03/28] feat: create public workspace when service start Signed-off-by: SuZhou-Joe --- src/core/server/server.ts | 4 +- .../server/workspaces/workspaces_service.ts | 39 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/core/server/server.ts b/src/core/server/server.ts index a3a7678ae21e..afdbdc7b4846 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -262,7 +262,9 @@ export class Server { opensearch: opensearchStart, savedObjects: savedObjectsStart, }); - await this.workspaces.start(); + await this.workspaces.start({ + savedObjects: savedObjectsStart, + }); this.coreStart = { capabilities: capabilitiesStart, diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index ba79ead6097d..4c19e4550c08 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -8,12 +8,14 @@ import { CoreContext } from '../core_context'; import { InternalHttpServiceSetup } from '../http'; import { Logger } from '../logging'; import { registerRoutes } from './routes'; -import { InternalSavedObjectsServiceSetup } from '../saved_objects'; -import { IWorkspaceDBImpl } from './types'; +import { InternalSavedObjectsServiceSetup, SavedObjectsServiceStart } from '../saved_objects'; +import { IWorkspaceDBImpl, WorkspaceAttribute } from './types'; import { WorkspacesClientWithSavedObject } from './workspaces_client'; import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; import { InternalUiSettingsServiceSetup } from '../ui_settings'; import { uiSettings } from './ui_settings'; +import { WORKSPACE_TYPE } from './constants'; +import { PUBLIC_WORKSPACE } from '../../utils'; export interface WorkspacesServiceSetup { client: IWorkspaceDBImpl; @@ -29,6 +31,10 @@ export interface WorkspacesSetupDeps { uiSettings: InternalUiSettingsServiceSetup; } +export interface WorkpsaceStartDeps { + savedObjects: SavedObjectsServiceStart; +} + export type InternalWorkspacesServiceSetup = WorkspacesServiceSetup; export type InternalWorkspacesServiceStart = WorkspacesServiceStart; @@ -89,8 +95,35 @@ export class WorkspacesService }; } - public async start(): Promise { + public async start(startDeps: WorkpsaceStartDeps): Promise { this.logger.debug('Starting SavedObjects service'); + /** + * Internal repository is attached to global tenant. + */ + const internalRepository = startDeps.savedObjects.createInternalRepository(); + + try { + await internalRepository.get(WORKSPACE_TYPE, PUBLIC_WORKSPACE); + } catch (error) { + this.logger.debug(error?.toString() || ''); + this.logger.info('No public workspace found, create it by using internal user'); + try { + const createResult = await internalRepository.create( + WORKSPACE_TYPE, + { + name: 'public', + } as Omit, + { + id: PUBLIC_WORKSPACE, + } + ); + if (createResult.id) { + this.logger.info(`Created workspace ${createResult.id} in global tenant.`); + } + } catch (e) { + this.logger.error(`Create public workspace error: ${e?.toString() || ''}`); + } + } return { client: this.client as IWorkspaceDBImpl, From 93885d80ce9c1c76d973e9f9f7a8d6896357b7e7 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Thu, 3 Aug 2023 15:16:49 +0800 Subject: [PATCH 04/28] feat: some modify Signed-off-by: SuZhou-Joe --- .../public/saved_objects/saved_objects_client.ts | 2 +- src/plugins/workspace/public/plugin.ts | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts index d77abdfad21d..45d8d5402b8f 100644 --- a/src/core/public/saved_objects/saved_objects_client.ts +++ b/src/core/public/saved_objects/saved_objects_client.ts @@ -273,7 +273,7 @@ export class SavedObjectsClient { * When the currentWorkspaceId is an empty string instead of undefined * It means user is creating object in public workspace. */ - finalWorkspaces = currentWorkspaceId ? [currentWorkspaceId] : [PUBLIC_WORKSPACE]; + finalWorkspaces = [currentWorkspaceId]; } const createRequest: Promise> = this.savedObjectsFetch(path, { diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index 9e5ca205b0ea..dd814a7e3c76 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -29,7 +29,11 @@ import { import { mountDropdownList } from './mount'; import { SavedObjectsManagementPluginSetup } from '../../saved_objects_management/public'; import { getWorkspaceColumn } from './components/utils/workspace_column'; -import { getWorkspaceIdFromUrl, WORKSPACE_PATH_PREFIX } from '../../../core/public/utils'; +import { + getWorkspaceIdFromUrl, + PUBLIC_WORKSPACE, + WORKSPACE_PATH_PREFIX, +} from '../../../core/public/utils'; interface WorkspacesPluginSetupDeps { savedObjectsManagement?: SavedObjectsManagementPluginSetup; @@ -73,7 +77,7 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep /** * Retrieve workspace id from url */ - const workspaceId = this.getWorkspaceIdFromURL(); + const workspaceId = this.getWorkspaceIdFromURL() || PUBLIC_WORKSPACE; if (workspaceId) { const result = await core.workspaces.client.enterWorkspace(workspaceId); @@ -194,7 +198,9 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep if (this.coreStart) { return this.coreStart.workspaces.client.currentWorkspaceId$.subscribe( (currentWorkspaceId) => { - this.coreStart?.savedObjects.client.setCurrentWorkspace(currentWorkspaceId || ''); + this.coreStart?.savedObjects.client.setCurrentWorkspace( + currentWorkspaceId || PUBLIC_WORKSPACE + ); } ); } From e20d6eae8e7b5ac381c6314c461866ba6c47ffc1 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Thu, 3 Aug 2023 15:53:35 +0800 Subject: [PATCH 05/28] feature: some optimize and create workspace when ui settings is open Signed-off-by: SuZhou-Joe --- src/core/public/utils/index.ts | 6 +- src/core/server/server.ts | 1 + .../server/ui_settings/settings/workspace.ts | 26 +++++++ .../server/workspaces/workspaces_service.ts | 69 ++++++++++++++----- src/core/utils/constants.ts | 4 ++ src/core/utils/index.ts | 8 ++- src/plugins/workspace/public/plugin.ts | 5 +- 7 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 src/core/server/ui_settings/settings/workspace.ts diff --git a/src/core/public/utils/index.ts b/src/core/public/utils/index.ts index a6d76a87e313..4f958a60ae66 100644 --- a/src/core/public/utils/index.ts +++ b/src/core/public/utils/index.ts @@ -32,4 +32,8 @@ export { shareWeakReplay } from './share_weak_replay'; export { Sha256 } from './crypto'; export { MountWrapper, mountReactNode } from './mount'; export { getWorkspaceIdFromUrl, WORKSPACE_TYPE } from './workspace'; -export { WORKSPACE_PATH_PREFIX, PUBLIC_WORKSPACE } from '../../utils'; +export { + WORKSPACE_PATH_PREFIX, + PUBLIC_WORKSPACE, + WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS, +} from '../../utils'; diff --git a/src/core/server/server.ts b/src/core/server/server.ts index afdbdc7b4846..ea38063d510f 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -264,6 +264,7 @@ export class Server { }); await this.workspaces.start({ savedObjects: savedObjectsStart, + uiSettings: uiSettingsStart, }); this.coreStart = { diff --git a/src/core/server/ui_settings/settings/workspace.ts b/src/core/server/ui_settings/settings/workspace.ts new file mode 100644 index 000000000000..f8ee24491c9d --- /dev/null +++ b/src/core/server/ui_settings/settings/workspace.ts @@ -0,0 +1,26 @@ +/* + * Copyright OpenSearch Contributors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { schema } from '@osd/config-schema'; +import { i18n } from '@osd/i18n'; +import { UiSettingsParams } from '../../../types'; +import { WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS } from '../../../utils'; + +export const getWorkspaceSettings = (): Record => { + return { + [WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS]: { + name: i18n.translate('core.ui_settings.params.workspace.enableWorkspaceTitle', { + defaultMessage: 'Enable Workspace', + }), + value: false, + requiresPageReload: true, + description: i18n.translate('core.ui_settings.params.workspace.enableWorkspaceTitle', { + defaultMessage: 'Enable or disable OpenSearch Dashboards Workspace', + }), + category: ['workspace'], + schema: schema.boolean(), + }, + }; +}; diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index 4c19e4550c08..a453bb45d4bf 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -8,14 +8,24 @@ import { CoreContext } from '../core_context'; import { InternalHttpServiceSetup } from '../http'; import { Logger } from '../logging'; import { registerRoutes } from './routes'; -import { InternalSavedObjectsServiceSetup, SavedObjectsServiceStart } from '../saved_objects'; +import { + ISavedObjectsRepository, + InternalSavedObjectsServiceSetup, + SavedObjectsClient, + SavedObjectsServiceStart, +} from '../saved_objects'; import { IWorkspaceDBImpl, WorkspaceAttribute } from './types'; import { WorkspacesClientWithSavedObject } from './workspaces_client'; import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; import { InternalUiSettingsServiceSetup } from '../ui_settings'; import { uiSettings } from './ui_settings'; import { WORKSPACE_TYPE } from './constants'; -import { PUBLIC_WORKSPACE } from '../../utils'; +import { + MANAGEMENT_WORKSPACE, + PUBLIC_WORKSPACE, + WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS, +} from '../../utils'; +import { UiSettingsServiceStart } from '../ui_settings'; export interface WorkspacesServiceSetup { client: IWorkspaceDBImpl; @@ -33,6 +43,7 @@ export interface WorkspacesSetupDeps { export interface WorkpsaceStartDeps { savedObjects: SavedObjectsServiceStart; + uiSettings: UiSettingsServiceStart; } export type InternalWorkspacesServiceSetup = WorkspacesServiceSetup; @@ -95,35 +106,57 @@ export class WorkspacesService }; } - public async start(startDeps: WorkpsaceStartDeps): Promise { - this.logger.debug('Starting SavedObjects service'); + private async checkAndCreateWorkspace( + internalRepository: ISavedObjectsRepository, + workspaceId: string, + workspaceAttribute: Omit + ) { /** * Internal repository is attached to global tenant. */ - const internalRepository = startDeps.savedObjects.createInternalRepository(); - try { - await internalRepository.get(WORKSPACE_TYPE, PUBLIC_WORKSPACE); + await internalRepository.get(WORKSPACE_TYPE, workspaceId); } catch (error) { this.logger.debug(error?.toString() || ''); - this.logger.info('No public workspace found, create it by using internal user'); + this.logger.info(`Workspace ${workspaceId} is not found, create it by using internal user`); try { - const createResult = await internalRepository.create( - WORKSPACE_TYPE, - { - name: 'public', - } as Omit, - { - id: PUBLIC_WORKSPACE, - } - ); + const createResult = await internalRepository.create(WORKSPACE_TYPE, workspaceAttribute, { + id: workspaceId, + }); if (createResult.id) { this.logger.info(`Created workspace ${createResult.id} in global tenant.`); } } catch (e) { - this.logger.error(`Create public workspace error: ${e?.toString() || ''}`); + this.logger.error(`Create ${workspaceId} workspace error: ${e?.toString() || ''}`); } } + } + + private async listenToUISettingsChange(startDeps: WorkpsaceStartDeps) { + const internalRepository = startDeps.savedObjects.createInternalRepository(); + const internalSavedObjectsClient = new SavedObjectsClient(internalRepository); + const uiSettingsClient = startDeps.uiSettings.asScopedToClient(internalSavedObjectsClient); + const featureFlag = await uiSettingsClient.get(WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS); + + if (featureFlag) { + this.logger.debug( + 'Workspace feature flag is open, start to check if we need to create inherent workspaces' + ); + await Promise.all([ + this.checkAndCreateWorkspace(internalRepository, PUBLIC_WORKSPACE, { + name: 'public', + }), + this.checkAndCreateWorkspace(internalRepository, MANAGEMENT_WORKSPACE, { + name: 'Management', + }), + ]); + } + } + + public async start(startDeps: WorkpsaceStartDeps): Promise { + this.logger.debug('Starting SavedObjects service'); + + this.listenToUISettingsChange(startDeps); return { client: this.client as IWorkspaceDBImpl, diff --git a/src/core/utils/constants.ts b/src/core/utils/constants.ts index 85ef17472f09..5ebf5c0af141 100644 --- a/src/core/utils/constants.ts +++ b/src/core/utils/constants.ts @@ -19,3 +19,7 @@ export enum PrincipalType { } export const PUBLIC_WORKSPACE = 'public'; + +export const MANAGEMENT_WORKSPACE = 'management'; + +export const WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS = 'workspace:enabled'; diff --git a/src/core/utils/index.ts b/src/core/utils/index.ts index 53271eafa974..4118a850c828 100644 --- a/src/core/utils/index.ts +++ b/src/core/utils/index.ts @@ -37,4 +37,10 @@ export { IContextProvider, } from './context'; export { DEFAULT_APP_CATEGORIES } from './default_app_categories'; -export { WORKSPACE_PATH_PREFIX, PermissionMode, PUBLIC_WORKSPACE } from './constants'; +export { + WORKSPACE_PATH_PREFIX, + PermissionMode, + PUBLIC_WORKSPACE, + WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS, + MANAGEMENT_WORKSPACE, +} from './constants'; diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index dd814a7e3c76..b4ff4ca01b14 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -34,6 +34,7 @@ import { PUBLIC_WORKSPACE, WORKSPACE_PATH_PREFIX, } from '../../../core/public/utils'; +import { WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS } from '../../../core/public/utils'; interface WorkspacesPluginSetupDeps { savedObjectsManagement?: SavedObjectsManagementPluginSetup; @@ -67,7 +68,7 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep }; public async setup(core: CoreSetup, { savedObjectsManagement }: WorkspacesPluginSetupDeps) { // If workspace feature is disabled, it will not load the workspace plugin - if (core.uiSettings.get('workspace:enabled') === false) { + if (core.uiSettings.get(WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS) === false) { return {}; } @@ -268,7 +269,7 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep public start(core: CoreStart) { // If workspace feature is disabled, it will not load the workspace plugin - if (core.uiSettings.get('workspace:enabled') === false) { + if (core.uiSettings.get(WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS) === false) { return {}; } From f1c4ed57b3bb1a8258890b4e24ef499666e4509d Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Thu, 3 Aug 2023 16:02:13 +0800 Subject: [PATCH 06/28] feat: update Signed-off-by: SuZhou-Joe --- .../server/workspaces/workspaces_service.ts | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index a453bb45d4bf..15885e4d46f5 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -11,7 +11,6 @@ import { registerRoutes } from './routes'; import { ISavedObjectsRepository, InternalSavedObjectsServiceSetup, - SavedObjectsClient, SavedObjectsServiceStart, } from '../saved_objects'; import { IWorkspaceDBImpl, WorkspaceAttribute } from './types'; @@ -20,11 +19,7 @@ import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; import { InternalUiSettingsServiceSetup } from '../ui_settings'; import { uiSettings } from './ui_settings'; import { WORKSPACE_TYPE } from './constants'; -import { - MANAGEMENT_WORKSPACE, - PUBLIC_WORKSPACE, - WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS, -} from '../../utils'; +import { MANAGEMENT_WORKSPACE, PUBLIC_WORKSPACE } from '../../utils'; import { UiSettingsServiceStart } from '../ui_settings'; export interface WorkspacesServiceSetup { @@ -132,31 +127,23 @@ export class WorkspacesService } } - private async listenToUISettingsChange(startDeps: WorkpsaceStartDeps) { + private async setupWorkspaces(startDeps: WorkpsaceStartDeps) { const internalRepository = startDeps.savedObjects.createInternalRepository(); - const internalSavedObjectsClient = new SavedObjectsClient(internalRepository); - const uiSettingsClient = startDeps.uiSettings.asScopedToClient(internalSavedObjectsClient); - const featureFlag = await uiSettingsClient.get(WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS); - - if (featureFlag) { - this.logger.debug( - 'Workspace feature flag is open, start to check if we need to create inherent workspaces' - ); - await Promise.all([ - this.checkAndCreateWorkspace(internalRepository, PUBLIC_WORKSPACE, { - name: 'public', - }), - this.checkAndCreateWorkspace(internalRepository, MANAGEMENT_WORKSPACE, { - name: 'Management', - }), - ]); - } + + await Promise.all([ + this.checkAndCreateWorkspace(internalRepository, PUBLIC_WORKSPACE, { + name: 'public', + }), + this.checkAndCreateWorkspace(internalRepository, MANAGEMENT_WORKSPACE, { + name: 'Management', + }), + ]); } public async start(startDeps: WorkpsaceStartDeps): Promise { this.logger.debug('Starting SavedObjects service'); - this.listenToUISettingsChange(startDeps); + this.setupWorkspaces(startDeps); return { client: this.client as IWorkspaceDBImpl, From e9bf3053c75f38e1d8e7825263610712711d0a77 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Thu, 3 Aug 2023 16:05:12 +0800 Subject: [PATCH 07/28] feat: update Signed-off-by: SuZhou-Joe --- src/core/server/server.ts | 1 - src/core/server/workspaces/workspaces_service.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/core/server/server.ts b/src/core/server/server.ts index ea38063d510f..afdbdc7b4846 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -264,7 +264,6 @@ export class Server { }); await this.workspaces.start({ savedObjects: savedObjectsStart, - uiSettings: uiSettingsStart, }); this.coreStart = { diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index 15885e4d46f5..ab002b426de0 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -20,7 +20,6 @@ import { InternalUiSettingsServiceSetup } from '../ui_settings'; import { uiSettings } from './ui_settings'; import { WORKSPACE_TYPE } from './constants'; import { MANAGEMENT_WORKSPACE, PUBLIC_WORKSPACE } from '../../utils'; -import { UiSettingsServiceStart } from '../ui_settings'; export interface WorkspacesServiceSetup { client: IWorkspaceDBImpl; @@ -38,7 +37,6 @@ export interface WorkspacesSetupDeps { export interface WorkpsaceStartDeps { savedObjects: SavedObjectsServiceStart; - uiSettings: UiSettingsServiceStart; } export type InternalWorkspacesServiceSetup = WorkspacesServiceSetup; From e9c9a4e07bacc456d3e784357563bd1d87987313 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Thu, 3 Aug 2023 16:08:34 +0800 Subject: [PATCH 08/28] feat: update Signed-off-by: SuZhou-Joe --- .../public/components/utils/workspace_column.tsx | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/plugins/workspace/public/components/utils/workspace_column.tsx b/src/plugins/workspace/public/components/utils/workspace_column.tsx index cd7c8717fd79..819bcd913742 100644 --- a/src/plugins/workspace/public/components/utils/workspace_column.tsx +++ b/src/plugins/workspace/public/components/utils/workspace_column.tsx @@ -27,15 +27,6 @@ function WorkspaceColumn({ coreSetup, workspaces, record }: WorkspaceColumnProps return map.set(ws.id, ws.name); }, new Map()); - const publicWsName = i18n.translate('workspace.public.name', { - defaultMessage: 'public', - }); - wsLookUp?.set('public', publicWsName); - - if (workspaces?.includes(PUBLIC_WORKSPACE)) { - return {publicWsName}; - } - const workspaceNames = workspaces?.map((wsId) => wsLookUp?.get(wsId)).join(' | '); return {workspaceNames}; From 15ff5db4761a260bc0c67d1d461c222f3291c94a Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Thu, 3 Aug 2023 16:09:34 +0800 Subject: [PATCH 09/28] feat: update Signed-off-by: SuZhou-Joe --- .../workspace/public/components/utils/workspace_column.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/workspace/public/components/utils/workspace_column.tsx b/src/plugins/workspace/public/components/utils/workspace_column.tsx index 819bcd913742..9ad78a889bf6 100644 --- a/src/plugins/workspace/public/components/utils/workspace_column.tsx +++ b/src/plugins/workspace/public/components/utils/workspace_column.tsx @@ -12,7 +12,6 @@ import { SavedObjectsManagementColumn, SavedObjectsManagementRecord, } from '../../../../saved_objects_management/public'; -import { PUBLIC_WORKSPACE } from '../../../../../core/public/utils'; interface WorkspaceColumnProps { coreSetup: CoreSetup; From 59c01f9fcfcb64ac1358da969c05e24c3845277c Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Fri, 4 Aug 2023 16:06:50 +0800 Subject: [PATCH 10/28] temp: submit Signed-off-by: SuZhou-Joe --- .../server/workspaces/workspaces_service.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index ab002b426de0..cbeb2619d5d6 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -19,7 +19,8 @@ import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; import { InternalUiSettingsServiceSetup } from '../ui_settings'; import { uiSettings } from './ui_settings'; import { WORKSPACE_TYPE } from './constants'; -import { MANAGEMENT_WORKSPACE, PUBLIC_WORKSPACE } from '../../utils'; +import { MANAGEMENT_WORKSPACE, PUBLIC_WORKSPACE, PermissionMode } from '../../utils'; +import { ACL } from '../saved_objects/permission_control/acl'; export interface WorkspacesServiceSetup { client: IWorkspaceDBImpl; @@ -127,13 +128,29 @@ export class WorkspacesService private async setupWorkspaces(startDeps: WorkpsaceStartDeps) { const internalRepository = startDeps.savedObjects.createInternalRepository(); + const publicWorkspaceACL = new ACL() + .addPermission([PermissionMode.LibraryRead, PermissionMode.LibraryWrite], { + users: ['*'], + }) + .addPermission([PermissionMode.Management], { + groups: ['dashboard_admin'], + }); + const managementWorkspaceACL = new ACL() + .addPermission([PermissionMode.LibraryRead], { + users: ['*'], + }) + .addPermission([PermissionMode.Management], { + groups: ['dashboard_admin'], + }); await Promise.all([ this.checkAndCreateWorkspace(internalRepository, PUBLIC_WORKSPACE, { name: 'public', + permissions: publicWorkspaceACL, }), this.checkAndCreateWorkspace(internalRepository, MANAGEMENT_WORKSPACE, { name: 'Management', + permissions: managementWorkspaceACL, }), ]); } From 6648bd0b653c6433b3eee1eca00007402803db71 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Tue, 8 Aug 2023 10:55:11 +0800 Subject: [PATCH 11/28] feat: update Signed-off-by: SuZhou-Joe --- .../service/saved_objects_client.ts | 1 + .../server/workspaces/workspaces_service.ts | 44 +++++++++++++------ src/core/utils/constants.ts | 2 + src/core/utils/index.ts | 1 + 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/core/server/saved_objects/service/saved_objects_client.ts b/src/core/server/saved_objects/service/saved_objects_client.ts index ff37d3e45537..83d12d9791ed 100644 --- a/src/core/server/saved_objects/service/saved_objects_client.ts +++ b/src/core/server/saved_objects/service/saved_objects_client.ts @@ -41,6 +41,7 @@ import { SavedObjectsFindOptions, } from '../types'; import { SavedObjectsErrorHelpers } from './lib/errors'; +import { Permissions } from '../permission_control/acl'; /** * diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index cbeb2619d5d6..7aa300dc07b8 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -19,8 +19,13 @@ import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; import { InternalUiSettingsServiceSetup } from '../ui_settings'; import { uiSettings } from './ui_settings'; import { WORKSPACE_TYPE } from './constants'; -import { MANAGEMENT_WORKSPACE, PUBLIC_WORKSPACE, PermissionMode } from '../../utils'; -import { ACL } from '../saved_objects/permission_control/acl'; +import { + MANAGEMENT_WORKSPACE, + PUBLIC_WORKSPACE, + PermissionMode, + DASHBOARD_ADMIN_GROUP, +} from '../../utils'; +import { ACL, Permissions } from '../saved_objects/permission_control/acl'; export interface WorkspacesServiceSetup { client: IWorkspaceDBImpl; @@ -103,7 +108,8 @@ export class WorkspacesService private async checkAndCreateWorkspace( internalRepository: ISavedObjectsRepository, workspaceId: string, - workspaceAttribute: Omit + workspaceAttribute: Omit, + permissions?: Permissions ) { /** * Internal repository is attached to global tenant. @@ -116,6 +122,7 @@ export class WorkspacesService try { const createResult = await internalRepository.create(WORKSPACE_TYPE, workspaceAttribute, { id: workspaceId, + permissions, }); if (createResult.id) { this.logger.info(`Created workspace ${createResult.id} in global tenant.`); @@ -127,31 +134,40 @@ export class WorkspacesService } private async setupWorkspaces(startDeps: WorkpsaceStartDeps) { + return; const internalRepository = startDeps.savedObjects.createInternalRepository(); const publicWorkspaceACL = new ACL() .addPermission([PermissionMode.LibraryRead, PermissionMode.LibraryWrite], { users: ['*'], }) .addPermission([PermissionMode.Management], { - groups: ['dashboard_admin'], + groups: [DASHBOARD_ADMIN_GROUP], }); const managementWorkspaceACL = new ACL() .addPermission([PermissionMode.LibraryRead], { users: ['*'], }) - .addPermission([PermissionMode.Management], { - groups: ['dashboard_admin'], + .addPermission([PermissionMode.Management, PermissionMode.LibraryWrite], { + groups: [DASHBOARD_ADMIN_GROUP], }); await Promise.all([ - this.checkAndCreateWorkspace(internalRepository, PUBLIC_WORKSPACE, { - name: 'public', - permissions: publicWorkspaceACL, - }), - this.checkAndCreateWorkspace(internalRepository, MANAGEMENT_WORKSPACE, { - name: 'Management', - permissions: managementWorkspaceACL, - }), + this.checkAndCreateWorkspace( + internalRepository, + PUBLIC_WORKSPACE, + { + name: 'public', + }, + publicWorkspaceACL.getPermissions() + ), + this.checkAndCreateWorkspace( + internalRepository, + MANAGEMENT_WORKSPACE, + { + name: 'Management', + }, + managementWorkspaceACL.getPermissions() + ), ]); } diff --git a/src/core/utils/constants.ts b/src/core/utils/constants.ts index 5ebf5c0af141..423d9ab730a6 100644 --- a/src/core/utils/constants.ts +++ b/src/core/utils/constants.ts @@ -23,3 +23,5 @@ export const PUBLIC_WORKSPACE = 'public'; export const MANAGEMENT_WORKSPACE = 'management'; export const WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS = 'workspace:enabled'; + +export const DASHBOARD_ADMIN_GROUP = 'dashboard_admin'; diff --git a/src/core/utils/index.ts b/src/core/utils/index.ts index 4118a850c828..d943e7aeebf2 100644 --- a/src/core/utils/index.ts +++ b/src/core/utils/index.ts @@ -43,4 +43,5 @@ export { PUBLIC_WORKSPACE, WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS, MANAGEMENT_WORKSPACE, + DASHBOARD_ADMIN_GROUP, } from './constants'; From 6cd39d4e4229e79c2f7f56e92d9459b69411fa6c Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Tue, 8 Aug 2023 13:30:59 +0800 Subject: [PATCH 12/28] feat: update Signed-off-by: SuZhou-Joe --- .../saved_objects/workspace_saved_objects_client_wrapper.ts | 5 ++--- src/core/server/workspaces/workspaces_service.ts | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index 9eca07bd7f49..84165deb66c7 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -22,7 +22,7 @@ import { } from 'opensearch-dashboards/server'; import { SavedObjectsPermissionControlContract } from '../../saved_objects/permission_control/client'; import { WORKSPACE_TYPE } from '../constants'; -import { PUBLIC_WORKSPACE, PermissionMode } from '../../../utils'; +import { PermissionMode } from '../../../utils'; import { ACL } from '../../saved_objects/permission_control/acl'; // Can't throw unauthorized for now, the page will be refreshed if unauthorized @@ -214,8 +214,7 @@ export class WorkspaceSavedObjectsClientWrapper { ); if (options.workspaces) { const isEveryWorkspaceIsPermitted = options.workspaces.every((item) => - // TODO modify this line to use permittedWorkspaceIds if public workspace is also a workspace - [PUBLIC_WORKSPACE, ...(permittedWorkspaceIds || [])]?.includes(item) + (permittedWorkspaceIds || []).includes(item) ); if (!isEveryWorkspaceIsPermitted) { throw generateWorkspacePermissionError(); diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index 7aa300dc07b8..c1a96186efdc 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -134,7 +134,6 @@ export class WorkspacesService } private async setupWorkspaces(startDeps: WorkpsaceStartDeps) { - return; const internalRepository = startDeps.savedObjects.createInternalRepository(); const publicWorkspaceACL = new ACL() .addPermission([PermissionMode.LibraryRead, PermissionMode.LibraryWrite], { From a8ed9d315c62031919b3ffe7149d535bf939f53b Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Tue, 8 Aug 2023 17:39:13 +0800 Subject: [PATCH 13/28] feat: update Signed-off-by: SuZhou-Joe --- src/core/server/workspaces/workspaces_service.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index c1a96186efdc..a8493050793b 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import { URL } from 'node:url'; +import { i18n } from '@osd/i18n'; import { CoreService } from '../../types'; import { CoreContext } from '../core_context'; import { InternalHttpServiceSetup } from '../http'; @@ -108,7 +109,7 @@ export class WorkspacesService private async checkAndCreateWorkspace( internalRepository: ISavedObjectsRepository, workspaceId: string, - workspaceAttribute: Omit, + workspaceAttribute: Omit, permissions?: Permissions ) { /** @@ -155,7 +156,9 @@ export class WorkspacesService internalRepository, PUBLIC_WORKSPACE, { - name: 'public', + name: i18n.translate('workspaces.public.workspace.default.name', { + defaultMessage: 'public', + }), }, publicWorkspaceACL.getPermissions() ), @@ -163,7 +166,9 @@ export class WorkspacesService internalRepository, MANAGEMENT_WORKSPACE, { - name: 'Management', + name: i18n.translate('workspaces.management.workspace.default.name', { + defaultMessage: 'Management', + }), }, managementWorkspaceACL.getPermissions() ), From bb65ed51be8e70e71ffe428b7f8730a69e1b1c08 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Tue, 8 Aug 2023 18:32:32 +0800 Subject: [PATCH 14/28] feat: update Signed-off-by: SuZhou-Joe --- .../public/saved_objects/saved_objects_client.ts | 13 ++++++------- .../workspace_saved_objects_client_wrapper.ts | 12 ------------ .../objects_table/saved_objects_table.tsx | 2 +- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts index 45d8d5402b8f..6d8901a9489b 100644 --- a/src/core/public/saved_objects/saved_objects_client.ts +++ b/src/core/public/saved_objects/saved_objects_client.ts @@ -266,13 +266,9 @@ export class SavedObjectsClient { }; const currentWorkspaceId = this._getCurrentWorkspace(); let finalWorkspaces; - if (options.workspaces) { + if (options.hasOwnProperty('workspaces')) { finalWorkspaces = options.workspaces; } else if (typeof currentWorkspaceId === 'string') { - /** - * When the currentWorkspaceId is an empty string instead of undefined - * It means user is creating object in public workspace. - */ finalWorkspaces = [currentWorkspaceId]; } @@ -383,10 +379,13 @@ export class SavedObjectsClient { const currentWorkspaceId = this._getCurrentWorkspace(); let finalWorkspaces; - if (options.workspaces) { + if (options.hasOwnProperty('workspaces')) { finalWorkspaces = options.workspaces; } else if (typeof currentWorkspaceId === 'string') { - finalWorkspaces = currentWorkspaceId ? [PUBLIC_WORKSPACE, currentWorkspaceId] : undefined; + finalWorkspaces = + currentWorkspaceId === PUBLIC_WORKSPACE + ? undefined + : [PUBLIC_WORKSPACE, currentWorkspaceId]; } const renamedQuery = renameKeys(renameMap, { diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index 84165deb66c7..f70f7aa3b0f6 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -220,19 +220,7 @@ export class WorkspaceSavedObjectsClientWrapper { throw generateWorkspacePermissionError(); } } else { - const queryDSL = ACL.genereateGetPermittedSavedObjectsQueryDSL( - [ - PermissionMode.LibraryRead, - PermissionMode.LibraryWrite, - PermissionMode.Management, - PermissionMode.Read, - PermissionMode.Write, - ], - principals, - options.type - ); options.workspaces = permittedWorkspaceIds; - options.queryDSL = queryDSL; } } diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx index b82fede2498e..867fb4868957 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx @@ -180,7 +180,7 @@ export class SavedObjectsTable extends Component Date: Wed, 9 Aug 2023 12:07:16 +0800 Subject: [PATCH 15/28] feat: update query dsl Signed-off-by: SuZhou-Joe --- .../workspace_saved_objects_client_wrapper.ts | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index f70f7aa3b0f6..9240f363fc7c 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -220,7 +220,51 @@ export class WorkspaceSavedObjectsClientWrapper { throw generateWorkspacePermissionError(); } } else { - options.workspaces = permittedWorkspaceIds; + const queryDSL = ACL.genereateGetPermittedSavedObjectsQueryDSL( + [PermissionMode.Read, PermissionMode.Write], + principals, + options.type + ); + options.workspaces = undefined; + /** + * Select all the docs that + * 1. ACL matches right or write permission OR + * 2. workspaces matches library_read or library_write or management OR + * 3. Records without workspaces field (Advances settings) + */ + options.queryDSL = { + query: { + bool: { + filter: [ + { + bool: { + should: [ + { + bool: { + must_not: { + exists: { + field: 'workspaces', + }, + }, + }, + }, + queryDSL.query, + { + bool: { + should: permittedWorkspaceIds?.map((item) => ({ + terms: { + workspaces: [item], + }, + })), + }, + }, + ], + }, + }, + ], + }, + }, + }; } } From ecc4b57447c02ad17253aeaa63101a0e51f82299 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 13:41:31 +0800 Subject: [PATCH 16/28] feat: use same constants Signed-off-by: SuZhou-Joe --- src/core/server/saved_objects/routes/share.ts | 4 ++-- src/core/server/saved_objects/service/lib/repository.ts | 6 +++--- src/core/server/workspaces/constants.ts | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/core/server/saved_objects/routes/share.ts b/src/core/server/saved_objects/routes/share.ts index 340709017e7b..526ad24893c6 100644 --- a/src/core/server/saved_objects/routes/share.ts +++ b/src/core/server/saved_objects/routes/share.ts @@ -9,7 +9,7 @@ import { exportSavedObjectsToStream } from '../export'; import { validateObjects } from './utils'; import { collectSavedObjects } from '../import/collect_saved_objects'; import { WORKSPACE_TYPE } from '../../workspaces'; -import { GLOBAL_WORKSPACE_ID } from '../../workspaces/constants'; +import { PUBLIC_WORKSPACE } from '../../../utils/constants'; const SHARE_LIMIT = 10000; @@ -73,7 +73,7 @@ export const registerShareRoute = (router: IRouter) => { (obj) => obj.workspaces && obj.workspaces.length > 0 && - !obj.workspaces.includes(GLOBAL_WORKSPACE_ID) + !obj.workspaces.includes(PUBLIC_WORKSPACE) ) .map((obj) => ({ id: obj.id, type: obj.type, workspaces: obj.workspaces })); diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index 0fd6efd2675f..6adefe16848d 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -87,7 +87,7 @@ import { FIND_DEFAULT_PER_PAGE, SavedObjectsUtils, } from './utils'; -import { GLOBAL_WORKSPACE_ID } from '../../../workspaces/constants'; +import { PUBLIC_WORKSPACE } from '../../../../utils/constants'; // BEWARE: The SavedObjectClient depends on the implementation details of the SavedObjectsRepository // so any breaking changes to this repository are considered breaking changes to the SavedObjectsClient. @@ -1299,7 +1299,7 @@ export class SavedObjectsRepository { if ( obj.workspaces && obj.workspaces.length > 0 && - !obj.workspaces.includes(GLOBAL_WORKSPACE_ID) + !obj.workspaces.includes(PUBLIC_WORKSPACE) ) { return intersection(obj.workspaces, options.workspaces).length === 0; } @@ -1352,7 +1352,7 @@ export class SavedObjectsRepository { params: { time, workspaces, - globalWorkspaceId: GLOBAL_WORKSPACE_ID, + globalWorkspaceId: PUBLIC_WORKSPACE, }, }, }, diff --git a/src/core/server/workspaces/constants.ts b/src/core/server/workspaces/constants.ts index c9bf406e50c9..73c2d6010846 100644 --- a/src/core/server/workspaces/constants.ts +++ b/src/core/server/workspaces/constants.ts @@ -4,4 +4,3 @@ */ export const WORKSPACE_TYPE = 'workspace'; -export const GLOBAL_WORKSPACE_ID = 'public'; From c487141e5ee777c6e2c0eedb290e0742cc80efc7 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 13:42:26 +0800 Subject: [PATCH 17/28] feat: make it run Signed-off-by: SuZhou-Joe --- src/core/server/saved_objects/service/saved_objects_client.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/server/saved_objects/service/saved_objects_client.ts b/src/core/server/saved_objects/service/saved_objects_client.ts index 83d12d9791ed..3a71c28c74ba 100644 --- a/src/core/server/saved_objects/service/saved_objects_client.ts +++ b/src/core/server/saved_objects/service/saved_objects_client.ts @@ -29,7 +29,6 @@ */ import { Permissions } from '../permission_control/acl'; - import { ISavedObjectsRepository } from './lib'; import { SavedObject, @@ -41,7 +40,6 @@ import { SavedObjectsFindOptions, } from '../types'; import { SavedObjectsErrorHelpers } from './lib/errors'; -import { Permissions } from '../permission_control/acl'; /** * From 1b2bf54fb6c57f29cc5b7a7b77b4b413567e96b9 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 13:50:11 +0800 Subject: [PATCH 18/28] feat: remove dashboard admin Signed-off-by: SuZhou-Joe --- .../server/workspaces/workspaces_service.ts | 28 ++++++------------- src/core/utils/constants.ts | 2 -- src/core/utils/index.ts | 1 - 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index a8493050793b..2c322e38edb6 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -20,12 +20,7 @@ import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; import { InternalUiSettingsServiceSetup } from '../ui_settings'; import { uiSettings } from './ui_settings'; import { WORKSPACE_TYPE } from './constants'; -import { - MANAGEMENT_WORKSPACE, - PUBLIC_WORKSPACE, - PermissionMode, - DASHBOARD_ADMIN_GROUP, -} from '../../utils'; +import { MANAGEMENT_WORKSPACE, PUBLIC_WORKSPACE, PermissionMode } from '../../utils'; import { ACL, Permissions } from '../saved_objects/permission_control/acl'; export interface WorkspacesServiceSetup { @@ -136,20 +131,15 @@ export class WorkspacesService private async setupWorkspaces(startDeps: WorkpsaceStartDeps) { const internalRepository = startDeps.savedObjects.createInternalRepository(); - const publicWorkspaceACL = new ACL() - .addPermission([PermissionMode.LibraryRead, PermissionMode.LibraryWrite], { - users: ['*'], - }) - .addPermission([PermissionMode.Management], { - groups: [DASHBOARD_ADMIN_GROUP], - }); - const managementWorkspaceACL = new ACL() - .addPermission([PermissionMode.LibraryRead], { + const publicWorkspaceACL = new ACL().addPermission( + [PermissionMode.LibraryRead, PermissionMode.LibraryWrite], + { users: ['*'], - }) - .addPermission([PermissionMode.Management, PermissionMode.LibraryWrite], { - groups: [DASHBOARD_ADMIN_GROUP], - }); + } + ); + const managementWorkspaceACL = new ACL().addPermission([PermissionMode.LibraryRead], { + users: ['*'], + }); await Promise.all([ this.checkAndCreateWorkspace( diff --git a/src/core/utils/constants.ts b/src/core/utils/constants.ts index 423d9ab730a6..5ebf5c0af141 100644 --- a/src/core/utils/constants.ts +++ b/src/core/utils/constants.ts @@ -23,5 +23,3 @@ export const PUBLIC_WORKSPACE = 'public'; export const MANAGEMENT_WORKSPACE = 'management'; export const WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS = 'workspace:enabled'; - -export const DASHBOARD_ADMIN_GROUP = 'dashboard_admin'; diff --git a/src/core/utils/index.ts b/src/core/utils/index.ts index d943e7aeebf2..4118a850c828 100644 --- a/src/core/utils/index.ts +++ b/src/core/utils/index.ts @@ -43,5 +43,4 @@ export { PUBLIC_WORKSPACE, WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS, MANAGEMENT_WORKSPACE, - DASHBOARD_ADMIN_GROUP, } from './constants'; From 59c0c9f01ae9eb83d5a3ba24531b5e6f3e741d79 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 13:55:07 +0800 Subject: [PATCH 19/28] feat: modify query DSL Signed-off-by: SuZhou-Joe --- .../workspace_saved_objects_client_wrapper.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index 9240f363fc7c..b2f107b3843b 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -230,7 +230,7 @@ export class WorkspaceSavedObjectsClientWrapper { * Select all the docs that * 1. ACL matches right or write permission OR * 2. workspaces matches library_read or library_write or management OR - * 3. Records without workspaces field (Advances settings) + * 3. Advances settings */ options.queryDSL = { query: { @@ -241,9 +241,9 @@ export class WorkspaceSavedObjectsClientWrapper { should: [ { bool: { - must_not: { - exists: { - field: 'workspaces', + must: { + term: { + type: 'config', }, }, }, From ffbf2c4583150162bde98f14a32ee75debcfc0f8 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 14:16:59 +0800 Subject: [PATCH 20/28] feat: modify query DSL Signed-off-by: SuZhou-Joe --- .../saved_objects/workspace_saved_objects_client_wrapper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index b2f107b3843b..66b100ba1eee 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -228,7 +228,7 @@ export class WorkspaceSavedObjectsClientWrapper { options.workspaces = undefined; /** * Select all the docs that - * 1. ACL matches right or write permission OR + * 1. ACL matches read or write permission OR * 2. workspaces matches library_read or library_write or management OR * 3. Advances settings */ From dbd7f8fa50a645d70cafe8d1b6b423527768d4ad Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 14:17:25 +0800 Subject: [PATCH 21/28] feat: modify query DSL Signed-off-by: SuZhou-Joe --- .../saved_objects/workspace_saved_objects_client_wrapper.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index 66b100ba1eee..6f156c199231 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -230,7 +230,7 @@ export class WorkspaceSavedObjectsClientWrapper { * Select all the docs that * 1. ACL matches read or write permission OR * 2. workspaces matches library_read or library_write or management OR - * 3. Advances settings + * 3. Advanced settings */ options.queryDSL = { query: { From 3217788f0ea6efdac601e8b1a2e05277fce85f31 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 15:11:03 +0800 Subject: [PATCH 22/28] feat: list principals route Signed-off-by: SuZhou-Joe --- .../server/saved_objects/permission_control/routes/index.ts | 2 ++ .../permission_control/routes/{principles.ts => principals.ts} | 0 2 files changed, 2 insertions(+) rename src/core/server/saved_objects/permission_control/routes/{principles.ts => principals.ts} (100%) diff --git a/src/core/server/saved_objects/permission_control/routes/index.ts b/src/core/server/saved_objects/permission_control/routes/index.ts index edd694b0ada0..405bd22bdbe9 100644 --- a/src/core/server/saved_objects/permission_control/routes/index.ts +++ b/src/core/server/saved_objects/permission_control/routes/index.ts @@ -5,6 +5,7 @@ import { InternalHttpServiceSetup } from '../../../http'; import { SavedObjectsPermissionControlContract } from '../client'; +import { registerListRoute } from './principals'; import { registerValidateRoute } from './validate'; export function registerPermissionCheckRoutes({ @@ -17,4 +18,5 @@ export function registerPermissionCheckRoutes({ const router = http.createRouter('/api/saved_objects_permission_control/'); registerValidateRoute(router, permissionControl); + registerListRoute(router, permissionControl); } diff --git a/src/core/server/saved_objects/permission_control/routes/principles.ts b/src/core/server/saved_objects/permission_control/routes/principals.ts similarity index 100% rename from src/core/server/saved_objects/permission_control/routes/principles.ts rename to src/core/server/saved_objects/permission_control/routes/principals.ts From a93c2acafb2655a263851b72aae1092e8ea11c21 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 16:46:20 +0800 Subject: [PATCH 23/28] feat: optimize query DSL Signed-off-by: SuZhou-Joe --- src/core/public/workspace/workspaces_client.ts | 2 ++ .../workspace_saved_objects_client_wrapper.ts | 16 ++++------------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/core/public/workspace/workspaces_client.ts b/src/core/public/workspace/workspaces_client.ts index 46ca139d9551..d203d947abe5 100644 --- a/src/core/public/workspace/workspaces_client.ts +++ b/src/core/public/workspace/workspaces_client.ts @@ -70,6 +70,8 @@ export class WorkspacesClient { } } ); + + this.init(); } /** diff --git a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts index 6f156c199231..5f852d48a068 100644 --- a/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts +++ b/src/core/server/workspaces/saved_objects/workspace_saved_objects_client_wrapper.ts @@ -240,22 +240,14 @@ export class WorkspaceSavedObjectsClientWrapper { bool: { should: [ { - bool: { - must: { - term: { - type: 'config', - }, - }, + term: { + type: 'config', }, }, queryDSL.query, { - bool: { - should: permittedWorkspaceIds?.map((item) => ({ - terms: { - workspaces: [item], - }, - })), + terms: { + workspaces: permittedWorkspaceIds, }, }, ], From 47f8bd536927f24bcfeaa3c6d30816b26d35d6de Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 17:44:17 +0800 Subject: [PATCH 24/28] feat: change public logic Signed-off-by: SuZhou-Joe --- src/core/public/saved_objects/saved_objects_client.ts | 5 +---- src/plugins/workspace/public/plugin.ts | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/core/public/saved_objects/saved_objects_client.ts b/src/core/public/saved_objects/saved_objects_client.ts index 6d8901a9489b..b0e3245f74e5 100644 --- a/src/core/public/saved_objects/saved_objects_client.ts +++ b/src/core/public/saved_objects/saved_objects_client.ts @@ -382,10 +382,7 @@ export class SavedObjectsClient { if (options.hasOwnProperty('workspaces')) { finalWorkspaces = options.workspaces; } else if (typeof currentWorkspaceId === 'string') { - finalWorkspaces = - currentWorkspaceId === PUBLIC_WORKSPACE - ? undefined - : [PUBLIC_WORKSPACE, currentWorkspaceId]; + finalWorkspaces = Array.from(new Set([PUBLIC_WORKSPACE, currentWorkspaceId])); } const renamedQuery = renameKeys(renameMap, { diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index b4ff4ca01b14..176349913726 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -199,9 +199,9 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep if (this.coreStart) { return this.coreStart.workspaces.client.currentWorkspaceId$.subscribe( (currentWorkspaceId) => { - this.coreStart?.savedObjects.client.setCurrentWorkspace( - currentWorkspaceId || PUBLIC_WORKSPACE - ); + if (currentWorkspaceId) { + this.coreStart?.savedObjects.client.setCurrentWorkspace(currentWorkspaceId); + } } ); } From 83759101dbbd49953ae312ea3d6461903d352c84 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 17:51:10 +0800 Subject: [PATCH 25/28] feat: update Signed-off-by: SuZhou-Joe --- src/plugins/workspace/public/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/workspace/public/plugin.ts b/src/plugins/workspace/public/plugin.ts index 176349913726..8776b7bef8c8 100644 --- a/src/plugins/workspace/public/plugin.ts +++ b/src/plugins/workspace/public/plugin.ts @@ -78,7 +78,7 @@ export class WorkspacesPlugin implements Plugin<{}, {}, WorkspacesPluginSetupDep /** * Retrieve workspace id from url */ - const workspaceId = this.getWorkspaceIdFromURL() || PUBLIC_WORKSPACE; + const workspaceId = this.getWorkspaceIdFromURL(); if (workspaceId) { const result = await core.workspaces.client.enterWorkspace(workspaceId); From 0c53ece75a0729286cb6901785fca94715359cba Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 17:59:48 +0800 Subject: [PATCH 26/28] feat: update Signed-off-by: SuZhou-Joe --- .../server/ui_settings/settings/workspace.ts | 26 ------------------- .../objects_table/saved_objects_table.tsx | 2 +- 2 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 src/core/server/ui_settings/settings/workspace.ts diff --git a/src/core/server/ui_settings/settings/workspace.ts b/src/core/server/ui_settings/settings/workspace.ts deleted file mode 100644 index f8ee24491c9d..000000000000 --- a/src/core/server/ui_settings/settings/workspace.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright OpenSearch Contributors - * SPDX-License-Identifier: Apache-2.0 - */ - -import { schema } from '@osd/config-schema'; -import { i18n } from '@osd/i18n'; -import { UiSettingsParams } from '../../../types'; -import { WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS } from '../../../utils'; - -export const getWorkspaceSettings = (): Record => { - return { - [WORKSPACE_FEATURE_FLAG_KEY_IN_UI_SETTINGS]: { - name: i18n.translate('core.ui_settings.params.workspace.enableWorkspaceTitle', { - defaultMessage: 'Enable Workspace', - }), - value: false, - requiresPageReload: true, - description: i18n.translate('core.ui_settings.params.workspace.enableWorkspaceTitle', { - defaultMessage: 'Enable or disable OpenSearch Dashboards Workspace', - }), - category: ['workspace'], - schema: schema.boolean(), - }, - }; -}; diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx index 867fb4868957..b82fede2498e 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.tsx @@ -180,7 +180,7 @@ export class SavedObjectsTable extends Component Date: Wed, 9 Aug 2023 18:06:25 +0800 Subject: [PATCH 27/28] feat: remove init Signed-off-by: SuZhou-Joe --- src/core/public/workspace/workspaces_client.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/public/workspace/workspaces_client.ts b/src/core/public/workspace/workspaces_client.ts index d203d947abe5..46ca139d9551 100644 --- a/src/core/public/workspace/workspaces_client.ts +++ b/src/core/public/workspace/workspaces_client.ts @@ -70,8 +70,6 @@ export class WorkspacesClient { } } ); - - this.init(); } /** From 384449dfe689e9fd4855ccd937f3f827666f16a5 Mon Sep 17 00:00:00 2001 From: SuZhou-Joe Date: Wed, 9 Aug 2023 18:10:07 +0800 Subject: [PATCH 28/28] feat: add judgement when workspaceList is empty Signed-off-by: SuZhou-Joe --- .../public/workspace/workspaces_client.ts | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/core/public/workspace/workspaces_client.ts b/src/core/public/workspace/workspaces_client.ts index 46ca139d9551..2f8c204bf418 100644 --- a/src/core/public/workspace/workspaces_client.ts +++ b/src/core/public/workspace/workspaces_client.ts @@ -48,25 +48,27 @@ export class WorkspacesClient { combineLatest([this.workspaceList$, this.currentWorkspaceId$]).subscribe( ([workspaceList, currentWorkspaceId]) => { - const currentWorkspace = this.findWorkspace([workspaceList, currentWorkspaceId]); + if (workspaceList.length) { + const currentWorkspace = this.findWorkspace([workspaceList, currentWorkspaceId]); - /** - * Do a simple idempotent verification here - */ - if (!isEqual(currentWorkspace, this.currentWorkspace$.getValue())) { - this.currentWorkspace$.next(currentWorkspace); - } - - if (currentWorkspaceId && !currentWorkspace?.id) { /** - * Current workspace is staled + * Do a simple idempotent verification here */ - this.currentWorkspaceId$.error({ - reason: WORKSPACE_ERROR_REASON_MAP.WORKSPACE_STALED, - }); - this.currentWorkspace$.error({ - reason: WORKSPACE_ERROR_REASON_MAP.WORKSPACE_STALED, - }); + if (!isEqual(currentWorkspace, this.currentWorkspace$.getValue())) { + this.currentWorkspace$.next(currentWorkspace); + } + + if (currentWorkspaceId && !currentWorkspace?.id) { + /** + * Current workspace is staled + */ + this.currentWorkspaceId$.error({ + reason: WORKSPACE_ERROR_REASON_MAP.WORKSPACE_STALED, + }); + this.currentWorkspace$.error({ + reason: WORKSPACE_ERROR_REASON_MAP.WORKSPACE_STALED, + }); + } } } );