@memberjunction/server 2.111.0 → 2.112.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/dist/agents/skip-agent.d.ts +4 -4
- package/dist/agents/skip-agent.d.ts.map +1 -1
- package/dist/agents/skip-agent.js +808 -951
- package/dist/agents/skip-agent.js.map +1 -1
- package/dist/agents/skip-sdk.d.ts +1 -1
- package/dist/agents/skip-sdk.d.ts.map +1 -1
- package/dist/agents/skip-sdk.js +53 -43
- package/dist/agents/skip-sdk.js.map +1 -1
- package/dist/apolloServer/index.js +1 -1
- package/dist/auth/AuthProviderFactory.d.ts +1 -1
- package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
- package/dist/auth/AuthProviderFactory.js +1 -3
- package/dist/auth/AuthProviderFactory.js.map +1 -1
- package/dist/auth/BaseAuthProvider.d.ts +1 -1
- package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
- package/dist/auth/BaseAuthProvider.js +3 -2
- package/dist/auth/BaseAuthProvider.js.map +1 -1
- package/dist/auth/IAuthProvider.d.ts +1 -1
- package/dist/auth/IAuthProvider.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.js +1 -1
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +6 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.js +1 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/newUsers.d.ts +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +7 -7
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
- package/dist/auth/providers/Auth0Provider.js +1 -1
- package/dist/auth/providers/Auth0Provider.js.map +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
- package/dist/auth/providers/CognitoProvider.js +3 -6
- package/dist/auth/providers/CognitoProvider.js.map +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
- package/dist/auth/providers/GoogleProvider.js +1 -1
- package/dist/auth/providers/GoogleProvider.js.map +1 -1
- package/dist/auth/providers/MSALProvider.d.ts +1 -1
- package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
- package/dist/auth/providers/MSALProvider.js +1 -1
- package/dist/auth/providers/MSALProvider.js.map +1 -1
- package/dist/auth/providers/OktaProvider.d.ts +1 -1
- package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
- package/dist/auth/providers/OktaProvider.js +1 -1
- package/dist/auth/providers/OktaProvider.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -10
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +9 -7
- package/dist/context.js.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
- package/dist/generated/generated.d.ts +648 -648
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2986 -1133
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
- package/dist/generic/KeyInputOutputTypes.js +1 -1
- package/dist/generic/KeyInputOutputTypes.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +1 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +15 -10
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +15 -15
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +2 -2
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +28 -30
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.d.ts +2 -2
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
- package/dist/resolvers/AskSkipResolver.js +60 -50
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +36 -38
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +43 -40
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +1 -1
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/EntityResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityResolver.js +1 -1
- package/dist/resolvers/EntityResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -1
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +1 -1
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +5 -5
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +8 -6
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +3 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +11 -11
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/ReportResolver.js +1 -1
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +27 -28
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +31 -31
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +9 -9
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +15 -14
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +48 -44
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/TaskResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskResolver.js +7 -7
- package/dist/resolvers/TaskResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +12 -12
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +1 -1
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +14 -16
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +23 -25
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +17 -21
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
- package/dist/services/ScheduledJobsService.d.ts.map +1 -1
- package/dist/services/ScheduledJobsService.js +4 -6
- package/dist/services/ScheduledJobsService.js.map +1 -1
- package/dist/services/TaskOrchestrator.d.ts +1 -1
- package/dist/services/TaskOrchestrator.d.ts.map +1 -1
- package/dist/services/TaskOrchestrator.js +30 -30
- package/dist/services/TaskOrchestrator.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/package.json +36 -37
- package/src/agents/skip-agent.ts +1067 -1200
- package/src/agents/skip-sdk.ts +877 -851
- package/src/apolloServer/index.ts +2 -2
- package/src/auth/AuthProviderFactory.ts +8 -14
- package/src/auth/BaseAuthProvider.ts +5 -4
- package/src/auth/IAuthProvider.ts +2 -2
- package/src/auth/exampleNewUserSubClass.ts +9 -2
- package/src/auth/index.ts +31 -26
- package/src/auth/initializeProviders.ts +3 -3
- package/src/auth/newUsers.ts +166 -134
- package/src/auth/providers/Auth0Provider.ts +5 -5
- package/src/auth/providers/CognitoProvider.ts +7 -10
- package/src/auth/providers/GoogleProvider.ts +4 -5
- package/src/auth/providers/MSALProvider.ts +5 -5
- package/src/auth/providers/OktaProvider.ts +6 -7
- package/src/config.ts +63 -54
- package/src/context.ts +42 -30
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +48130 -39930
- package/src/generic/KeyInputOutputTypes.ts +3 -6
- package/src/generic/ResolverBase.ts +119 -78
- package/src/generic/RunViewResolver.ts +27 -23
- package/src/index.ts +66 -42
- package/src/resolvers/ActionResolver.ts +46 -57
- package/src/resolvers/AskSkipResolver.ts +607 -533
- package/src/resolvers/ComponentRegistryResolver.ts +547 -562
- package/src/resolvers/CreateQueryResolver.ts +683 -655
- package/src/resolvers/DatasetResolver.ts +5 -6
- package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
- package/src/resolvers/EntityRecordNameResolver.ts +9 -5
- package/src/resolvers/EntityResolver.ts +9 -7
- package/src/resolvers/FileCategoryResolver.ts +2 -2
- package/src/resolvers/FileResolver.ts +4 -4
- package/src/resolvers/GetDataContextDataResolver.ts +106 -118
- package/src/resolvers/GetDataResolver.ts +194 -205
- package/src/resolvers/MergeRecordsResolver.ts +5 -5
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +95 -78
- package/src/resolvers/ReportResolver.ts +2 -2
- package/src/resolvers/RunAIAgentResolver.ts +818 -828
- package/src/resolvers/RunAIPromptResolver.ts +693 -709
- package/src/resolvers/RunTemplateResolver.ts +105 -103
- package/src/resolvers/SqlLoggingConfigResolver.ts +69 -72
- package/src/resolvers/SyncDataResolver.ts +386 -352
- package/src/resolvers/SyncRolesUsersResolver.ts +387 -350
- package/src/resolvers/TaskResolver.ts +110 -115
- package/src/resolvers/TransactionGroupResolver.ts +143 -138
- package/src/resolvers/UserFavoriteResolver.ts +17 -8
- package/src/resolvers/UserViewResolver.ts +17 -12
- package/src/rest/EntityCRUDHandler.ts +291 -268
- package/src/rest/RESTEndpointHandler.ts +782 -776
- package/src/rest/ViewOperationsHandler.ts +191 -195
- package/src/scheduler/LearningCycleScheduler.ts +8 -52
- package/src/services/ScheduledJobsService.ts +129 -132
- package/src/services/TaskOrchestrator.ts +792 -776
- package/src/types.ts +15 -9
- package/src/util.ts +112 -109
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogStatus, LogError } from '@memberjunction/
|
|
1
|
+
import { LogStatus, LogError } from '@memberjunction/global';
|
|
2
2
|
import { SQLServerDataProvider, SQLServerProviderConfigData, UserCache } from '@memberjunction/sqlserver-dataprovider';
|
|
3
3
|
import { GetReadWriteDataSource } from '../util.js';
|
|
4
4
|
import { AskSkipResolver } from '../resolvers/AskSkipResolver.js';
|
|
@@ -13,22 +13,17 @@ import { mj_core_schema } from '../config.js';
|
|
|
13
13
|
*/
|
|
14
14
|
export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler> {
|
|
15
15
|
// private intervalId: NodeJS.Timeout | null = null;
|
|
16
|
-
|
|
17
16
|
// // Track executions by organization ID instead of a global flag
|
|
18
17
|
// private runningOrganizations: Map<string, { startTime: Date, learningCycleId: string }> = new Map();
|
|
19
|
-
|
|
20
18
|
// private lastRunTime: Date | null = null;
|
|
21
19
|
// private dataSources: DataSourceInfo[] = [];
|
|
22
|
-
|
|
23
20
|
// // Protected constructor to enforce singleton pattern via BaseSingleton
|
|
24
21
|
// protected constructor() {
|
|
25
22
|
// super();
|
|
26
23
|
// }
|
|
27
|
-
|
|
28
24
|
// public static get Instance(): LearningCycleScheduler {
|
|
29
25
|
// return super.getInstance<LearningCycleScheduler>();
|
|
30
26
|
// }
|
|
31
|
-
|
|
32
27
|
// /**
|
|
33
28
|
// * Set the data sources for the scheduler
|
|
34
29
|
// * @param dataSources Array of data sources
|
|
@@ -36,7 +31,6 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
36
31
|
// public setDataSources(dataSources: DataSourceInfo[]): void {
|
|
37
32
|
// this.dataSources = dataSources;
|
|
38
33
|
// }
|
|
39
|
-
|
|
40
34
|
// /**
|
|
41
35
|
// * Start the scheduler with the specified interval in minutes
|
|
42
36
|
// * @param intervalMinutes The interval in minutes between runs
|
|
@@ -44,19 +38,16 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
44
38
|
// */
|
|
45
39
|
// public start(intervalMinutes: number = 60): void {
|
|
46
40
|
// LogStatus(`Starting learning cycle scheduler with interval of ${intervalMinutes} minutes`);
|
|
47
|
-
|
|
48
41
|
// // Set up the interval for recurring calls
|
|
49
42
|
// const intervalMs = intervalMinutes * 60 * 1000;
|
|
50
43
|
// this.intervalId = setInterval(() => {
|
|
51
44
|
// this.runLearningCycle()
|
|
52
45
|
// .catch(error => LogError(`Error in scheduled learning cycle: ${error}`));
|
|
53
46
|
// }, intervalMs);
|
|
54
|
-
|
|
55
47
|
// // Start learning cycle immediately upon the server start
|
|
56
48
|
// this.runLearningCycle()
|
|
57
49
|
// .catch(error => LogError(`Error in initial learning cycle: ${error}`));
|
|
58
50
|
// }
|
|
59
|
-
|
|
60
51
|
// /**
|
|
61
52
|
// * Stop the scheduler
|
|
62
53
|
// */
|
|
@@ -67,33 +58,27 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
67
58
|
// LogStatus('Learning cycle scheduler stopped');
|
|
68
59
|
// }
|
|
69
60
|
// }
|
|
70
|
-
|
|
71
61
|
// /**
|
|
72
62
|
// * Run the learning cycle if it's not already running
|
|
73
63
|
// * @returns A promise that resolves when the learning cycle completes
|
|
74
64
|
// */
|
|
75
65
|
// public async runLearningCycle(): Promise<boolean> {
|
|
76
66
|
// const startTime = new Date();
|
|
77
|
-
|
|
78
67
|
// try {
|
|
79
68
|
// // Make sure we have data sources
|
|
80
69
|
// if (!this.dataSources || this.dataSources.length === 0) {
|
|
81
70
|
// throw new Error('No data sources available for the learning cycle');
|
|
82
71
|
// }
|
|
83
|
-
|
|
84
72
|
// const dataSource = GetReadWriteDataSource(this.dataSources);
|
|
85
|
-
|
|
86
73
|
// // Get system user for operation
|
|
87
74
|
// const systemUser = await getSystemUser(dataSource);
|
|
88
75
|
// if (!systemUser) {
|
|
89
76
|
// throw new Error('System user not found');
|
|
90
77
|
// }
|
|
91
|
-
|
|
92
78
|
// // Create context for the resolver
|
|
93
79
|
// const config = new SQLServerProviderConfigData(dataSource, mj_core_schema, 0, undefined, undefined, false);
|
|
94
80
|
// const p = new SQLServerDataProvider();
|
|
95
81
|
// await p.Config(config);
|
|
96
|
-
|
|
97
82
|
// const context: AppContext = {
|
|
98
83
|
// dataSource: dataSource,
|
|
99
84
|
// dataSources: this.dataSources,
|
|
@@ -105,19 +90,15 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
105
90
|
// },
|
|
106
91
|
// providers: [{provider: p, type: 'Read-Write'}]
|
|
107
92
|
// };
|
|
108
|
-
|
|
109
93
|
// // Execute the learning cycle
|
|
110
94
|
// const skipResolver = new AskSkipResolver();
|
|
111
95
|
// const result = await skipResolver.ExecuteAskSkipLearningCycle(
|
|
112
96
|
// context,
|
|
113
97
|
// false // forceEntityRefresh
|
|
114
98
|
// );
|
|
115
|
-
|
|
116
99
|
// const endTime = new Date();
|
|
117
100
|
// const elapsedMs = endTime.getTime() - startTime.getTime();
|
|
118
|
-
|
|
119
101
|
// this.lastRunTime = startTime;
|
|
120
|
-
|
|
121
102
|
// if (result.learningCycleSkipped) {
|
|
122
103
|
// // skipped the learning cycle - no messages to process, already logged..
|
|
123
104
|
// return true;
|
|
@@ -125,7 +106,7 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
125
106
|
// else if (result.success) {
|
|
126
107
|
// LogStatus(`Learning cycle completed successfully in ${elapsedMs}ms`);
|
|
127
108
|
// return true;
|
|
128
|
-
// }
|
|
109
|
+
// }
|
|
129
110
|
// else {
|
|
130
111
|
// LogError(`Learning cycle failed after ${elapsedMs}ms: ${result.error}`);
|
|
131
112
|
// return false;
|
|
@@ -133,9 +114,8 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
133
114
|
// } catch (error) {
|
|
134
115
|
// LogError(`Error executing learning cycle: ${error}`);
|
|
135
116
|
// return false;
|
|
136
|
-
// }
|
|
117
|
+
// }
|
|
137
118
|
// }
|
|
138
|
-
|
|
139
119
|
// /**
|
|
140
120
|
// * Get the current status of the scheduler
|
|
141
121
|
// */
|
|
@@ -151,7 +131,6 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
151
131
|
// }))
|
|
152
132
|
// };
|
|
153
133
|
// }
|
|
154
|
-
|
|
155
134
|
// /**
|
|
156
135
|
// * Checks if an organization is currently running a learning cycle
|
|
157
136
|
// * @param organizationId The organization ID to check
|
|
@@ -161,23 +140,19 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
161
140
|
// organizationId: string
|
|
162
141
|
// ): { isRunning: boolean, startTime?: Date, learningCycleId?: string, runningForMinutes?: number } {
|
|
163
142
|
// const runningInfo = this.runningOrganizations.get(organizationId);
|
|
164
|
-
|
|
165
143
|
// if (runningInfo) {
|
|
166
144
|
// // Check if it's been running too long and should be considered stalled
|
|
167
145
|
// const now = new Date();
|
|
168
146
|
// const elapsedMinutes = (now.getTime() - runningInfo.startTime.getTime()) / (1000 * 60);
|
|
169
|
-
|
|
170
|
-
//
|
|
171
|
-
// isRunning: true,
|
|
147
|
+
// return {
|
|
148
|
+
// isRunning: true,
|
|
172
149
|
// startTime: runningInfo.startTime,
|
|
173
150
|
// learningCycleId: runningInfo.learningCycleId,
|
|
174
151
|
// runningForMinutes: elapsedMinutes
|
|
175
152
|
// };
|
|
176
153
|
// }
|
|
177
|
-
|
|
178
154
|
// return { isRunning: false };
|
|
179
155
|
// }
|
|
180
|
-
|
|
181
156
|
// /**
|
|
182
157
|
// * Registers an organization as running a learning cycle
|
|
183
158
|
// * @param organizationId The organization ID to register
|
|
@@ -187,20 +162,16 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
187
162
|
// public registerRunningCycle(organizationId: string, learningCycleId: string): boolean {
|
|
188
163
|
// // First check if already running
|
|
189
164
|
// const { isRunning } = this.isOrganizationRunningCycle(organizationId);
|
|
190
|
-
|
|
191
165
|
// if (isRunning) {
|
|
192
166
|
// return false;
|
|
193
167
|
// }
|
|
194
|
-
|
|
195
168
|
// // Register the organization as running a cycle
|
|
196
169
|
// this.runningOrganizations.set(organizationId, {
|
|
197
170
|
// startTime: new Date(),
|
|
198
171
|
// learningCycleId
|
|
199
172
|
// });
|
|
200
|
-
|
|
201
173
|
// return true;
|
|
202
174
|
// }
|
|
203
|
-
|
|
204
175
|
// /**
|
|
205
176
|
// * Unregisters an organization after its learning cycle completes
|
|
206
177
|
// * @param organizationId The organization ID to unregister
|
|
@@ -211,10 +182,8 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
211
182
|
// this.runningOrganizations.delete(organizationId);
|
|
212
183
|
// return true;
|
|
213
184
|
// }
|
|
214
|
-
|
|
215
185
|
// return false;
|
|
216
186
|
// }
|
|
217
|
-
|
|
218
187
|
// /**
|
|
219
188
|
// * Manually execute a learning cycle run for testing purposes
|
|
220
189
|
// * This is intended for debugging/testing only and will force a run
|
|
@@ -225,20 +194,16 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
225
194
|
// public async manuallyExecuteLearningCycle(organizationId?: string): Promise<boolean> {
|
|
226
195
|
// try {
|
|
227
196
|
// LogStatus('🧪 Manually executing learning cycle for testing...');
|
|
228
|
-
|
|
229
197
|
// // If an organization ID is provided, register it as running
|
|
230
198
|
// const learningCycleId = `manual_${Date.now()}`;
|
|
231
199
|
// let orgRegistered = false;
|
|
232
|
-
|
|
233
200
|
// if (organizationId) {
|
|
234
201
|
// // Check if already running
|
|
235
202
|
// const runningStatus = this.isOrganizationRunningCycle(organizationId);
|
|
236
|
-
|
|
237
203
|
// if (runningStatus.isRunning) {
|
|
238
204
|
// LogError(`Organization ${organizationId} is already running a learning cycle. Cannot start a new one.`);
|
|
239
205
|
// return false;
|
|
240
206
|
// }
|
|
241
|
-
|
|
242
207
|
// // Register this organization
|
|
243
208
|
// orgRegistered = this.registerRunningCycle(organizationId, learningCycleId);
|
|
244
209
|
// if (!orgRegistered) {
|
|
@@ -246,42 +211,36 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
246
211
|
// return false;
|
|
247
212
|
// }
|
|
248
213
|
// }
|
|
249
|
-
|
|
250
214
|
// // Run the learning cycle
|
|
251
215
|
// const result = await this.runLearningCycle();
|
|
252
216
|
// LogStatus(`🧪 Manual learning cycle execution completed with result: ${result ? 'Success' : 'Failed'}`);
|
|
253
|
-
|
|
254
217
|
// // Unregister the organization if it was registered
|
|
255
218
|
// if (organizationId && orgRegistered) {
|
|
256
219
|
// this.unregisterRunningCycle(organizationId);
|
|
257
220
|
// }
|
|
258
|
-
|
|
259
221
|
// return result;
|
|
260
222
|
// } catch (error) {
|
|
261
223
|
// // Make sure to unregister on error
|
|
262
224
|
// if (organizationId && this.runningOrganizations.has(organizationId)) {
|
|
263
225
|
// this.unregisterRunningCycle(organizationId);
|
|
264
226
|
// }
|
|
265
|
-
|
|
266
227
|
// LogError(`Error in manual learning cycle execution: ${error}`);
|
|
267
228
|
// return false;
|
|
268
229
|
// }
|
|
269
230
|
// }
|
|
270
|
-
|
|
271
231
|
// /**
|
|
272
232
|
// * Force stop a running learning cycle for an organization
|
|
273
233
|
// * @param organizationId The organization ID to stop the cycle for
|
|
274
234
|
// * @returns Information about the stopped cycle
|
|
275
235
|
// */
|
|
276
|
-
// public stopLearningCycleForOrganization(organizationId: string): {
|
|
277
|
-
// success: boolean,
|
|
236
|
+
// public stopLearningCycleForOrganization(organizationId: string): {
|
|
237
|
+
// success: boolean,
|
|
278
238
|
// message: string,
|
|
279
239
|
// wasRunning: boolean,
|
|
280
240
|
// cycleDetails?: { learningCycleId: string, startTime: Date, runningForMinutes: number }
|
|
281
241
|
// } {
|
|
282
242
|
// // Check if this organization has a running cycle
|
|
283
243
|
// const runningStatus = this.isOrganizationRunningCycle(organizationId);
|
|
284
|
-
|
|
285
244
|
// if (!runningStatus.isRunning) {
|
|
286
245
|
// return {
|
|
287
246
|
// success: false,
|
|
@@ -289,15 +248,12 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
289
248
|
// wasRunning: false
|
|
290
249
|
// };
|
|
291
250
|
// }
|
|
292
|
-
|
|
293
251
|
// // Capture details before unregistering
|
|
294
252
|
// const startTime = runningStatus.startTime!;
|
|
295
253
|
// const learningCycleId = runningStatus.learningCycleId!;
|
|
296
254
|
// const runningForMinutes = runningStatus.runningForMinutes!;
|
|
297
|
-
|
|
298
255
|
// // Unregister the organization
|
|
299
256
|
// const unregistered = this.unregisterRunningCycle(organizationId);
|
|
300
|
-
|
|
301
257
|
// if (unregistered) {
|
|
302
258
|
// return {
|
|
303
259
|
// success: true,
|
|
@@ -317,4 +273,4 @@ export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler
|
|
|
317
273
|
// };
|
|
318
274
|
// }
|
|
319
275
|
// }
|
|
320
|
-
}
|
|
276
|
+
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module MJServer/services
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { LogError, LogStatus, UserInfo } from '@memberjunction/
|
|
6
|
+
import { LogError, LogStatus, UserInfo } from '@memberjunction/global';
|
|
7
7
|
import { UserCache } from '@memberjunction/sqlserver-dataprovider';
|
|
8
8
|
import { SchedulingEngine } from '@memberjunction/scheduling-engine';
|
|
9
9
|
import { ScheduledJobsConfig } from '../config.js';
|
|
@@ -13,152 +13,149 @@ import { ScheduledJobsConfig } from '../config.js';
|
|
|
13
13
|
* Handles initialization, starting/stopping polling, and graceful shutdown
|
|
14
14
|
*/
|
|
15
15
|
export class ScheduledJobsService {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
private engine: SchedulingEngine;
|
|
17
|
+
private systemUser: UserInfo | null = null;
|
|
18
|
+
private isRunning: boolean = false;
|
|
19
|
+
private config: ScheduledJobsConfig;
|
|
20
|
+
|
|
21
|
+
constructor(config: ScheduledJobsConfig) {
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.engine = SchedulingEngine.Instance;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Initialize the scheduled jobs service
|
|
28
|
+
* Loads metadata and prepares the engine
|
|
29
|
+
*/
|
|
30
|
+
public async Initialize(): Promise<void> {
|
|
31
|
+
if (!this.config.enabled) {
|
|
32
|
+
LogStatus('[ScheduledJobsService] Scheduled jobs are disabled in configuration');
|
|
33
|
+
return;
|
|
24
34
|
}
|
|
25
35
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
*/
|
|
30
|
-
public async Initialize(): Promise<void> {
|
|
31
|
-
if (!this.config.enabled) {
|
|
32
|
-
LogStatus('[ScheduledJobsService] Scheduled jobs are disabled in configuration');
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
try {
|
|
37
|
-
// Get system user for job execution
|
|
38
|
-
this.systemUser = await this.getSystemUser();
|
|
36
|
+
try {
|
|
37
|
+
// Get system user for job execution
|
|
38
|
+
this.systemUser = await this.getSystemUser();
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
if (!this.systemUser) {
|
|
41
|
+
throw new Error(`System user not found with email: ${this.config.systemUserEmail}`);
|
|
42
|
+
}
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
44
|
+
// Pre-load metadata cache
|
|
45
|
+
await this.engine.Config(false, this.systemUser);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
LogError('[ScheduledJobsService] Failed to initialize', undefined, error);
|
|
48
|
+
throw error;
|
|
50
49
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
if (this.isRunning) {
|
|
61
|
-
LogStatus('[ScheduledJobsService] Already running');
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (!this.systemUser) {
|
|
66
|
-
throw new Error('Service not initialized - call Initialize() first');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
try {
|
|
70
|
-
this.engine.StartPolling(this.systemUser);
|
|
71
|
-
this.isRunning = true;
|
|
72
|
-
|
|
73
|
-
// Single consolidated console message
|
|
74
|
-
const jobCount = this.engine.ScheduledJobs.length;
|
|
75
|
-
if (jobCount === 0) {
|
|
76
|
-
console.log(`📅 Scheduled Jobs: No active jobs, polling suspended (will auto-start when jobs are added)`);
|
|
77
|
-
} else {
|
|
78
|
-
const interval = this.engine.ActivePollingInterval;
|
|
79
|
-
if (interval !== null) {
|
|
80
|
-
const intervalDisplay = interval >= 60000
|
|
81
|
-
? `${Math.round(interval / 60000)} minute(s)`
|
|
82
|
-
: `${Math.round(interval / 1000)} second(s)`;
|
|
83
|
-
console.log(`📅 Scheduled Jobs: ${jobCount} active job(s), polling every ${intervalDisplay}`);
|
|
84
|
-
} else {
|
|
85
|
-
// This shouldn't happen if jobCount > 0, but handle it gracefully
|
|
86
|
-
console.log(`📅 Scheduled Jobs: ${jobCount} active job(s), polling interval not set`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
} catch (error) {
|
|
90
|
-
LogError('[ScheduledJobsService] Failed to start polling', undefined, error);
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Start the scheduled jobs polling
|
|
54
|
+
*/
|
|
55
|
+
public async Start(): Promise<void> {
|
|
56
|
+
if (!this.config.enabled) {
|
|
57
|
+
return;
|
|
93
58
|
}
|
|
94
59
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
public async Stop(): Promise<void> {
|
|
99
|
-
if (!this.isRunning) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
try {
|
|
104
|
-
LogStatus('[ScheduledJobsService] Stopping scheduled job polling');
|
|
105
|
-
this.engine.StopPolling();
|
|
106
|
-
this.isRunning = false;
|
|
107
|
-
LogStatus('[ScheduledJobsService] Polling stopped successfully');
|
|
108
|
-
} catch (error) {
|
|
109
|
-
LogError('[ScheduledJobsService] Error stopping polling', undefined, error);
|
|
110
|
-
throw error;
|
|
111
|
-
}
|
|
60
|
+
if (this.isRunning) {
|
|
61
|
+
LogStatus('[ScheduledJobsService] Already running');
|
|
62
|
+
return;
|
|
112
63
|
}
|
|
113
64
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
*/
|
|
118
|
-
private async getSystemUser(): Promise<UserInfo | null> {
|
|
119
|
-
const systemUserEmail = this.config.systemUserEmail;
|
|
120
|
-
|
|
121
|
-
// Search UserCache for system user
|
|
122
|
-
const user = UserCache.Users.find(u =>
|
|
123
|
-
u.Email?.toLowerCase() === systemUserEmail.toLowerCase()
|
|
124
|
-
);
|
|
65
|
+
if (!this.systemUser) {
|
|
66
|
+
throw new Error('Service not initialized - call Initialize() first');
|
|
67
|
+
}
|
|
125
68
|
|
|
126
|
-
|
|
127
|
-
|
|
69
|
+
try {
|
|
70
|
+
this.engine.StartPolling(this.systemUser);
|
|
71
|
+
this.isRunning = true;
|
|
72
|
+
|
|
73
|
+
// Single consolidated console message
|
|
74
|
+
const jobCount = this.engine.ScheduledJobs.length;
|
|
75
|
+
if (jobCount === 0) {
|
|
76
|
+
console.log(`📅 Scheduled Jobs: No active jobs, polling suspended (will auto-start when jobs are added)`);
|
|
77
|
+
} else {
|
|
78
|
+
const interval = this.engine.ActivePollingInterval;
|
|
79
|
+
if (interval !== null) {
|
|
80
|
+
const intervalDisplay =
|
|
81
|
+
interval >= 60000 ? `${Math.round(interval / 60000)} minute(s)` : `${Math.round(interval / 1000)} second(s)`;
|
|
82
|
+
console.log(`📅 Scheduled Jobs: ${jobCount} active job(s), polling every ${intervalDisplay}`);
|
|
83
|
+
} else {
|
|
84
|
+
// This shouldn't happen if jobCount > 0, but handle it gracefully
|
|
85
|
+
console.log(`📅 Scheduled Jobs: ${jobCount} active job(s), polling interval not set`);
|
|
128
86
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
87
|
+
}
|
|
88
|
+
} catch (error) {
|
|
89
|
+
LogError('[ScheduledJobsService] Failed to start polling', undefined, error);
|
|
90
|
+
throw error;
|
|
132
91
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
pollingInterval: number;
|
|
142
|
-
} {
|
|
143
|
-
return {
|
|
144
|
-
enabled: this.config.enabled,
|
|
145
|
-
running: this.isRunning,
|
|
146
|
-
activeJobs: this.engine?.ScheduledJobs?.length || 0,
|
|
147
|
-
pollingInterval: this.engine?.ActivePollingInterval || 0
|
|
148
|
-
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Stop the scheduled jobs polling gracefully
|
|
96
|
+
*/
|
|
97
|
+
public async Stop(): Promise<void> {
|
|
98
|
+
if (!this.isRunning) {
|
|
99
|
+
return;
|
|
149
100
|
}
|
|
150
101
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
102
|
+
try {
|
|
103
|
+
LogStatus('[ScheduledJobsService] Stopping scheduled job polling');
|
|
104
|
+
this.engine.StopPolling();
|
|
105
|
+
this.isRunning = false;
|
|
106
|
+
LogStatus('[ScheduledJobsService] Polling stopped successfully');
|
|
107
|
+
} catch (error) {
|
|
108
|
+
LogError('[ScheduledJobsService] Error stopping polling', undefined, error);
|
|
109
|
+
throw error;
|
|
156
110
|
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Get the system user for job execution
|
|
115
|
+
* Uses the email configured in scheduledJobs.systemUserEmail
|
|
116
|
+
*/
|
|
117
|
+
private async getSystemUser(): Promise<UserInfo | null> {
|
|
118
|
+
const systemUserEmail = this.config.systemUserEmail;
|
|
157
119
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
120
|
+
// Search UserCache for system user
|
|
121
|
+
const user = UserCache.Users.find((u) => u.Email?.toLowerCase() === systemUserEmail.toLowerCase());
|
|
122
|
+
|
|
123
|
+
if (user) {
|
|
124
|
+
return user;
|
|
163
125
|
}
|
|
126
|
+
|
|
127
|
+
LogError(`[ScheduledJobsService] System user not found with email: ${systemUserEmail}`);
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Get current service status
|
|
133
|
+
*/
|
|
134
|
+
public GetStatus(): {
|
|
135
|
+
enabled: boolean;
|
|
136
|
+
running: boolean;
|
|
137
|
+
activeJobs: number;
|
|
138
|
+
pollingInterval: number;
|
|
139
|
+
} {
|
|
140
|
+
return {
|
|
141
|
+
enabled: this.config.enabled,
|
|
142
|
+
running: this.isRunning,
|
|
143
|
+
activeJobs: this.engine?.ScheduledJobs?.length || 0,
|
|
144
|
+
pollingInterval: this.engine?.ActivePollingInterval || 0,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Check if service is enabled in configuration
|
|
150
|
+
*/
|
|
151
|
+
public get IsEnabled(): boolean {
|
|
152
|
+
return this.config.enabled;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Check if service is currently running
|
|
157
|
+
*/
|
|
158
|
+
public get IsRunning(): boolean {
|
|
159
|
+
return this.isRunning;
|
|
160
|
+
}
|
|
164
161
|
}
|