@memberjunction/server 2.35.0 → 2.36.0
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/README.md +15 -1
- package/dist/config.d.ts +69 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -1
- package/dist/config.js.map +1 -1
- package/dist/generated/generated.d.ts +15 -12
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +73 -58
- package/dist/generated/generated.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.d.ts +60 -5
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
- package/dist/resolvers/AskSkipResolver.js +587 -31
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +29 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -0
- package/dist/rest/EntityCRUDHandler.js +197 -0
- package/dist/rest/EntityCRUDHandler.js.map +1 -0
- package/dist/rest/RESTEndpointHandler.d.ts +41 -0
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -0
- package/dist/rest/RESTEndpointHandler.js +537 -0
- package/dist/rest/RESTEndpointHandler.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts +21 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -0
- package/dist/rest/ViewOperationsHandler.js +144 -0
- package/dist/rest/ViewOperationsHandler.js.map +1 -0
- package/dist/rest/index.d.ts +5 -0
- package/dist/rest/index.d.ts.map +1 -0
- package/dist/rest/index.js +5 -0
- package/dist/rest/index.js.map +1 -0
- package/dist/rest/setupRESTEndpoints.d.ts +12 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -0
- package/dist/rest/setupRESTEndpoints.js +27 -0
- package/dist/rest/setupRESTEndpoints.js.map +1 -0
- package/dist/scheduler/LearningCycleScheduler.d.ts +44 -0
- package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -0
- package/dist/scheduler/LearningCycleScheduler.js +188 -0
- package/dist/scheduler/LearningCycleScheduler.js.map +1 -0
- package/package.json +24 -26
- package/src/config.ts +15 -1
- package/src/generated/generated.ts +53 -44
- package/src/index.ts +56 -1
- package/src/resolvers/AskSkipResolver.ts +787 -51
- package/src/rest/EntityCRUDHandler.ts +279 -0
- package/src/rest/RESTEndpointHandler.ts +834 -0
- package/src/rest/ViewOperationsHandler.ts +207 -0
- package/src/rest/index.ts +4 -0
- package/src/rest/setupRESTEndpoints.ts +89 -0
- package/src/scheduler/LearningCycleScheduler.ts +312 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { LogError, Metadata, RunView } from '@memberjunction/core';
|
|
2
|
+
export class ViewOperationsHandler {
|
|
3
|
+
static async runView(params, user) {
|
|
4
|
+
try {
|
|
5
|
+
const md = new Metadata();
|
|
6
|
+
const entity = md.Entities.find(e => e.Name === params.EntityName);
|
|
7
|
+
if (!entity) {
|
|
8
|
+
return {
|
|
9
|
+
success: false,
|
|
10
|
+
error: `Entity '${params.EntityName}' not found`
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const permissions = entity.GetUserPermisions(user);
|
|
14
|
+
if (!permissions.CanRead) {
|
|
15
|
+
return {
|
|
16
|
+
success: false,
|
|
17
|
+
error: `User ${user.Name} does not have permission to read ${params.EntityName} records`
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
this.sanitizeRunViewParams(params);
|
|
21
|
+
const runView = new RunView();
|
|
22
|
+
const result = await runView.RunView(params, user);
|
|
23
|
+
return { success: true, result };
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
LogError(error);
|
|
27
|
+
return { success: false, error: error?.message || 'Unknown error' };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
static async runViews(paramsArray, user) {
|
|
31
|
+
try {
|
|
32
|
+
const md = new Metadata();
|
|
33
|
+
for (const params of paramsArray) {
|
|
34
|
+
const entity = md.Entities.find(e => e.Name === params.EntityName);
|
|
35
|
+
if (!entity) {
|
|
36
|
+
return {
|
|
37
|
+
success: false,
|
|
38
|
+
error: `Entity '${params.EntityName}' not found`
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const permissions = entity.GetUserPermisions(user);
|
|
42
|
+
if (!permissions.CanRead) {
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
error: `User ${user.Name} does not have permission to read ${params.EntityName} records`
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
this.sanitizeRunViewParams(params);
|
|
49
|
+
}
|
|
50
|
+
const runView = new RunView();
|
|
51
|
+
const results = await runView.RunViews(paramsArray, user);
|
|
52
|
+
return { success: true, results };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
LogError(error);
|
|
56
|
+
return { success: false, error: error?.message || 'Unknown error' };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
static async listEntities(params, user) {
|
|
60
|
+
try {
|
|
61
|
+
const md = new Metadata();
|
|
62
|
+
const entity = md.Entities.find(e => e.Name === params.EntityName);
|
|
63
|
+
if (!entity) {
|
|
64
|
+
throw new Error(`Entity '${params.EntityName}' not found`);
|
|
65
|
+
}
|
|
66
|
+
const permissions = entity.GetUserPermisions(user);
|
|
67
|
+
if (!permissions.CanRead) {
|
|
68
|
+
throw new Error(`User ${user.Name} does not have permission to read ${params.EntityName} records`);
|
|
69
|
+
}
|
|
70
|
+
this.sanitizeRunViewParams(params);
|
|
71
|
+
const runView = new RunView();
|
|
72
|
+
return await runView.RunView(params, user);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
LogError(error);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
static async getEntityViews(entityName, user) {
|
|
80
|
+
try {
|
|
81
|
+
const md = new Metadata();
|
|
82
|
+
const entity = md.Entities.find(e => e.Name === entityName);
|
|
83
|
+
if (!entity) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: `Entity '${entityName}' not found`
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const permissions = entity.GetUserPermisions(user);
|
|
90
|
+
if (!permissions.CanRead) {
|
|
91
|
+
return {
|
|
92
|
+
success: false,
|
|
93
|
+
error: `User ${user.Name} does not have permission to read ${entityName} records`
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const params = {
|
|
97
|
+
EntityName: 'User Views',
|
|
98
|
+
ExtraFilter: `Entity = '${entityName}'`
|
|
99
|
+
};
|
|
100
|
+
const runView = new RunView();
|
|
101
|
+
const result = await runView.RunView(params, user);
|
|
102
|
+
if (!result.Success) {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
error: result.ErrorMessage || 'Failed to retrieve views'
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const views = result.Results.map(view => ({
|
|
109
|
+
ID: view.ID,
|
|
110
|
+
Name: view.Name,
|
|
111
|
+
Description: view.Description,
|
|
112
|
+
IsShared: view.IsShared,
|
|
113
|
+
CreatedAt: view.CreatedAt
|
|
114
|
+
}));
|
|
115
|
+
return { success: true, views };
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
LogError(error);
|
|
119
|
+
return { success: false, error: error?.message || 'Unknown error' };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
static sanitizeRunViewParams(params) {
|
|
123
|
+
if (!params.EntityName) {
|
|
124
|
+
throw new Error('EntityName is required');
|
|
125
|
+
}
|
|
126
|
+
if (params.Fields && typeof params.Fields === 'string') {
|
|
127
|
+
params.Fields = params.Fields.split(',');
|
|
128
|
+
}
|
|
129
|
+
if (params.MaxRows !== undefined) {
|
|
130
|
+
params.MaxRows = typeof params.MaxRows === 'string'
|
|
131
|
+
? parseInt(params.MaxRows)
|
|
132
|
+
: params.MaxRows;
|
|
133
|
+
}
|
|
134
|
+
if (params.StartRow !== undefined) {
|
|
135
|
+
params.StartRow = typeof params.StartRow === 'string'
|
|
136
|
+
? parseInt(params.StartRow)
|
|
137
|
+
: params.StartRow;
|
|
138
|
+
}
|
|
139
|
+
if (!params.ResultType) {
|
|
140
|
+
params.ResultType = 'simple';
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=ViewOperationsHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewOperationsHandler.js","sourceRoot":"","sources":["../../src/rest/ViewOperationsHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rest/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
export declare const ___REST_API_BASE_PATH = "/api/v1";
|
|
3
|
+
export interface RESTApiOptions {
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
includeEntities?: string[];
|
|
6
|
+
excludeEntities?: string[];
|
|
7
|
+
includeSchemas?: string[];
|
|
8
|
+
excludeSchemas?: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare const DEFAULT_REST_API_OPTIONS: RESTApiOptions;
|
|
11
|
+
export declare function setupRESTEndpoints(app: express.Application, options?: Partial<RESTApiOptions>, authMiddleware?: express.RequestHandler): void;
|
|
12
|
+
//# sourceMappingURL=setupRESTEndpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupRESTEndpoints.d.ts","sourceRoot":"","sources":["../../src/rest/setupRESTEndpoints.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAI9B,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAK/C,MAAM,WAAW,cAAc;IAI3B,OAAO,EAAE,OAAO,CAAC;IAOjB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAQ3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAM3B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAO1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAKD,eAAO,MAAM,wBAAwB,EAAE,cAEtC,CAAC;AAQF,wBAAgB,kBAAkB,CAC9B,GAAG,EAAE,OAAO,CAAC,WAAW,EACxB,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,EACjC,cAAc,CAAC,EAAE,OAAO,CAAC,cAAc,GACxC,IAAI,CA2BN"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { RESTEndpointHandler } from './RESTEndpointHandler.js';
|
|
2
|
+
export const ___REST_API_BASE_PATH = '/api/v1';
|
|
3
|
+
export const DEFAULT_REST_API_OPTIONS = {
|
|
4
|
+
enabled: true,
|
|
5
|
+
};
|
|
6
|
+
export function setupRESTEndpoints(app, options, authMiddleware) {
|
|
7
|
+
const config = { ...DEFAULT_REST_API_OPTIONS, ...options };
|
|
8
|
+
if (!config.enabled) {
|
|
9
|
+
console.log('REST API endpoints are disabled');
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
const restHandler = new RESTEndpointHandler({
|
|
13
|
+
includeEntities: config.includeEntities ? config.includeEntities.map(e => e.toLowerCase()) : undefined,
|
|
14
|
+
excludeEntities: config.excludeEntities ? config.excludeEntities.map(e => e.toLowerCase()) : undefined,
|
|
15
|
+
includeSchemas: config.includeSchemas ? config.includeSchemas.map(s => s.toLowerCase()) : undefined,
|
|
16
|
+
excludeSchemas: config.excludeSchemas ? config.excludeSchemas.map(s => s.toLowerCase()) : undefined
|
|
17
|
+
});
|
|
18
|
+
const basePath = ___REST_API_BASE_PATH;
|
|
19
|
+
if (authMiddleware) {
|
|
20
|
+
app.use(basePath, authMiddleware, restHandler.getRouter());
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
app.use(basePath, restHandler.getRouter());
|
|
24
|
+
}
|
|
25
|
+
console.log(`REST API endpoints have been set up at ${basePath}`);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=setupRESTEndpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupRESTEndpoints.js","sourceRoot":"","sources":["../../src/rest/setupRESTEndpoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC;AA2C/C,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACpD,OAAO,EAAE,IAAI;CAChB,CAAC;AAQF,MAAM,UAAU,kBAAkB,CAC9B,GAAwB,EACxB,OAAiC,EACjC,cAAuC;IAGvC,MAAM,MAAM,GAAG,EAAE,GAAG,wBAAwB,EAAE,GAAG,OAAO,EAAE,CAAC;IAG3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO;IACX,CAAC;IAGD,MAAM,WAAW,GAAG,IAAI,mBAAmB,CAAC;QACxC,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACtG,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACtG,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;QACnG,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;KACtG,CAAC,CAAC;IAGH,MAAM,QAAQ,GAAG,qBAAqB,CAAC;IACvC,IAAI,cAAc,EAAE,CAAC;QACjB,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACJ,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DataSourceInfo } from '../types.js';
|
|
2
|
+
import { BaseSingleton } from '@memberjunction/global';
|
|
3
|
+
export declare class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler> {
|
|
4
|
+
private intervalId;
|
|
5
|
+
private runningOrganizations;
|
|
6
|
+
private lastRunTime;
|
|
7
|
+
private dataSources;
|
|
8
|
+
protected constructor();
|
|
9
|
+
static get Instance(): LearningCycleScheduler;
|
|
10
|
+
setDataSources(dataSources: DataSourceInfo[]): void;
|
|
11
|
+
start(intervalMinutes?: number): void;
|
|
12
|
+
stop(): void;
|
|
13
|
+
runLearningCycle(): Promise<boolean>;
|
|
14
|
+
getStatus(): {
|
|
15
|
+
isSchedulerRunning: boolean;
|
|
16
|
+
lastRunTime: Date;
|
|
17
|
+
runningOrganizations: {
|
|
18
|
+
organizationId: string;
|
|
19
|
+
learningCycleId: string;
|
|
20
|
+
startTime: Date;
|
|
21
|
+
runningForMinutes: number;
|
|
22
|
+
}[];
|
|
23
|
+
};
|
|
24
|
+
isOrganizationRunningCycle(organizationId: string): {
|
|
25
|
+
isRunning: boolean;
|
|
26
|
+
startTime?: Date;
|
|
27
|
+
learningCycleId?: string;
|
|
28
|
+
runningForMinutes?: number;
|
|
29
|
+
};
|
|
30
|
+
registerRunningCycle(organizationId: string, learningCycleId: string): boolean;
|
|
31
|
+
unregisterRunningCycle(organizationId: string): boolean;
|
|
32
|
+
manuallyExecuteLearningCycle(organizationId?: string): Promise<boolean>;
|
|
33
|
+
stopLearningCycleForOrganization(organizationId: string): {
|
|
34
|
+
success: boolean;
|
|
35
|
+
message: string;
|
|
36
|
+
wasRunning: boolean;
|
|
37
|
+
cycleDetails?: {
|
|
38
|
+
learningCycleId: string;
|
|
39
|
+
startTime: Date;
|
|
40
|
+
runningForMinutes: number;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=LearningCycleScheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LearningCycleScheduler.d.ts","sourceRoot":"","sources":["../../src/scheduler/LearningCycleScheduler.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAMvD,qBAAa,sBAAuB,SAAQ,aAAa,CAAC,sBAAsB,CAAC;IAC/E,OAAO,CAAC,UAAU,CAA+B;IAGjD,OAAO,CAAC,oBAAoB,CAAwE;IAEpG,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAAwB;IAG3C,SAAS;IAIT,WAAkB,QAAQ,IAAI,sBAAsB,CAEnD;IAMM,cAAc,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI;IAQnD,KAAK,CAAC,eAAe,GAAE,MAAW,GAAG,IAAI;IAoBzC,IAAI,IAAI,IAAI;IAYN,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IA2D1C,SAAS;;;;;;;;;;IAkBT,0BAA0B,CAC/B,cAAc,EAAE,MAAM,GACrB;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,IAAI,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE;IAyB1F,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO;IAsB9E,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO;IAgBjD,4BAA4B,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAmD7E,gCAAgC,CAAC,cAAc,EAAE,MAAM,GAAG;QAC/D,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,CAAC,EAAE;YAAE,eAAe,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,IAAI,CAAC;YAAC,iBAAiB,EAAE,MAAM,CAAA;SAAE,CAAA;KACvF;CAuCF"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { LogStatus, LogError } from '@memberjunction/core';
|
|
2
|
+
import { GetReadWriteDataSource } from '../util.js';
|
|
3
|
+
import { AskSkipResolver } from '../resolvers/AskSkipResolver.js';
|
|
4
|
+
import { getSystemUser } from '../auth/index.js';
|
|
5
|
+
import { BaseSingleton } from '@memberjunction/global';
|
|
6
|
+
export class LearningCycleScheduler extends BaseSingleton {
|
|
7
|
+
intervalId = null;
|
|
8
|
+
runningOrganizations = new Map();
|
|
9
|
+
lastRunTime = null;
|
|
10
|
+
dataSources = [];
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
}
|
|
14
|
+
static get Instance() {
|
|
15
|
+
return super.getInstance();
|
|
16
|
+
}
|
|
17
|
+
setDataSources(dataSources) {
|
|
18
|
+
this.dataSources = dataSources;
|
|
19
|
+
}
|
|
20
|
+
start(intervalMinutes = 60) {
|
|
21
|
+
this.runLearningCycle()
|
|
22
|
+
.catch(error => LogError(`Error in initial learning cycle: ${error}`));
|
|
23
|
+
const intervalMs = intervalMinutes * 60 * 1000;
|
|
24
|
+
LogStatus(`Starting learning cycle scheduler with interval of ${intervalMinutes} minutes`);
|
|
25
|
+
this.intervalId = setInterval(() => {
|
|
26
|
+
this.runLearningCycle()
|
|
27
|
+
.catch(error => LogError(`Error in scheduled learning cycle: ${error}`));
|
|
28
|
+
}, intervalMs);
|
|
29
|
+
}
|
|
30
|
+
stop() {
|
|
31
|
+
if (this.intervalId) {
|
|
32
|
+
clearInterval(this.intervalId);
|
|
33
|
+
this.intervalId = null;
|
|
34
|
+
LogStatus('Learning cycle scheduler stopped');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async runLearningCycle() {
|
|
38
|
+
const startTime = new Date();
|
|
39
|
+
try {
|
|
40
|
+
LogStatus('Starting scheduled learning cycle execution');
|
|
41
|
+
if (!this.dataSources || this.dataSources.length === 0) {
|
|
42
|
+
throw new Error('No data sources available for the learning cycle');
|
|
43
|
+
}
|
|
44
|
+
const dataSource = GetReadWriteDataSource(this.dataSources);
|
|
45
|
+
const systemUser = await getSystemUser(dataSource);
|
|
46
|
+
if (!systemUser) {
|
|
47
|
+
throw new Error('System user not found');
|
|
48
|
+
}
|
|
49
|
+
const context = {
|
|
50
|
+
dataSource: dataSource,
|
|
51
|
+
dataSources: this.dataSources,
|
|
52
|
+
userPayload: {
|
|
53
|
+
email: systemUser.Email,
|
|
54
|
+
sessionId: `scheduler_${Date.now()}`,
|
|
55
|
+
userRecord: systemUser,
|
|
56
|
+
isSystemUser: true
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const skipResolver = new AskSkipResolver();
|
|
60
|
+
const result = await skipResolver.ExecuteAskSkipLearningCycle(context, false);
|
|
61
|
+
const endTime = new Date();
|
|
62
|
+
const elapsedMs = endTime.getTime() - startTime.getTime();
|
|
63
|
+
this.lastRunTime = startTime;
|
|
64
|
+
if (result.success) {
|
|
65
|
+
LogStatus(`Learning cycle completed successfully in ${elapsedMs}ms`);
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
LogError(`Learning cycle failed after ${elapsedMs}ms: ${result.error}`);
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
LogError(`Error executing learning cycle: ${error}`);
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
getStatus() {
|
|
79
|
+
return {
|
|
80
|
+
isSchedulerRunning: this.intervalId !== null,
|
|
81
|
+
lastRunTime: this.lastRunTime,
|
|
82
|
+
runningOrganizations: Array.from(this.runningOrganizations.entries()).map(([orgId, info]) => ({
|
|
83
|
+
organizationId: orgId,
|
|
84
|
+
learningCycleId: info.learningCycleId,
|
|
85
|
+
startTime: info.startTime,
|
|
86
|
+
runningForMinutes: (new Date().getTime() - info.startTime.getTime()) / (1000 * 60)
|
|
87
|
+
}))
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
isOrganizationRunningCycle(organizationId) {
|
|
91
|
+
const runningInfo = this.runningOrganizations.get(organizationId);
|
|
92
|
+
if (runningInfo) {
|
|
93
|
+
const now = new Date();
|
|
94
|
+
const elapsedMinutes = (now.getTime() - runningInfo.startTime.getTime()) / (1000 * 60);
|
|
95
|
+
return {
|
|
96
|
+
isRunning: true,
|
|
97
|
+
startTime: runningInfo.startTime,
|
|
98
|
+
learningCycleId: runningInfo.learningCycleId,
|
|
99
|
+
runningForMinutes: elapsedMinutes
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return { isRunning: false };
|
|
103
|
+
}
|
|
104
|
+
registerRunningCycle(organizationId, learningCycleId) {
|
|
105
|
+
const { isRunning } = this.isOrganizationRunningCycle(organizationId);
|
|
106
|
+
if (isRunning) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
this.runningOrganizations.set(organizationId, {
|
|
110
|
+
startTime: new Date(),
|
|
111
|
+
learningCycleId
|
|
112
|
+
});
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
unregisterRunningCycle(organizationId) {
|
|
116
|
+
if (this.runningOrganizations.has(organizationId)) {
|
|
117
|
+
this.runningOrganizations.delete(organizationId);
|
|
118
|
+
return true;
|
|
119
|
+
}
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
async manuallyExecuteLearningCycle(organizationId) {
|
|
123
|
+
try {
|
|
124
|
+
LogStatus('🧪 Manually executing learning cycle for testing...');
|
|
125
|
+
const learningCycleId = `manual_${Date.now()}`;
|
|
126
|
+
let orgRegistered = false;
|
|
127
|
+
if (organizationId) {
|
|
128
|
+
const runningStatus = this.isOrganizationRunningCycle(organizationId);
|
|
129
|
+
if (runningStatus.isRunning) {
|
|
130
|
+
LogError(`Organization ${organizationId} is already running a learning cycle. Cannot start a new one.`);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
orgRegistered = this.registerRunningCycle(organizationId, learningCycleId);
|
|
134
|
+
if (!orgRegistered) {
|
|
135
|
+
LogError(`Failed to register organization ${organizationId} for manual learning cycle execution`);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
const result = await this.runLearningCycle();
|
|
140
|
+
LogStatus(`🧪 Manual learning cycle execution completed with result: ${result ? 'Success' : 'Failed'}`);
|
|
141
|
+
if (organizationId && orgRegistered) {
|
|
142
|
+
this.unregisterRunningCycle(organizationId);
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (organizationId && this.runningOrganizations.has(organizationId)) {
|
|
148
|
+
this.unregisterRunningCycle(organizationId);
|
|
149
|
+
}
|
|
150
|
+
LogError(`Error in manual learning cycle execution: ${error}`);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
stopLearningCycleForOrganization(organizationId) {
|
|
155
|
+
const runningStatus = this.isOrganizationRunningCycle(organizationId);
|
|
156
|
+
if (!runningStatus.isRunning) {
|
|
157
|
+
return {
|
|
158
|
+
success: false,
|
|
159
|
+
message: `No running learning cycle found for organization ${organizationId}`,
|
|
160
|
+
wasRunning: false
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const startTime = runningStatus.startTime;
|
|
164
|
+
const learningCycleId = runningStatus.learningCycleId;
|
|
165
|
+
const runningForMinutes = runningStatus.runningForMinutes;
|
|
166
|
+
const unregistered = this.unregisterRunningCycle(organizationId);
|
|
167
|
+
if (unregistered) {
|
|
168
|
+
return {
|
|
169
|
+
success: true,
|
|
170
|
+
message: `Successfully stopped learning cycle for organization ${organizationId}`,
|
|
171
|
+
wasRunning: true,
|
|
172
|
+
cycleDetails: {
|
|
173
|
+
learningCycleId,
|
|
174
|
+
startTime,
|
|
175
|
+
runningForMinutes
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
return {
|
|
181
|
+
success: false,
|
|
182
|
+
message: `Failed to stop learning cycle for organization ${organizationId}`,
|
|
183
|
+
wasRunning: true
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=LearningCycleScheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LearningCycleScheduler.js","sourceRoot":"","sources":["../../src/scheduler/LearningCycleScheduler.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.36.0",
|
|
4
4
|
"description": "MemberJunction: This project provides API access via GraphQL to the common data store.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -17,33 +17,32 @@
|
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsc",
|
|
19
19
|
"bundle": "tsc -noEmit && pkgroll --sourcemap --minify",
|
|
20
|
-
"watch": "tsc -w"
|
|
21
|
-
"postinstall": "playwright install chromium"
|
|
20
|
+
"watch": "tsc -w"
|
|
22
21
|
},
|
|
23
22
|
"dependencies": {
|
|
24
23
|
"@apollo/server": "^4.9.1",
|
|
25
24
|
"@graphql-tools/utils": "^10.0.1",
|
|
26
|
-
"@memberjunction/actions": "2.
|
|
27
|
-
"@memberjunction/ai": "2.
|
|
28
|
-
"@memberjunction/ai-mistral": "2.
|
|
29
|
-
"@memberjunction/ai-openai": "2.
|
|
30
|
-
"@memberjunction/ai-vectors-pinecone": "2.
|
|
31
|
-
"@memberjunction/aiengine": "2.
|
|
32
|
-
"@memberjunction/core": "2.
|
|
33
|
-
"@memberjunction/core-actions": "2.
|
|
34
|
-
"@memberjunction/core-entities": "2.
|
|
35
|
-
"@memberjunction/data-context": "2.
|
|
36
|
-
"@memberjunction/data-context-server": "2.
|
|
37
|
-
"@memberjunction/doc-utils": "2.
|
|
38
|
-
"@memberjunction/entity-communications-server": "2.
|
|
39
|
-
"@memberjunction/external-change-detection": "2.
|
|
40
|
-
"@memberjunction/global": "2.
|
|
41
|
-
"@memberjunction/graphql-dataprovider": "2.
|
|
42
|
-
"@memberjunction/queue": "2.
|
|
43
|
-
"@memberjunction/skip-types": "2.
|
|
44
|
-
"@memberjunction/sqlserver-dataprovider": "2.
|
|
45
|
-
"@memberjunction/storage": "2.
|
|
46
|
-
"@memberjunction/templates": "2.
|
|
25
|
+
"@memberjunction/actions": "2.36.0",
|
|
26
|
+
"@memberjunction/ai": "2.36.0",
|
|
27
|
+
"@memberjunction/ai-mistral": "2.36.0",
|
|
28
|
+
"@memberjunction/ai-openai": "2.36.0",
|
|
29
|
+
"@memberjunction/ai-vectors-pinecone": "2.36.0",
|
|
30
|
+
"@memberjunction/aiengine": "2.36.0",
|
|
31
|
+
"@memberjunction/core": "2.36.0",
|
|
32
|
+
"@memberjunction/core-actions": "2.36.0",
|
|
33
|
+
"@memberjunction/core-entities": "2.36.0",
|
|
34
|
+
"@memberjunction/data-context": "2.36.0",
|
|
35
|
+
"@memberjunction/data-context-server": "2.36.0",
|
|
36
|
+
"@memberjunction/doc-utils": "2.36.0",
|
|
37
|
+
"@memberjunction/entity-communications-server": "2.36.0",
|
|
38
|
+
"@memberjunction/external-change-detection": "2.36.0",
|
|
39
|
+
"@memberjunction/global": "2.36.0",
|
|
40
|
+
"@memberjunction/graphql-dataprovider": "2.36.0",
|
|
41
|
+
"@memberjunction/queue": "2.36.0",
|
|
42
|
+
"@memberjunction/skip-types": "2.36.0",
|
|
43
|
+
"@memberjunction/sqlserver-dataprovider": "2.36.0",
|
|
44
|
+
"@memberjunction/storage": "2.36.0",
|
|
45
|
+
"@memberjunction/templates": "2.36.0",
|
|
47
46
|
"@types/compression": "^1.7.5",
|
|
48
47
|
"@types/cors": "^2.8.13",
|
|
49
48
|
"@types/jsonwebtoken": "9.0.6",
|
|
@@ -75,8 +74,7 @@
|
|
|
75
74
|
"typeorm": "^0.3.20",
|
|
76
75
|
"uuid": "^10.0.0",
|
|
77
76
|
"ws": "^8.13.0",
|
|
78
|
-
"zod": "^3.23.4"
|
|
79
|
-
"playwright": "^1.40.1"
|
|
77
|
+
"zod": "^3.23.4"
|
|
80
78
|
},
|
|
81
79
|
"devDependencies": {
|
|
82
80
|
"pkgroll": "2.1.1",
|
package/src/config.ts
CHANGED
|
@@ -23,11 +23,19 @@ const databaseSettingsInfoSchema = z.object({
|
|
|
23
23
|
dbReadOnlyUsername: z.string().optional(),
|
|
24
24
|
dbReadOnlyPassword: z.string().optional(),
|
|
25
25
|
});
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
const viewingSystemInfoSchema = z.object({
|
|
28
28
|
enableSmartFilters: z.boolean().optional(),
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
+
const restApiOptionsSchema = z.object({
|
|
32
|
+
enabled: z.boolean().default(true),
|
|
33
|
+
includeEntities: z.array(z.string()).optional(),
|
|
34
|
+
excludeEntities: z.array(z.string()).optional(),
|
|
35
|
+
includeSchemas: z.array(z.string()).optional(),
|
|
36
|
+
excludeSchemas: z.array(z.string()).optional(),
|
|
37
|
+
});
|
|
38
|
+
|
|
31
39
|
const askSkipInfoSchema = z.object({
|
|
32
40
|
organizationInfo: z.string().optional(),
|
|
33
41
|
entitiesToSendSkip: z
|
|
@@ -42,6 +50,7 @@ const configInfoSchema = z.object({
|
|
|
42
50
|
userHandling: userHandlingInfoSchema,
|
|
43
51
|
databaseSettings: databaseSettingsInfoSchema,
|
|
44
52
|
viewingSystem: viewingSystemInfoSchema.optional(),
|
|
53
|
+
restApiOptions: restApiOptionsSchema.optional().default({}),
|
|
45
54
|
askSkip: askSkipInfoSchema.optional(),
|
|
46
55
|
|
|
47
56
|
apiKey: z.string().optional(),
|
|
@@ -74,6 +83,8 @@ const configInfoSchema = z.object({
|
|
|
74
83
|
.transform((val) => z.record(z.string()).parse(JSON.parse(val)))
|
|
75
84
|
.optional(),
|
|
76
85
|
___skipAPIurl: z.string().optional(),
|
|
86
|
+
___skipLearningAPIurl: z.string().optional(),
|
|
87
|
+
___skipLearningCycleIntervalInMinutes: z.coerce.number().optional(),
|
|
77
88
|
___skipAPIOrgId: z.string().optional(),
|
|
78
89
|
auth0Domain: z.string().optional(),
|
|
79
90
|
auth0WebClientID: z.string().optional(),
|
|
@@ -84,6 +95,7 @@ const configInfoSchema = z.object({
|
|
|
84
95
|
export type UserHandlingInfo = z.infer<typeof userHandlingInfoSchema>;
|
|
85
96
|
export type DatabaseSettingsInfo = z.infer<typeof databaseSettingsInfoSchema>;
|
|
86
97
|
export type ViewingSystemSettingsInfo = z.infer<typeof viewingSystemInfoSchema>;
|
|
98
|
+
export type RESTApiOptions = z.infer<typeof restApiOptionsSchema>;
|
|
87
99
|
export type ConfigInfo = z.infer<typeof configInfoSchema>;
|
|
88
100
|
|
|
89
101
|
export const configInfo: ConfigInfo = loadConfig();
|
|
@@ -107,6 +119,8 @@ export const {
|
|
|
107
119
|
websiteRunFromPackage,
|
|
108
120
|
userEmailMap,
|
|
109
121
|
___skipAPIurl,
|
|
122
|
+
___skipLearningAPIurl,
|
|
123
|
+
___skipLearningCycleIntervalInMinutes,
|
|
110
124
|
___skipAPIOrgId,
|
|
111
125
|
auth0Domain,
|
|
112
126
|
auth0WebClientID,
|