diff --git a/docs/content-services/services/extension-manager.service.md b/docs/content-services/services/extension-manager.service.md new file mode 100644 index 0000000000..1fc3ade0bd --- /dev/null +++ b/docs/content-services/services/extension-manager.service.md @@ -0,0 +1,87 @@ +--- +Title: Extension Manager service +Added: v2.0.0 +Status: Active +Last reviewed: 2025-04-04 +--- + +# [Extension Manager service](../../../lib/content-services/src/lib/extensions-manager/services/extension-manager.service.ts "Defined in document-actions.service.ts") + +Implements the functionalities related to Extension Management + +## Class members + +### Methods + +- **getPluginInfo**(nodeEntry: [`Observable`](#ExtensionInfoModel)): `boolean`
+ Fetches the extension configuration from a running application + - _instanceUrl:_ string - URL of the running application + - **Returns** `Observable` - Observable emitting the extension configuration for the application +- **getSavedPluginState**(key: `string`): [`Observable`](#ExtensionCompositionEntry)
+ Fetches the saved extension configuration from the database + - _instanceId:_ `string` - Unique id under which the extension configuration is saved + - **Returns** `Observable` - Observable emitting the saved extension state +- **getDefaultPluginState**(instanceUrl: `string`: `Observable`
+ Fetches the states of plugins from a running application + - _instanceUrl:_ string - URL of the running application + - **Returns** `Observable` - Observable emitting the plugin state of a running application +- **publishExtensionConfig**(key: `string`, pluginConfig: [`ExtensionComposition`](#ExtensionComposition)): `Observable`
+ Publishes the extensions configuration to the database + - _instanceId:_ `string` - Id to use to identify the application + - _pluginConfig:_ [`ExtensionComposition`](#ExtensionComposition) - The extension configuration to be saved + - **Returns** `Observable` - Observable emitting no value + +## Details + +This service provides methods necessary to publish and fetch extensions configuration + +# Models + +## ExtensionCompositionEntry + +**Properties** + +| Name | Type | +|-----------|-----------------------------------------------| +| **entry** | [ExtensionComposition](#ExtensionComposition) | + +## ExtensionComposition + +**Properties** + +| Name | Type | +|---------------|----------------------------------------------------------------------------| +| **appConfig** | [AppConfigPluginRef](#AppConfigPluginRef) | +| **rules** | [RuleRef[]]((../../../lib/extensions/src/lib/config/rule.extensions.ts)) | +| **routes** | [RouteRef[]](../../../lib/extensions/src/lib/config/routing.extensions.ts) | +| **actions** | [ActionRef[]](../../../lib/extensions/src/lib/config/action.extensions.ts) | +| **features** | [key: string]: any | + +## ExtensionInfoModel + +**Properties** + +| Name | Type | +|-----------------------|----------------------------------------------------------------------------| +| **$id** | string | +| **$name** | string | +| **$version** | string | +| **$vendor** | string | +| **$license** | string | +| **$description** | string | +| **$dependencies** | Array | +| **$$compatibilities** | Array | +| **extensionId** | string | +| **appConfig** | [AppConfigPluginRef](#AppConfigPluginRef) | +| **rules** | [RuleRef[]]((../../../lib/extensions/src/lib/config/rule.extensions.ts)) | +| **routes** | [RouteRef[]](../../../lib/extensions/src/lib/config/routing.extensions.ts) | +| **actions** | [ActionRef[]](../../../lib/extensions/src/lib/config/action.extensions.ts) | +| **features** | [key: string]: any | + +## AppConfigPluginRef + +**Properties** + +| Name | Type | +|-------------|----------------------------| +| **plugins** | { [key: string]: boolean } | diff --git a/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.spec.ts b/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.spec.ts index 0e75b49f61..c3001a0ff5 100644 --- a/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.spec.ts +++ b/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.spec.ts @@ -17,10 +17,11 @@ import { ExtensionManagerService } from './extension-manager.service'; import { TestBed } from '@angular/core/testing'; -import { CoreTestingModule } from '../testing/core.testing.module'; -import { ExtensionComposition, ExtensionCompositionEntry } from '@alfresco/js-api'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { first } from 'rxjs/operators'; +import { ExtensionCompositionEntry } from '../models/extension-composition-entry'; +import { ExtensionComposition } from '../models/extension-composition'; +import { CoreTestingModule } from '@alfresco/adf-core'; describe('ExtensionManagerService', () => { let extensionManagerService: ExtensionManagerService; @@ -51,7 +52,7 @@ describe('ExtensionManagerService', () => { expect(putSpy).toHaveBeenCalledOnceWith('test-instance-id', extensionComposition); }); - it('should fetch extension info from pluginInfo.json of a running instance of ADW', (done) => { + it('should fetch extension info from pluginInfo.json', (done) => { extensionManagerService .getPluginInfo('test-adw-url') .pipe(first()) @@ -65,7 +66,7 @@ describe('ExtensionManagerService', () => { httpTestingController.verify(); }); - it('should fetch extension defaults from appConfig.json of a running instance of ADW', (done) => { + it('should fetch extension defaults from appConfig.json', (done) => { extensionManagerService .getDefaultPluginState('test-adw-url') .pipe(first()) diff --git a/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.ts b/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.ts index 552371cc3f..d2b9bf81c1 100644 --- a/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.ts +++ b/lib/content-services/src/lib/extensions-manager/services/extension-manager.service.ts @@ -34,14 +34,26 @@ export class ExtensionManagerService { private _settingsApi: SettingsApi; get settingsApi(): SettingsApi { - this._settingsApi = this._settingsApi ?? new SettingsApi(this.apiService.getInstance()); + this._settingsApi ??= new SettingsApi(this.apiService.getInstance()); return this._settingsApi; } + /** + * Fetches the extension configuration from a running application + * + * @param instanceUrl URL of the running application + * @returns Observable + */ getPluginInfo(instanceUrl: string): Observable { return this.httpClient.get(`${instanceUrl}/pluginInfo.json`); } + /** + * Fetches the saved extension configuration from the database + * + * @param instanceId Unique id under which the extension configuration is saved + * @returns Observable + */ getSavedPluginState(instanceId: string): Observable { // TODO: Update below code once backend APIs are working // eslint-disable-next-line no-console @@ -50,10 +62,23 @@ export class ExtensionManagerService { // return from(this.settingsApi.getSavedExtensionState(instanceId)); } + /** + * Fetches the states of plugins from a running application + * + * @param instanceUrl URL of the running application + * @returns Observable + */ getDefaultPluginState(instanceUrl: string): Observable { return this.httpClient.get(`${instanceUrl}/app.config.json`); } + /** + * Publishes the extensions configuration to the database + * + * @param instanceId Id to use to identify the application + * @param pluginConfig The extension configuration to be saved + * @returns void + */ publishExtensionConfig(instanceId: string, pluginConfig: ExtensionComposition): Observable { return from(this.settingsApi.publishExtensionConfig(instanceId, pluginConfig)); } diff --git a/lib/js-api/src/api/content-rest-api/api/settings.api.ts b/lib/js-api/src/api/content-rest-api/api/settings.api.ts index 1a6d7fc164..a9d4ab352f 100644 --- a/lib/js-api/src/api/content-rest-api/api/settings.api.ts +++ b/lib/js-api/src/api/content-rest-api/api/settings.api.ts @@ -22,8 +22,7 @@ export class SettingsApi extends BaseApi { /** * Gets the published extension configuration from * the database - * @param instanceId Unique ID for a running instance of ADW - * for which configuration is to be fetched + * @param instanceId Unique ID for which configuration is to be fetched */ getSavedExtensionState(instanceId: string): Promise { throwIfNotDefined(instanceId, 'instanceId'); @@ -39,12 +38,9 @@ export class SettingsApi extends BaseApi { } /** - * Publish the extension configuration for an ADW instance - * in the database - * @param instanceId Unique ID for a running instance of ADW - * for which configuration is to be published - * @param extensionConfig Extension configuration that is to - * be saved + * Publish the extension configuration in the database + * @param instanceId Unique ID for which configuration is to be published + * @param extensionConfig Extension configuration that is to be saved */ publishExtensionConfig(instanceId: string, extensionConfig: any): Promise { throwIfNotDefined(instanceId, 'instanceId'); diff --git a/lib/js-api/src/api/content-rest-api/docs/SettingsApi.md b/lib/js-api/src/api/content-rest-api/docs/SettingsApi.md new file mode 100644 index 0000000000..9fd782d7bd --- /dev/null +++ b/lib/js-api/src/api/content-rest-api/docs/SettingsApi.md @@ -0,0 +1,55 @@ +# SettingsApi + +All URIs are relative to *https://localhost/alfresco/api/-default-/public/alfresco/versions/1/* + +| Method | HTTP request | Description | +|--------------------------------------------------------|--------------------------------|-------------------------------------------------------| +| [getSavedExtensionState](#getSavedExtensionState) | **GET** /settings/{instanceId} | Gets the extension configuration saved on the backend | +| [publishExtensionConfig](#publishExtensionComposition) | **PUT** /settings/{instanceId} | Saves an extension configuration on the backend | + +## getSavedExtensionState + +Gets the extension configuration saved on the backend + +> this endpoint is available in **Alfresco 7.0.0** and newer versions. + +**Parameters** + +| Name | Type | Description | Notes | +|----------------|--------|----------------|-------| +| **instanceId** | string | The identifier | | + +**Return type**: [ExtensionCompositionEntry](#ExtensionCompositionEntry) + +## publishExtensionComposition + +Saves an extension configuration on the backend + +**Parameters** + +| Name | Type | Description | +|---------------------|-----------------------------------------------|-----------------------------------------| +| **instanceId** | string | The identifier | +| **extensionConfig** | [ExtensionComposition](#ExtensionComposition) | The extension configuration to be saved | + +**Example** + +```javascript +import {AlfrescoApi, SitesApi} from '@alfresco/js-api'; + +const alfrescoApi = new AlfrescoApi(/*..*/); +const settingsApi = new SettingsApi(alfrescoApi); + +const extensionConfig = new ExtensionComposition(); +extensionConfig = { + appConfig: {}, + features: {}, + actions: [], + rules: [], + routes: [] +} + +settingsApi.publishExtensionConfig(``, extensionConfig).then(() => { + console.log('API called successfully.'); +}); +```