Added documentation. Fixed PR review comments

This commit is contained in:
swapnil.verma 2025-04-04 15:38:28 +05:30
parent 559cb504c1
commit e31f5886fc
5 changed files with 177 additions and 13 deletions

View File

@ -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>`](#ExtensionInfoModel)): `boolean`<br/>
Fetches the extension configuration from a running application
- _instanceUrl:_ string - URL of the running application
- **Returns** `Observable<ExtensionInfoModel>` - Observable emitting the extension configuration for the application
- **getSavedPluginState**(key: `string`): [`Observable<ExtensionCompositionEntry>`](#ExtensionCompositionEntry)<br/>
Fetches the saved extension configuration from the database
- _instanceId:_ `string` - Unique id under which the extension configuration is saved
- **Returns** `Observable<ExtensionCompositionEntry>` - Observable emitting the saved extension state
- **getDefaultPluginState**(instanceUrl: `string`: `Observable<AppConfigPluginRef>`<br/>
Fetches the states of plugins from a running application
- _instanceUrl:_ string - URL of the running application
- **Returns** `Observable<AppConfigPluginRef>` - Observable emitting the plugin state of a running application
- **publishExtensionConfig**(key: `string`, pluginConfig: [`ExtensionComposition`](#ExtensionComposition)): `Observable<void>`<br/>
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<void>` - 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<string> |
| **$$compatibilities** | Array<string> |
| **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 } |

View File

@ -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())

View File

@ -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<ExtensionInfoModel>
*/
getPluginInfo(instanceUrl: string): Observable<ExtensionInfoModel[]> {
return this.httpClient.get<ExtensionInfoModel[]>(`${instanceUrl}/pluginInfo.json`);
}
/**
* Fetches the saved extension configuration from the database
*
* @param instanceId Unique id under which the extension configuration is saved
* @returns Observable<ExtensionCompositionEntry>
*/
getSavedPluginState(instanceId: string): Observable<ExtensionCompositionEntry> {
// 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<AppConfigPluginRef>
*/
getDefaultPluginState(instanceUrl: string): Observable<AppConfigPluginRef> {
return this.httpClient.get<AppConfigPluginRef>(`${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<void> {
return from(this.settingsApi.publishExtensionConfig(instanceId, pluginConfig));
}

View File

@ -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<any> {
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<void> {
throwIfNotDefined(instanceId, 'instanceId');

View File

@ -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 <GET VERSION INFO HERE>**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(`<instanceId>`, extensionConfig).then(() => {
console.log('API called successfully.');
});
```