@memberjunction/ai-recommendations 6.1.4 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Engine.d.ts +6 -6
- package/dist/Engine.js +13 -13
- package/dist/ProviderBase.d.ts +1 -1
- package/dist/ProviderBase.js +2 -2
- package/package.json +5 -5
package/dist/Engine.d.ts
CHANGED
|
@@ -5,14 +5,14 @@ import { RecommendationRequest, RecommendationResult } from './generic/types.js'
|
|
|
5
5
|
* Engine class to be used for running all recommendation requests
|
|
6
6
|
*/
|
|
7
7
|
export declare class RecommendationEngineBase extends BaseEngine<RecommendationEngineBase> {
|
|
8
|
-
private
|
|
8
|
+
private _recommendationProviders;
|
|
9
9
|
static get Instance(): RecommendationEngineBase;
|
|
10
10
|
get RecommendationProviders(): MJRecommendationProviderEntity[];
|
|
11
11
|
Config(forceRefresh?: boolean, contextUser?: UserInfo, provider?: IMetadataProvider): Promise<void>;
|
|
12
12
|
Recommend<T>(request: RecommendationRequest<T>): Promise<RecommendationResult>;
|
|
13
|
-
private
|
|
14
|
-
private
|
|
15
|
-
private
|
|
13
|
+
private getRecommendationEntities;
|
|
14
|
+
private getRecommendationsByListID;
|
|
15
|
+
private getRecommendationsByRecordIDs;
|
|
16
16
|
/**
|
|
17
17
|
* Builds the filter that selects exactly the given records of `entity`. Each id is a compact
|
|
18
18
|
* CompositeKey URL segment — what `MJ: List Details.RecordID` holds and what callers pass to
|
|
@@ -22,7 +22,7 @@ export declare class RecommendationEngineBase extends BaseEngine<RecommendationE
|
|
|
22
22
|
* compared against a multi-column value.
|
|
23
23
|
*/
|
|
24
24
|
protected BuildPrimaryKeyFilter(entity: EntityInfo, recordIDs: Array<string | number>): string;
|
|
25
|
-
private
|
|
26
|
-
private
|
|
25
|
+
private createRecommendationErrorList;
|
|
26
|
+
private isNullOrUndefined;
|
|
27
27
|
}
|
|
28
28
|
//# sourceMappingURL=Engine.d.ts.map
|
package/dist/Engine.js
CHANGED
|
@@ -7,18 +7,18 @@ import { RecommendationProviderBase } from './ProviderBase.js';
|
|
|
7
7
|
export class RecommendationEngineBase extends BaseEngine {
|
|
8
8
|
constructor() {
|
|
9
9
|
super(...arguments);
|
|
10
|
-
this.
|
|
10
|
+
this._recommendationProviders = [];
|
|
11
11
|
}
|
|
12
12
|
static get Instance() {
|
|
13
13
|
return super.getInstance();
|
|
14
14
|
}
|
|
15
15
|
get RecommendationProviders() {
|
|
16
|
-
return this.
|
|
16
|
+
return this._recommendationProviders;
|
|
17
17
|
}
|
|
18
18
|
async Config(forceRefresh, contextUser, provider) {
|
|
19
19
|
const params = [
|
|
20
20
|
{
|
|
21
|
-
PropertyName: '
|
|
21
|
+
PropertyName: '_recommendationProviders',
|
|
22
22
|
EntityName: 'MJ: Recommendation Providers',
|
|
23
23
|
CacheLocal: true
|
|
24
24
|
},
|
|
@@ -42,7 +42,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
42
42
|
if (!driver) {
|
|
43
43
|
throw new Error(`Could not find driver for provider: ${provider.Name}`);
|
|
44
44
|
}
|
|
45
|
-
const recommendations = await this.
|
|
45
|
+
const recommendations = await this.getRecommendationEntities(request);
|
|
46
46
|
LogStatus(`Processing ${recommendations.length} recommendations`);
|
|
47
47
|
if (recommendations.length == 0) {
|
|
48
48
|
return {
|
|
@@ -65,7 +65,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
65
65
|
throw new Error('Error creating Recommendation Run entity');
|
|
66
66
|
}
|
|
67
67
|
if (request.CreateErrorList) {
|
|
68
|
-
const errorList = await this.
|
|
68
|
+
const errorList = await this.createRecommendationErrorList(recommendationRunEntity.ID, recommendations[0].SourceEntityID, request.CurrentUser);
|
|
69
69
|
if (errorList) {
|
|
70
70
|
request.ErrorListID = errorList.ID;
|
|
71
71
|
}
|
|
@@ -81,16 +81,16 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
81
81
|
}
|
|
82
82
|
return recommendResult;
|
|
83
83
|
}
|
|
84
|
-
async
|
|
84
|
+
async getRecommendationEntities(request) {
|
|
85
85
|
if (request.Recommendations) {
|
|
86
|
-
const invalidEntities = request.Recommendations.filter((r) => !this.
|
|
86
|
+
const invalidEntities = request.Recommendations.filter((r) => !this.isNullOrUndefined(r.RecommendationRunID) || r.IsSaved);
|
|
87
87
|
if (invalidEntities.length > 0) {
|
|
88
88
|
throw new Error(`Recommendation entities must be new, not saved and have their RecommendationRunID not set. Invalid entities: ${invalidEntities.map((r) => r.ID).join(',')}`);
|
|
89
89
|
}
|
|
90
90
|
return request.Recommendations;
|
|
91
91
|
}
|
|
92
92
|
else if (request.ListID) {
|
|
93
|
-
return await this.
|
|
93
|
+
return await this.getRecommendationsByListID(request.ListID, request.CurrentUser);
|
|
94
94
|
}
|
|
95
95
|
else if (request.EntityAndRecordsInfo) {
|
|
96
96
|
const entityName = request.EntityAndRecordsInfo.EntityName;
|
|
@@ -101,10 +101,10 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
101
101
|
if (!recordIDs) {
|
|
102
102
|
throw new Error('RecordIDs are required in EntityAndRecordsInfo');
|
|
103
103
|
}
|
|
104
|
-
return await this.
|
|
104
|
+
return await this.getRecommendationsByRecordIDs(entityName, recordIDs, request.CurrentUser);
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
async
|
|
107
|
+
async getRecommendationsByListID(listID, currentUser) {
|
|
108
108
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
109
109
|
const md = this.ProviderToUse;
|
|
110
110
|
const rvListDetailsResult = await rv.RunViews([
|
|
@@ -159,7 +159,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
159
159
|
}
|
|
160
160
|
return recommendations;
|
|
161
161
|
}
|
|
162
|
-
async
|
|
162
|
+
async getRecommendationsByRecordIDs(entityName, recordIDs, currentUser) {
|
|
163
163
|
const md = this.ProviderToUse;
|
|
164
164
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
165
165
|
const entity = md.Entities.find((e) => e.Name.toLowerCase() == entityName.toLowerCase());
|
|
@@ -204,7 +204,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
204
204
|
}
|
|
205
205
|
return recordIDs.map((id) => `(${CompositeKey.FromURLSegment(entity, String(id)).ToWhereClause()})`).join(' OR ');
|
|
206
206
|
}
|
|
207
|
-
async
|
|
207
|
+
async createRecommendationErrorList(recommendationRunID, entityID, currentUser) {
|
|
208
208
|
const md = this.ProviderToUse;
|
|
209
209
|
const list = await md.GetEntityObject('MJ: Lists', currentUser);
|
|
210
210
|
list.Name = `Recommendation Run ${recommendationRunID} Errors`;
|
|
@@ -220,7 +220,7 @@ export class RecommendationEngineBase extends BaseEngine {
|
|
|
220
220
|
}
|
|
221
221
|
return list;
|
|
222
222
|
}
|
|
223
|
-
|
|
223
|
+
isNullOrUndefined(value) {
|
|
224
224
|
return value === null || value === undefined;
|
|
225
225
|
}
|
|
226
226
|
}
|
package/dist/ProviderBase.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { RecommendationRequest, RecommendationResult } from './generic/types.js'
|
|
|
5
5
|
* Base class for all recommendation providers
|
|
6
6
|
*/
|
|
7
7
|
export declare abstract class RecommendationProviderBase {
|
|
8
|
-
private
|
|
8
|
+
private _contextUser;
|
|
9
9
|
private _provider;
|
|
10
10
|
constructor(ContextUser: UserInfo);
|
|
11
11
|
get ContextUser(): UserInfo;
|
package/dist/ProviderBase.js
CHANGED
|
@@ -5,10 +5,10 @@ import { LogError, Metadata } from '@memberjunction/core';
|
|
|
5
5
|
export class RecommendationProviderBase {
|
|
6
6
|
constructor(ContextUser) {
|
|
7
7
|
this._provider = null;
|
|
8
|
-
this.
|
|
8
|
+
this._contextUser = ContextUser;
|
|
9
9
|
}
|
|
10
10
|
get ContextUser() {
|
|
11
|
-
return this.
|
|
11
|
+
return this._contextUser;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
14
|
* Optional metadata provider override. Callers should set
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ai-recommendations",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.1
|
|
4
|
+
"version": "6.2.0-edge.1",
|
|
5
5
|
"description": "MemberJunction Recommendations Engine",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
"typescript": "^5.9.3"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@memberjunction/global": "6.1
|
|
19
|
-
"@memberjunction/core": "6.1
|
|
20
|
-
"@memberjunction/core-entities": "6.1
|
|
21
|
-
"@memberjunction/ai": "6.1
|
|
18
|
+
"@memberjunction/global": "6.2.0-edge.1",
|
|
19
|
+
"@memberjunction/core": "6.2.0-edge.1",
|
|
20
|
+
"@memberjunction/core-entities": "6.2.0-edge.1",
|
|
21
|
+
"@memberjunction/ai": "6.2.0-edge.1"
|
|
22
22
|
},
|
|
23
23
|
"repository": {
|
|
24
24
|
"type": "git",
|