From e83003689fdbab439c363b1a5d63aa106c08937e Mon Sep 17 00:00:00 2001 From: Lin Wang Date: Thu, 10 Aug 2023 10:54:32 +0800 Subject: [PATCH] feat: call saved objects with internal user Signed-off-by: Lin Wang --- src/core/server/server.ts | 1 + .../server/workspaces/workspaces_service.ts | 34 ++++++++++++++++--- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/core/server/server.ts b/src/core/server/server.ts index afdbdc7b4846..c159903dc923 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, + uiSetting: uiSettingsStart, }); this.coreStart = { diff --git a/src/core/server/workspaces/workspaces_service.ts b/src/core/server/workspaces/workspaces_service.ts index 2c322e38edb6..e6d5c90c0a58 100644 --- a/src/core/server/workspaces/workspaces_service.ts +++ b/src/core/server/workspaces/workspaces_service.ts @@ -13,15 +13,17 @@ import { ISavedObjectsRepository, InternalSavedObjectsServiceSetup, SavedObjectsServiceStart, + SavedObjectsClient, } from '../saved_objects'; import { IWorkspaceDBImpl, WorkspaceAttribute } from './types'; import { WorkspacesClientWithSavedObject } from './workspaces_client'; import { WorkspaceSavedObjectsClientWrapper } from './saved_objects'; -import { InternalUiSettingsServiceSetup } from '../ui_settings'; +import { InternalUiSettingsServiceSetup, InternalUiSettingsServiceStart } from '../ui_settings'; import { uiSettings } from './ui_settings'; import { WORKSPACE_TYPE } from './constants'; import { MANAGEMENT_WORKSPACE, PUBLIC_WORKSPACE, PermissionMode } from '../../utils'; import { ACL, Permissions } from '../saved_objects/permission_control/acl'; +import { SavedObjectsClientContract } from '../saved_objects/types'; export interface WorkspacesServiceSetup { client: IWorkspaceDBImpl; @@ -37,8 +39,9 @@ export interface WorkspacesSetupDeps { uiSettings: InternalUiSettingsServiceSetup; } -export interface WorkpsaceStartDeps { +export interface WorkspaceStartDeps { savedObjects: SavedObjectsServiceStart; + uiSetting: InternalUiSettingsServiceStart; } export type InternalWorkspacesServiceSetup = WorkspacesServiceSetup; @@ -48,6 +51,8 @@ export class WorkspacesService implements CoreService { private logger: Logger; private client?: IWorkspaceDBImpl; + private internalOSClient?: SavedObjectsClientContract; + private shouldUseInternalClientAsScoped: boolean = false; constructor(coreContext: CoreContext) { this.logger = coreContext.logger.get('workspaces-service'); @@ -96,6 +101,20 @@ export class WorkspacesService client: this.client as IWorkspaceDBImpl, }); + setupDeps.savedObject.setClientFactoryProvider((repositoryFactory) => { + const internalOSClient = new SavedObjectsClient(repositoryFactory.createInternalRepository()); + this.internalOSClient = internalOSClient; + + return ({ request, includedHiddenTypes }) => { + if (this.shouldUseInternalClientAsScoped) { + return internalOSClient; + } + return new SavedObjectsClient( + repositoryFactory.createScopedRepository(request, includedHiddenTypes) + ); + }; + }); + return { client: this.client, }; @@ -129,7 +148,7 @@ export class WorkspacesService } } - private async setupWorkspaces(startDeps: WorkpsaceStartDeps) { + private async setupWorkspaces(startDeps: WorkspaceStartDeps) { const internalRepository = startDeps.savedObjects.createInternalRepository(); const publicWorkspaceACL = new ACL().addPermission( [PermissionMode.LibraryRead, PermissionMode.LibraryWrite], @@ -164,9 +183,14 @@ export class WorkspacesService ), ]); } - - public async start(startDeps: WorkpsaceStartDeps): Promise { + public async start(startDeps: WorkspaceStartDeps): Promise { this.logger.debug('Starting SavedObjects service'); + if (!this.internalOSClient) { + throw new Error('Workspace internal saved object client not initialized.'); + } + this.shouldUseInternalClientAsScoped = await startDeps.uiSetting + .asScopedToClient(this.internalOSClient) + .get('workspace:enabled'); this.setupWorkspaces(startDeps);