@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.
Files changed (250) hide show
  1. package/dist/agents/skip-agent.d.ts +4 -4
  2. package/dist/agents/skip-agent.d.ts.map +1 -1
  3. package/dist/agents/skip-agent.js +808 -951
  4. package/dist/agents/skip-agent.js.map +1 -1
  5. package/dist/agents/skip-sdk.d.ts +1 -1
  6. package/dist/agents/skip-sdk.d.ts.map +1 -1
  7. package/dist/agents/skip-sdk.js +53 -43
  8. package/dist/agents/skip-sdk.js.map +1 -1
  9. package/dist/apolloServer/index.js +1 -1
  10. package/dist/auth/AuthProviderFactory.d.ts +1 -1
  11. package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
  12. package/dist/auth/AuthProviderFactory.js +1 -3
  13. package/dist/auth/AuthProviderFactory.js.map +1 -1
  14. package/dist/auth/BaseAuthProvider.d.ts +1 -1
  15. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  16. package/dist/auth/BaseAuthProvider.js +3 -2
  17. package/dist/auth/BaseAuthProvider.js.map +1 -1
  18. package/dist/auth/IAuthProvider.d.ts +1 -1
  19. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  20. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  21. package/dist/auth/exampleNewUserSubClass.js +1 -1
  22. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  23. package/dist/auth/index.d.ts +1 -1
  24. package/dist/auth/index.d.ts.map +1 -1
  25. package/dist/auth/index.js +6 -6
  26. package/dist/auth/index.js.map +1 -1
  27. package/dist/auth/initializeProviders.js +1 -1
  28. package/dist/auth/initializeProviders.js.map +1 -1
  29. package/dist/auth/newUsers.d.ts +1 -1
  30. package/dist/auth/newUsers.d.ts.map +1 -1
  31. package/dist/auth/newUsers.js +7 -7
  32. package/dist/auth/newUsers.js.map +1 -1
  33. package/dist/auth/providers/Auth0Provider.d.ts +1 -1
  34. package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
  35. package/dist/auth/providers/Auth0Provider.js +1 -1
  36. package/dist/auth/providers/Auth0Provider.js.map +1 -1
  37. package/dist/auth/providers/CognitoProvider.d.ts +1 -1
  38. package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
  39. package/dist/auth/providers/CognitoProvider.js +3 -6
  40. package/dist/auth/providers/CognitoProvider.js.map +1 -1
  41. package/dist/auth/providers/GoogleProvider.d.ts +1 -1
  42. package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
  43. package/dist/auth/providers/GoogleProvider.js +1 -1
  44. package/dist/auth/providers/GoogleProvider.js.map +1 -1
  45. package/dist/auth/providers/MSALProvider.d.ts +1 -1
  46. package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
  47. package/dist/auth/providers/MSALProvider.js +1 -1
  48. package/dist/auth/providers/MSALProvider.js.map +1 -1
  49. package/dist/auth/providers/OktaProvider.d.ts +1 -1
  50. package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
  51. package/dist/auth/providers/OktaProvider.js +1 -1
  52. package/dist/auth/providers/OktaProvider.js.map +1 -1
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js +22 -10
  55. package/dist/config.js.map +1 -1
  56. package/dist/context.d.ts +1 -1
  57. package/dist/context.d.ts.map +1 -1
  58. package/dist/context.js +9 -7
  59. package/dist/context.js.map +1 -1
  60. package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
  61. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  62. package/dist/entitySubclasses/entityPermissions.server.js +1 -1
  63. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  64. package/dist/generated/generated.d.ts +648 -648
  65. package/dist/generated/generated.d.ts.map +1 -1
  66. package/dist/generated/generated.js +2986 -1133
  67. package/dist/generated/generated.js.map +1 -1
  68. package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
  69. package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
  70. package/dist/generic/KeyInputOutputTypes.js +1 -1
  71. package/dist/generic/KeyInputOutputTypes.js.map +1 -1
  72. package/dist/generic/ResolverBase.d.ts +1 -1
  73. package/dist/generic/ResolverBase.d.ts.map +1 -1
  74. package/dist/generic/ResolverBase.js +15 -10
  75. package/dist/generic/ResolverBase.js.map +1 -1
  76. package/dist/generic/RunViewResolver.d.ts +1 -1
  77. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  78. package/dist/generic/RunViewResolver.js +15 -15
  79. package/dist/generic/RunViewResolver.js.map +1 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +18 -9
  82. package/dist/index.js.map +1 -1
  83. package/dist/resolvers/ActionResolver.d.ts +2 -2
  84. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  85. package/dist/resolvers/ActionResolver.js +28 -30
  86. package/dist/resolvers/ActionResolver.js.map +1 -1
  87. package/dist/resolvers/AskSkipResolver.d.ts +2 -2
  88. package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
  89. package/dist/resolvers/AskSkipResolver.js +60 -50
  90. package/dist/resolvers/AskSkipResolver.js.map +1 -1
  91. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  92. package/dist/resolvers/ComponentRegistryResolver.js +36 -38
  93. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  94. package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
  95. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  96. package/dist/resolvers/CreateQueryResolver.js +43 -40
  97. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  98. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  99. package/dist/resolvers/DatasetResolver.js +1 -1
  100. package/dist/resolvers/DatasetResolver.js.map +1 -1
  101. package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
  102. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  103. package/dist/resolvers/EntityRecordNameResolver.js +1 -1
  104. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  105. package/dist/resolvers/EntityResolver.d.ts.map +1 -1
  106. package/dist/resolvers/EntityResolver.js +1 -1
  107. package/dist/resolvers/EntityResolver.js.map +1 -1
  108. package/dist/resolvers/FileCategoryResolver.js +1 -1
  109. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  110. package/dist/resolvers/FileResolver.js +1 -1
  111. package/dist/resolvers/FileResolver.js.map +1 -1
  112. package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
  113. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  114. package/dist/resolvers/GetDataContextDataResolver.js +5 -5
  115. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  116. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  117. package/dist/resolvers/GetDataResolver.js +8 -6
  118. package/dist/resolvers/GetDataResolver.js.map +1 -1
  119. package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
  120. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  121. package/dist/resolvers/MergeRecordsResolver.js +3 -3
  122. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  123. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
  124. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  125. package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
  126. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  127. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  128. package/dist/resolvers/QueryResolver.js +11 -11
  129. package/dist/resolvers/QueryResolver.js.map +1 -1
  130. package/dist/resolvers/ReportResolver.js +1 -1
  131. package/dist/resolvers/ReportResolver.js.map +1 -1
  132. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  133. package/dist/resolvers/RunAIAgentResolver.js +27 -28
  134. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  135. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  136. package/dist/resolvers/RunAIPromptResolver.js +31 -31
  137. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  138. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  139. package/dist/resolvers/RunTemplateResolver.js +9 -9
  140. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  141. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  142. package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
  143. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  144. package/dist/resolvers/SyncDataResolver.d.ts +1 -1
  145. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  146. package/dist/resolvers/SyncDataResolver.js +15 -14
  147. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  148. package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
  149. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  150. package/dist/resolvers/SyncRolesUsersResolver.js +48 -44
  151. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  152. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  153. package/dist/resolvers/TaskResolver.js +7 -7
  154. package/dist/resolvers/TaskResolver.js.map +1 -1
  155. package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
  156. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  157. package/dist/resolvers/TransactionGroupResolver.js +12 -12
  158. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  159. package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
  160. package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
  161. package/dist/resolvers/UserFavoriteResolver.js +1 -1
  162. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  163. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  164. package/dist/resolvers/UserViewResolver.js.map +1 -1
  165. package/dist/rest/EntityCRUDHandler.d.ts +1 -1
  166. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  167. package/dist/rest/EntityCRUDHandler.js +14 -16
  168. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  169. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  170. package/dist/rest/RESTEndpointHandler.js +23 -25
  171. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  172. package/dist/rest/ViewOperationsHandler.d.ts +1 -1
  173. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  174. package/dist/rest/ViewOperationsHandler.js +17 -21
  175. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  176. package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
  177. package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
  178. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  179. package/dist/services/ScheduledJobsService.js +4 -6
  180. package/dist/services/ScheduledJobsService.js.map +1 -1
  181. package/dist/services/TaskOrchestrator.d.ts +1 -1
  182. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  183. package/dist/services/TaskOrchestrator.js +30 -30
  184. package/dist/services/TaskOrchestrator.js.map +1 -1
  185. package/dist/types.d.ts +3 -3
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js +0 -1
  188. package/dist/types.js.map +1 -1
  189. package/dist/util.d.ts +1 -1
  190. package/dist/util.d.ts.map +1 -1
  191. package/dist/util.js +2 -2
  192. package/dist/util.js.map +1 -1
  193. package/package.json +36 -37
  194. package/src/agents/skip-agent.ts +1067 -1200
  195. package/src/agents/skip-sdk.ts +877 -851
  196. package/src/apolloServer/index.ts +2 -2
  197. package/src/auth/AuthProviderFactory.ts +8 -14
  198. package/src/auth/BaseAuthProvider.ts +5 -4
  199. package/src/auth/IAuthProvider.ts +2 -2
  200. package/src/auth/exampleNewUserSubClass.ts +9 -2
  201. package/src/auth/index.ts +31 -26
  202. package/src/auth/initializeProviders.ts +3 -3
  203. package/src/auth/newUsers.ts +166 -134
  204. package/src/auth/providers/Auth0Provider.ts +5 -5
  205. package/src/auth/providers/CognitoProvider.ts +7 -10
  206. package/src/auth/providers/GoogleProvider.ts +4 -5
  207. package/src/auth/providers/MSALProvider.ts +5 -5
  208. package/src/auth/providers/OktaProvider.ts +6 -7
  209. package/src/config.ts +63 -54
  210. package/src/context.ts +42 -30
  211. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  212. package/src/generated/generated.ts +48130 -39930
  213. package/src/generic/KeyInputOutputTypes.ts +3 -6
  214. package/src/generic/ResolverBase.ts +119 -78
  215. package/src/generic/RunViewResolver.ts +27 -23
  216. package/src/index.ts +66 -42
  217. package/src/resolvers/ActionResolver.ts +46 -57
  218. package/src/resolvers/AskSkipResolver.ts +607 -533
  219. package/src/resolvers/ComponentRegistryResolver.ts +547 -562
  220. package/src/resolvers/CreateQueryResolver.ts +683 -655
  221. package/src/resolvers/DatasetResolver.ts +5 -6
  222. package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
  223. package/src/resolvers/EntityRecordNameResolver.ts +9 -5
  224. package/src/resolvers/EntityResolver.ts +9 -7
  225. package/src/resolvers/FileCategoryResolver.ts +2 -2
  226. package/src/resolvers/FileResolver.ts +4 -4
  227. package/src/resolvers/GetDataContextDataResolver.ts +106 -118
  228. package/src/resolvers/GetDataResolver.ts +194 -205
  229. package/src/resolvers/MergeRecordsResolver.ts +5 -5
  230. package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
  231. package/src/resolvers/QueryResolver.ts +95 -78
  232. package/src/resolvers/ReportResolver.ts +2 -2
  233. package/src/resolvers/RunAIAgentResolver.ts +818 -828
  234. package/src/resolvers/RunAIPromptResolver.ts +693 -709
  235. package/src/resolvers/RunTemplateResolver.ts +105 -103
  236. package/src/resolvers/SqlLoggingConfigResolver.ts +69 -72
  237. package/src/resolvers/SyncDataResolver.ts +386 -352
  238. package/src/resolvers/SyncRolesUsersResolver.ts +387 -350
  239. package/src/resolvers/TaskResolver.ts +110 -115
  240. package/src/resolvers/TransactionGroupResolver.ts +143 -138
  241. package/src/resolvers/UserFavoriteResolver.ts +17 -8
  242. package/src/resolvers/UserViewResolver.ts +17 -12
  243. package/src/rest/EntityCRUDHandler.ts +291 -268
  244. package/src/rest/RESTEndpointHandler.ts +782 -776
  245. package/src/rest/ViewOperationsHandler.ts +191 -195
  246. package/src/scheduler/LearningCycleScheduler.ts +8 -52
  247. package/src/services/ScheduledJobsService.ts +129 -132
  248. package/src/services/TaskOrchestrator.ts +792 -776
  249. package/src/types.ts +15 -9
  250. package/src/util.ts +112 -109
@@ -1,4 +1,4 @@
1
- import { LogStatus, LogError } from '@memberjunction/core';
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
- // return {
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/core';
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
- 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;
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
- * 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;
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
- if (!this.systemUser) {
41
- throw new Error(`System user not found with email: ${this.config.systemUserEmail}`);
42
- }
40
+ if (!this.systemUser) {
41
+ throw new Error(`System user not found with email: ${this.config.systemUserEmail}`);
42
+ }
43
43
 
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;
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
- * Start the scheduled jobs polling
54
- */
55
- public async Start(): Promise<void> {
56
- if (!this.config.enabled) {
57
- return;
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
- * Stop the scheduled jobs polling gracefully
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
- * Get the system user for job execution
116
- * Uses the email configured in scheduledJobs.systemUserEmail
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
- if (user) {
127
- return user;
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
- LogError(`[ScheduledJobsService] System user not found with email: ${systemUserEmail}`);
131
- return null;
87
+ }
88
+ } catch (error) {
89
+ LogError('[ScheduledJobsService] Failed to start polling', undefined, error);
90
+ throw error;
132
91
  }
133
-
134
- /**
135
- * Get current service status
136
- */
137
- public GetStatus(): {
138
- enabled: boolean;
139
- running: boolean;
140
- activeJobs: number;
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
- * Check if service is enabled in configuration
153
- */
154
- public get IsEnabled(): boolean {
155
- return this.config.enabled;
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
- * Check if service is currently running
160
- */
161
- public get IsRunning(): boolean {
162
- return this.isRunning;
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
  }