[ACS-8025] Add new service and API for predictions (#9714)

* [ACS-8025] Add new service and API for predictions

* [ACS-8025] Fix update type
This commit is contained in:
MichalKinas 2024-05-22 23:14:01 +02:00 committed by GitHub
parent b8c8e5ce35
commit 19fa86d1a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 504 additions and 0 deletions

View File

@ -0,0 +1,18 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './public-api';

View File

@ -0,0 +1,18 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './services';

View File

@ -0,0 +1,18 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './prediction.service';

View File

@ -0,0 +1,47 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { PredictionService } from './prediction.service';
import { TestBed } from '@angular/core/testing';
import { ContentTestingModule } from '../../testing/content.testing.module';
import { Prediction, PredictionEntry, PredictionPaging, PredictionPagingList } from '@alfresco/js-api';
describe('PredictionService', () => {
let service: PredictionService;
const mockPredictionPaging = (): PredictionPaging => {
const prediction = new Prediction();
prediction.id = 'test id';
const predictionEntry = new PredictionEntry({ entry: prediction });
const predictionPagingList = new PredictionPagingList({ entries: [predictionEntry] });
return new PredictionPaging({ list: predictionPagingList });
};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ContentTestingModule]
});
service = TestBed.inject(PredictionService);
});
it('should call getPredictions on PredictionsApi with nodeId', () => {
spyOn(service.predictionsApi, 'getPredictions').and.returnValue(Promise.resolve(mockPredictionPaging()));
service.getPredictions('test id');
expect(service.predictionsApi.getPredictions).toHaveBeenCalledWith('test id');
});
});

View File

@ -0,0 +1,43 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Injectable } from '@angular/core';
import { AlfrescoApiService } from '@alfresco/adf-core';
import { PredictionsApi, PredictionPaging } from '@alfresco/js-api';
import { from, Observable } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class PredictionService {
private _predictionsApi: PredictionsApi;
get predictionsApi(): PredictionsApi {
this._predictionsApi = this._predictionsApi ?? new PredictionsApi(this.apiService.getInstance());
return this._predictionsApi;
}
constructor(private apiService: AlfrescoApiService) {}
/**
* Get predictions for a given node
*
* @param nodeId The identifier of node.
* @returns Observable<PredictionPaging>
*/
getPredictions(nodeId: string): Observable<PredictionPaging> {
return from(this.predictionsApi.getPredictions(nodeId));
}
}

View File

@ -44,5 +44,6 @@ export * from './lib/category/index';
export * from './lib/viewer/index'; export * from './lib/viewer/index';
export * from './lib/security/index'; export * from './lib/security/index';
export * from './lib/infinite-scroll-datasource'; export * from './lib/infinite-scroll-datasource';
export * from './lib/prediction/index';
export * from './lib/content.module'; export * from './lib/content.module';

View File

@ -24,6 +24,7 @@ export * from './src/api/auth-rest-api/index';
export * from './src/api/activiti-rest-api/index'; export * from './src/api/activiti-rest-api/index';
export * from './src/api/search-rest-api/index'; export * from './src/api/search-rest-api/index';
export * from './src/api/model-rest-api/index'; export * from './src/api/model-rest-api/index';
export * from './src/api/hxi-connector-api/index';
export * from './src/api/content-custom-api/api/content.api'; export * from './src/api/content-custom-api/api/content.api';
export * from './src/authentication/contentAuth'; export * from './src/authentication/contentAuth';

View File

@ -38,6 +38,7 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType {
discoveryClient: ContentClient; discoveryClient: ContentClient;
gsClient: ContentClient; gsClient: ContentClient;
authClient: ContentClient; authClient: ContentClient;
hxiConnectorClient: ContentClient;
oauth2Auth: Oauth2Auth; oauth2Auth: Oauth2Auth;
processAuth: ProcessAuth; processAuth: ProcessAuth;
contentAuth: ContentAuth; contentAuth: ContentAuth;
@ -164,6 +165,12 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType {
} else { } else {
this.processClient.setConfig(this.config); this.processClient.setConfig(this.config);
} }
if (!this.hxiConnectorClient) {
this.hxiConnectorClient = new ContentClient(this.config, `/api/${this.config.tenant}/private/hxi/versions/1`, this.httpClient);
} else {
this.hxiConnectorClient.setConfig(this.config, `/api/${this.config.tenant}/private/hxi/versions/1`);
}
} }
/**@private? */ /**@private? */
@ -175,6 +182,7 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType {
this.searchClient.off('error', () => {}); this.searchClient.off('error', () => {});
this.discoveryClient.off('error', () => {}); this.discoveryClient.off('error', () => {});
this.gsClient.off('error', () => {}); this.gsClient.off('error', () => {});
this.hxiConnectorClient.off('error', () => {});
this.contentClient.on('error', (error: any) => { this.contentClient.on('error', (error: any) => {
this.errorHandler(error); this.errorHandler(error);
@ -203,6 +211,10 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType {
this.gsClient.on('error', (error: any) => { this.gsClient.on('error', (error: any) => {
this.errorHandler(error); this.errorHandler(error);
}); });
this.hxiConnectorClient.on('error', (error: any) => {
this.errorHandler(error);
});
} }
/**@private? */ /**@private? */
@ -312,6 +324,7 @@ export class AlfrescoApi implements Emitter, AlfrescoApiType {
this.searchClient.setAuthentications(authECM); this.searchClient.setAuthentications(authECM);
this.discoveryClient.setAuthentications(authECM); this.discoveryClient.setAuthentications(authECM);
this.gsClient.setAuthentications(authECM); this.gsClient.setAuthentications(authECM);
this.hxiConnectorClient.setAuthentications(authECM);
} }
/** /**

View File

@ -0,0 +1,19 @@
**HX Insights Connector API**
Provides access to the HX Insights connector API endpoints.
## Documentation for API Endpoints
All URIs are relative to *https://localhost/alfresco/api/-default-/private/hxi/versions/1*
Class | Method | HTTP request | Description
------------ | ------------- | ------------- | -------------
*.PredictionsApi* | [**getPredictions**](docs/PredictionsApi.md#getPredictions) | **GET** /nodes/{nodeId}/predictions | Get predictions for a node.
## Documentation for Models
- [PredicitonsApi](docs/PredictionsApi.md)
- [Prediciton](docs/Prediction.md)
- [PredicitonEntry](docs/PredictionEntry.md)
- [PredicitonPagingList](docs/PredictionPagingList.md)
- [PredicitonPaging](docs/PredictionPaging.md)

View File

@ -0,0 +1,25 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { ApiClient } from '../../../api-clients/api-client';
import { LegacyHttpClient } from '../../../api-clients/http-client.interface';
export abstract class BaseApi extends ApiClient {
override get apiClient(): LegacyHttpClient {
return this.alfrescoApi.hxiConnectorClient;
}
}

View File

@ -0,0 +1,18 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './predictions.api';

View File

@ -0,0 +1,42 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { BaseApi } from './base.api';
import { throwIfNotDefined } from '../../../assert';
import { PredictionPaging } from '../model';
export class PredictionsApi extends BaseApi {
/**
* List of predictions for a node
*
* @param nodeId The identifier of a node.
* @returns Promise<PredictionPaging>
*/
getPredictions(nodeId: string): Promise<PredictionPaging> {
throwIfNotDefined(nodeId, 'nodeId');
const pathParams = {
nodeId
};
return this.get({
path: '/nodes/{nodeId}/predictions',
pathParams,
returnType: PredictionPaging
});
}
}

View File

@ -0,0 +1,14 @@
# Prediction
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**id** | **string** | Identifier of a prediction |
**modelId** | **string** | Identifier of a model that made the prediction |
**confidenceLevel** | **number** | Prediction confidence level |
**predictionDateTime** | **Date** | Prediction creation date |
**property** | **string** | Name of the property that prediction was made for |
**previousValue** | any | Previous property value |
**predictionValue** | any | Predicted value |
**updateType** | [**UpdateType**](../model/prediction.ts) | Update type |
**reviewStatus** | [**ReviewStatus**](../model/prediction.ts) | Prediction review status |

View File

@ -0,0 +1,8 @@
# PredictionEntry
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**entry** | [**Prediction**](Prediction.md) | |

View File

@ -0,0 +1,8 @@
# PredictionPaging
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**list** | [**PredictionPagingList**](PredictionPagingList.md) | |

View File

@ -0,0 +1,9 @@
# PredictionPagingList
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**pagination** | [**Pagination**](../../content-rest-api/docs/Pagination.md) | |
**entries** | [**PredictionEntry[]**](PredictionEntry.md) | |

View File

@ -0,0 +1,23 @@
# PredictionsApi
All URIs are relative to *https://localhost/alfresco/api/-default-/private/hxi/versions/1*
Method | HTTP request | Description
------------- | ------------- | -------------
[**getPredictions**](PredictionsApi.md#getPredictions) | **GET** /nodes/{nodeId}/predictions | Get predictions for node.
<a name="getPredictions"></a>
# **getPredictions**
> PredictionPaging getPredictions(nodeId)
Get predictions for a node.
### Parameters
Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**nodeId** | **string**| The identifier of a node. |
### Return type
[**PredictionPaging**](PredictionPaging.md)

View File

@ -0,0 +1,19 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './api';
export * from './model';

View File

@ -0,0 +1,21 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
export * from './prediction';
export * from './predictionEntry';
export * from './predictionPaging';
export * from './predictionPagingList';

View File

@ -0,0 +1,45 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { DateAlfresco } from '../../content-custom-api';
export class Prediction {
id: string;
modelId: string;
confidenceLevel: number;
predictionDateTime: Date;
property: string;
previousValue: any;
predictionValue: any;
updateType: UpdateType;
reviewStatus: ReviewStatus;
constructor(input?: Partial<Prediction>) {
if (input) {
Object.assign(this, input);
this.predictionDateTime = input.predictionDateTime ? DateAlfresco.parseDate(input.predictionDateTime) : undefined;
}
}
}
export type UpdateType = 'AUTOFILL' | 'AUTOCORRECT';
export enum ReviewStatus {
UNREVIEWED = 'UNREVIEWED',
CONFIRMED = 'CONFIRMED',
REJECTED = 'REJECTED'
}

View File

@ -0,0 +1,29 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Prediction } from './prediction';
export class PredictionEntry {
entry: Prediction;
constructor(input?: Partial<PredictionEntry>) {
if (input) {
Object.assign(this, input);
this.entry = input.entry ? new Prediction(input.entry) : undefined;
}
}
}

View File

@ -0,0 +1,29 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { PredictionPagingList } from './predictionPagingList';
export class PredictionPaging {
list?: PredictionPagingList;
constructor(input?: Partial<PredictionPaging>) {
if (input) {
Object.assign(this, input);
this.list = input.list ? new PredictionPagingList(input.list) : undefined;
}
}
}

View File

@ -0,0 +1,34 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Pagination } from '../../content-rest-api/model/pagination';
import { PredictionEntry } from './predictionEntry';
export class PredictionPagingList {
pagination?: Pagination;
entries?: PredictionEntry[];
constructor(input?: Partial<PredictionPagingList>) {
if (input) {
Object.assign(this, input);
this.pagination = input.pagination ? new Pagination(input.pagination) : undefined;
if (input.entries) {
this.entries = input.entries.map((item) => new PredictionEntry(item));
}
}
}
}

View File

@ -24,6 +24,7 @@ export * from './api/auth-rest-api';
export * from './api/activiti-rest-api'; export * from './api/activiti-rest-api';
export * from './api/search-rest-api'; export * from './api/search-rest-api';
export * from './api/model-rest-api'; export * from './api/model-rest-api';
export * from './api/hxi-connector-api';
export * from './api/content-custom-api/api/content.api'; export * from './api/content-custom-api/api/content.api';
export * from './authentication/contentAuth'; export * from './authentication/contentAuth';

View File

@ -34,6 +34,7 @@ export interface AlfrescoApiType {
gsClient: LegacyHttpClient; gsClient: LegacyHttpClient;
authClient: LegacyHttpClient; authClient: LegacyHttpClient;
processAuth: LegacyHttpClient; processAuth: LegacyHttpClient;
hxiConnectorClient: LegacyHttpClient;
setConfig(config: AlfrescoApiConfig): void; setConfig(config: AlfrescoApiConfig): void;
changeWithCredentialsConfig(withCredentials: boolean): void; changeWithCredentialsConfig(withCredentials: boolean): void;