@memberjunction/server 2.112.0 → 2.113.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 +951 -808
  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 +43 -53
  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 +3 -1
  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 +2 -3
  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 +6 -3
  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 +10 -22
  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 +7 -9
  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 +788 -658
  65. package/dist/generated/generated.d.ts.map +1 -1
  66. package/dist/generated/generated.js +2050 -3054
  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 +10 -15
  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 +13 -18
  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 +30 -28
  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 +50 -60
  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 +38 -36
  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 +40 -43
  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 +6 -8
  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 +28 -27
  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 +14 -15
  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 +44 -48
  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 +16 -14
  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 +25 -23
  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 +21 -17
  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 +6 -4
  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 +1 -0
  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 +39 -36
  194. package/src/agents/skip-agent.ts +1200 -1067
  195. package/src/agents/skip-sdk.ts +851 -877
  196. package/src/apolloServer/index.ts +2 -2
  197. package/src/auth/AuthProviderFactory.ts +14 -8
  198. package/src/auth/BaseAuthProvider.ts +4 -5
  199. package/src/auth/IAuthProvider.ts +2 -2
  200. package/src/auth/exampleNewUserSubClass.ts +2 -9
  201. package/src/auth/index.ts +26 -31
  202. package/src/auth/initializeProviders.ts +3 -3
  203. package/src/auth/newUsers.ts +134 -166
  204. package/src/auth/providers/Auth0Provider.ts +5 -5
  205. package/src/auth/providers/CognitoProvider.ts +10 -7
  206. package/src/auth/providers/GoogleProvider.ts +5 -4
  207. package/src/auth/providers/MSALProvider.ts +5 -5
  208. package/src/auth/providers/OktaProvider.ts +7 -6
  209. package/src/config.ts +54 -63
  210. package/src/context.ts +30 -42
  211. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  212. package/src/generated/generated.ts +40442 -48106
  213. package/src/generic/KeyInputOutputTypes.ts +6 -3
  214. package/src/generic/ResolverBase.ts +78 -119
  215. package/src/generic/RunViewResolver.ts +23 -27
  216. package/src/index.ts +48 -66
  217. package/src/resolvers/ActionResolver.ts +57 -46
  218. package/src/resolvers/AskSkipResolver.ts +533 -607
  219. package/src/resolvers/ComponentRegistryResolver.ts +562 -547
  220. package/src/resolvers/CreateQueryResolver.ts +655 -683
  221. package/src/resolvers/DatasetResolver.ts +6 -5
  222. package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
  223. package/src/resolvers/EntityRecordNameResolver.ts +5 -9
  224. package/src/resolvers/EntityResolver.ts +7 -9
  225. package/src/resolvers/FileCategoryResolver.ts +2 -2
  226. package/src/resolvers/FileResolver.ts +4 -4
  227. package/src/resolvers/GetDataContextDataResolver.ts +118 -106
  228. package/src/resolvers/GetDataResolver.ts +205 -194
  229. package/src/resolvers/MergeRecordsResolver.ts +5 -5
  230. package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
  231. package/src/resolvers/QueryResolver.ts +78 -95
  232. package/src/resolvers/ReportResolver.ts +2 -2
  233. package/src/resolvers/RunAIAgentResolver.ts +828 -818
  234. package/src/resolvers/RunAIPromptResolver.ts +709 -693
  235. package/src/resolvers/RunTemplateResolver.ts +103 -105
  236. package/src/resolvers/SqlLoggingConfigResolver.ts +72 -69
  237. package/src/resolvers/SyncDataResolver.ts +352 -386
  238. package/src/resolvers/SyncRolesUsersResolver.ts +350 -387
  239. package/src/resolvers/TaskResolver.ts +115 -110
  240. package/src/resolvers/TransactionGroupResolver.ts +138 -143
  241. package/src/resolvers/UserFavoriteResolver.ts +8 -17
  242. package/src/resolvers/UserViewResolver.ts +12 -17
  243. package/src/rest/EntityCRUDHandler.ts +268 -291
  244. package/src/rest/RESTEndpointHandler.ts +776 -782
  245. package/src/rest/ViewOperationsHandler.ts +195 -191
  246. package/src/scheduler/LearningCycleScheduler.ts +52 -8
  247. package/src/services/ScheduledJobsService.ts +132 -129
  248. package/src/services/TaskOrchestrator.ts +776 -792
  249. package/src/types.ts +9 -15
  250. package/src/util.ts +109 -112
@@ -1,5 +1,7 @@
1
- import { KeyValuePair } from '@memberjunction/global';
2
- import { Field, InputType, ObjectType } from 'type-graphql';
1
+ import { KeyValuePair } from "@memberjunction/core";
2
+ import { Field, InputType, ObjectType } from "type-graphql";
3
+
4
+
3
5
 
4
6
  @InputType()
5
7
  export class KeyValuePairInputType {
@@ -18,6 +20,7 @@ export class KeyValuePairOutputType {
18
20
  @Field(() => String)
19
21
  Value: string;
20
22
  }
23
+
21
24
 
22
25
  @InputType()
23
26
  export class CompositeKeyInputType {
@@ -29,4 +32,4 @@ export class CompositeKeyInputType {
29
32
  export class CompositeKeyOutputType {
30
33
  @Field(() => [KeyValuePairOutputType])
31
34
  KeyValuePairs: KeyValuePair[];
32
- }
35
+ }
@@ -15,7 +15,7 @@ import {
15
15
  RunViewParams,
16
16
  RunViewResult,
17
17
  UserInfo,
18
- } from '@memberjunction/global';
18
+ } from '@memberjunction/core';
19
19
  import { AuditLogEntity, ErrorLogEntity, UserViewEntityExtended } from '@memberjunction/core-entities';
20
20
  import { SQLServerDataProvider, UserCache } from '@memberjunction/sqlserver-dataprovider';
21
21
  import { PubSubEngine } from 'type-graphql';
@@ -41,9 +41,7 @@ export class ResolverBase {
41
41
  // could actually be duplicated and we'd end up with multiple instances of the same map, which would be bad.
42
42
  const g = MJGlobal.Instance.GetGlobalObjectStore();
43
43
  if (!g[ResolverBase._eventSubscriptionKey]) {
44
- LogDebug(
45
- `>>>>> MJServer.ResolverBase.EventSubscriptions: Creating new Map - this should only happen once per server instance <<<<<<`
46
- );
44
+ LogDebug(`>>>>> MJServer.ResolverBase.EventSubscriptions: Creating new Map - this should only happen once per server instance <<<<<<`);
47
45
  g[ResolverBase._eventSubscriptionKey] = new Map<string, Subscription>();
48
46
  }
49
47
  return g[ResolverBase._eventSubscriptionKey];
@@ -91,7 +89,7 @@ export class ResolverBase {
91
89
  const e = provider.Entities.find((e) => e.Name === entity);
92
90
  if (!e) throw new Error(`Entity ${entity} not found in metadata`);
93
91
  // now build a SQL string using the entityInfo and using the properties in the params object
94
- let extraFilter = '';
92
+ let extraFilter = "";
95
93
  const keys = Object.keys(params);
96
94
  keys.forEach((k, i) => {
97
95
  if (i > 0) extraFilter += ' AND ';
@@ -104,35 +102,25 @@ export class ResolverBase {
104
102
 
105
103
  // ok, now we have a SQL string, run it and return the results
106
104
  // use the SQLServerDataProvider
107
- const result = await rv.RunView(
108
- {
109
- EntityName: entity,
110
- ExtraFilter: extraFilter,
111
- },
112
- contextUser
113
- );
105
+ const result = await rv.RunView({
106
+ EntityName: entity,
107
+ ExtraFilter: extraFilter,
108
+ }, contextUser)
114
109
  if (result && result.Success && result.Results.length > 0) {
115
110
  return result.Results;
116
- } else {
111
+ }
112
+ else {
117
113
  return [];
118
114
  }
119
115
  }
120
116
 
121
- async RunViewByNameGeneric(
122
- viewInput: RunViewByNameInput,
123
- provider: DatabaseProviderBase,
124
- userPayload: UserPayload,
125
- pubSub: PubSubEngine
126
- ) {
117
+ async RunViewByNameGeneric(viewInput: RunViewByNameInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
127
118
  try {
128
119
  const rv = provider as any as IRunViewProvider;
129
- const result = await rv.RunView<UserViewEntityExtended>(
130
- {
131
- EntityName: 'User Views',
132
- ExtraFilter: "Name='" + viewInput.ViewName + "'",
133
- },
134
- userPayload.userRecord
135
- );
120
+ const result = await rv.RunView<UserViewEntityExtended>({
121
+ EntityName: 'User Views',
122
+ ExtraFilter: "Name='" + viewInput.ViewName + "'",
123
+ }, userPayload.userRecord);
136
124
  if (result && result.Success && result.Results.length > 0) {
137
125
  const viewInfo = result.Results[0];
138
126
  return this.RunViewGenericInternal(
@@ -154,7 +142,8 @@ export class ResolverBase {
154
142
  viewInput.MaxRows,
155
143
  viewInput.StartRow
156
144
  );
157
- } else {
145
+ }
146
+ else {
158
147
  LogError(`RunViewByNameGeneric: View ${viewInput.ViewName} not found or no results returned`);
159
148
  return null;
160
149
  }
@@ -194,12 +183,7 @@ export class ResolverBase {
194
183
  }
195
184
  }
196
185
 
197
- async RunDynamicViewGeneric(
198
- viewInput: RunDynamicViewInput,
199
- provider: DatabaseProviderBase,
200
- userPayload: UserPayload,
201
- pubSub: PubSubEngine
202
- ) {
186
+ async RunDynamicViewGeneric(viewInput: RunDynamicViewInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
203
187
  try {
204
188
  const md = provider;
205
189
  const entity = md.Entities.find((e) => e.Name === viewInput.EntityName);
@@ -250,9 +234,7 @@ export class ResolverBase {
250
234
  let viewInfo: UserViewEntityExtended | null = null;
251
235
 
252
236
  if (viewInput.ViewName) {
253
- viewInfo = this.safeFirstArrayElement(
254
- await this.findBy(provider, 'User Views', { Name: viewInput.ViewName }, userPayload.userRecord)
255
- );
237
+ viewInfo = this.safeFirstArrayElement(await this.findBy(provider, 'User Views', { Name: viewInput.ViewName }, userPayload.userRecord));
256
238
  } else if (viewInput.ViewID) {
257
239
  viewInfo = await provider.GetEntityObject<UserViewEntityExtended>('User Views', contextUser);
258
240
  await viewInfo.Load(viewInput.ViewID);
@@ -290,7 +272,7 @@ export class ResolverBase {
290
272
  forceAuditLog: viewInput.ForceAuditLog,
291
273
  auditLogDescription: viewInput.AuditLogDescription,
292
274
  resultType: viewInput.ResultType,
293
- userPayload,
275
+ userPayload,
294
276
  });
295
277
  } catch (err) {
296
278
  LogError(err);
@@ -302,7 +284,7 @@ export class ResolverBase {
302
284
  return results;
303
285
  }
304
286
 
305
- private static _priorEmittedData: { Entity: string; PKey: CompositeKey }[] = [];
287
+ private static _priorEmittedData: {Entity: string, PKey: CompositeKey}[] = [];
306
288
  protected async EmitCloudEvent({ component, event, eventCode, args }: MJEvent) {
307
289
  if (ResolverBase._emit && event === MJEventType.ComponentEvent && eventCode === BaseEntity.BaseEventCode) {
308
290
  const extendedType = args instanceof BaseEntityEvent ? `.${args.type}` : '';
@@ -317,20 +299,20 @@ export class ResolverBase {
317
299
  // check to see if the combination of Entity and pkey was already emitted, if so, Log that condtion next
318
300
  const pkey = args.baseEntity.PrimaryKeys as CompositeKey;
319
301
  const emittedData = { Entity: args.baseEntity.EntityInfo.Name, PKey: pkey };
320
- if (
321
- ResolverBase._priorEmittedData.find((e) => {
322
- if (e.Entity !== emittedData.Entity) return false;
323
- // if we get here compare the pkeys
324
- const pkey2 = e.PKey as CompositeKey;
325
- if (pkey.KeyValuePairs.length !== pkey2.KeyValuePairs.length) return false;
326
- for (const kv of pkey.KeyValuePairs) {
327
- // find the match by field name
328
- const kv2 = pkey2.KeyValuePairs.find((k) => k.FieldName === kv.FieldName);
329
- if (!kv2 || kv2.Value !== kv.Value) return false;
330
- }
331
- return true; // if we get here, all the keys matched
332
- })
333
- ) {
302
+ if (ResolverBase._priorEmittedData.find((e) => {
303
+ if (e.Entity !== emittedData.Entity) return false;
304
+ // if we get here compare the pkeys
305
+ const pkey2 = e.PKey as CompositeKey;
306
+ if (pkey.KeyValuePairs.length !== pkey2.KeyValuePairs.length)
307
+ return false;
308
+ for (const kv of pkey.KeyValuePairs) {
309
+ // find the match by field name
310
+ const kv2 = pkey2.KeyValuePairs.find((k) => k.FieldName === kv.FieldName);
311
+ if (!kv2 || kv2.Value !== kv.Value)
312
+ return false;
313
+ }
314
+ return true; // if we get here, all the keys matched
315
+ })) {
334
316
  console.log(`IMPORTANT: CloudEvent already emitted for ${JSON.stringify(emittedData)}`);
335
317
  }
336
318
 
@@ -352,7 +334,7 @@ export class ResolverBase {
352
334
  if (!userPayload) {
353
335
  throw new Error(`userPayload is null`);
354
336
  }
355
-
337
+
356
338
  // first check permissions, the logged in user must have read permissions on the entity to run the view
357
339
  if (entityInfo) {
358
340
  const userInfo = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload.email.toLowerCase().trim()); // get the user record from MD so we have ROLES attached, don't use the one from payload directly
@@ -364,7 +346,8 @@ export class ResolverBase {
364
346
  if (!userPermissions.CanRead) {
365
347
  throw new Error(`User ${userPayload.email} does not have read permissions on ${entityInfo.Name}`);
366
348
  }
367
- } else {
349
+ }
350
+ else {
368
351
  throw new Error(`Entity not found in metadata`);
369
352
  }
370
353
  }
@@ -396,7 +379,7 @@ export class ResolverBase {
396
379
  try {
397
380
  if (!viewInfo || !userPayload) return null;
398
381
 
399
- const md = provider;
382
+ const md = provider
400
383
  const user = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload?.email.toLowerCase().trim());
401
384
  if (!user) throw new Error(`User ${userPayload?.email} not found in metadata`);
402
385
 
@@ -416,9 +399,11 @@ export class ResolverBase {
416
399
  let optimizedFields = fields;
417
400
  if (fields?.length) {
418
401
  // Always ensure primary keys are included for proper record handling
419
- const primaryKeys = entityInfo.PrimaryKeys.map((pk) => pk.Name);
420
- const missingPrimaryKeys = primaryKeys.filter((pk) => !fields.find((f) => f.toLowerCase() === pk.toLowerCase()));
421
-
402
+ const primaryKeys = entityInfo.PrimaryKeys.map(pk => pk.Name);
403
+ const missingPrimaryKeys = primaryKeys.filter(pk =>
404
+ !fields.find(f => f.toLowerCase() === pk.toLowerCase())
405
+ );
406
+
422
407
  if (missingPrimaryKeys.length) {
423
408
  optimizedFields = [...fields, ...missingPrimaryKeys];
424
409
  }
@@ -431,7 +416,7 @@ export class ResolverBase {
431
416
  EntityName: viewInfo.Entity,
432
417
  ExtraFilter: extraFilter,
433
418
  OrderBy: orderBy,
434
- Fields: optimizedFields, // Use optimized fields list
419
+ Fields: optimizedFields, // Use optimized fields list
435
420
  UserSearchString: userSearchString,
436
421
  ExcludeUserViewRunID: excludeUserViewRunID,
437
422
  OverrideExcludeFilter: overrideExcludeFilter,
@@ -454,7 +439,7 @@ export class ResolverBase {
454
439
  mapper.MapFields(r);
455
440
  }
456
441
  }
457
-
442
+
458
443
  return result;
459
444
  } catch (err) {
460
445
  // Fix #9: Improved error handling with structured logging
@@ -466,7 +451,7 @@ export class ResolverBase {
466
451
  entityName: viewInfo?.Entity,
467
452
  errorType: error.constructor.name,
468
453
  // Only include stack trace for non-validation errors
469
- stack: error.message?.includes('not found in metadata') ? undefined : error.stack,
454
+ stack: error.message?.includes('not found in metadata') ? undefined : error.stack
470
455
  });
471
456
  throw err;
472
457
  }
@@ -486,18 +471,18 @@ export class ResolverBase {
486
471
  let md: Metadata | null = null;
487
472
  const rv = params[0].provider as any as IRunViewProvider;
488
473
  let runViewParams: RunViewParams[] = [];
489
-
474
+
490
475
  // Fix #1: Get user info only once for all queries
491
476
  let contextUser: UserInfo | null = null;
492
477
  if (params[0]?.userPayload?.email) {
493
478
  const userEmail = params[0].userPayload.email.toLowerCase().trim();
494
- const user = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userEmail);
479
+ const user = UserCache.Users.find(u => u.Email.toLowerCase().trim() === userEmail);
495
480
  if (!user) {
496
481
  throw new Error(`User ${userEmail} not found in metadata`);
497
482
  }
498
483
  contextUser = user;
499
484
  }
500
-
485
+
501
486
  // Create a map of entities to validate only once per entity
502
487
  const validatedEntities = new Set<string>();
503
488
  md = new Metadata();
@@ -508,7 +493,7 @@ export class ResolverBase {
508
493
  // Validate entity only once per entity type
509
494
  const entityName = param.viewInfo.Entity;
510
495
  if (!validatedEntities.has(entityName)) {
511
- const entityInfo = md.Entities.find((e) => e.Name === entityName);
496
+ const entityInfo = md.Entities.find(e => e.Name === entityName);
512
497
  if (!entityInfo) {
513
498
  throw new Error(`Entity ${entityName} not found in metadata`);
514
499
  }
@@ -565,12 +550,7 @@ export class ResolverBase {
565
550
  }
566
551
  }
567
552
 
568
- protected async createRecordAccessAuditLogRecord(
569
- provider: DatabaseProviderBase,
570
- userPayload: UserPayload,
571
- entityName: string,
572
- recordId: any
573
- ): Promise<any> {
553
+ protected async createRecordAccessAuditLogRecord(provider: DatabaseProviderBase, userPayload: UserPayload, entityName: string, recordId: any): Promise<any> {
574
554
  try {
575
555
  const md = provider;
576
556
  const entityInfo = md.Entities.find((e) => e.Name.trim().toLowerCase() === entityName.trim().toLowerCase());
@@ -591,13 +571,7 @@ export class ResolverBase {
591
571
  }
592
572
  }
593
573
 
594
- protected getRowLevelSecurityWhereClause(
595
- provider: DatabaseProviderBase,
596
- entityName: string,
597
- userPayload: UserPayload,
598
- type: EntityPermissionType,
599
- returnPrefix: string
600
- ) {
574
+ protected getRowLevelSecurityWhereClause(provider: DatabaseProviderBase, entityName: string, userPayload: UserPayload, type: EntityPermissionType, returnPrefix: string) {
601
575
  const md = provider;
602
576
  const entityInfo = md.Entities.find((e) => e.Name.trim().toLowerCase() === entityName.trim().toLowerCase());
603
577
  if (!entityInfo) throw new Error(`Entity ${entityName} not found in metadata`);
@@ -646,8 +620,10 @@ export class ResolverBase {
646
620
 
647
621
  if (recordId) auditLog.RecordID = recordId;
648
622
 
649
- if (await auditLog.Save()) return auditLog;
650
- else throw new Error(`Error saving audit log record`);
623
+ if (await auditLog.Save())
624
+ return auditLog;
625
+ else
626
+ throw new Error(`Error saving audit log record`);
651
627
  } catch (err) {
652
628
  console.log(err);
653
629
  return null;
@@ -669,11 +645,14 @@ export class ResolverBase {
669
645
  return UserCache.Users.find((u) => u.Email.toLowerCase().trim() === email.toLowerCase().trim());
670
646
  }
671
647
  protected GetUserFromPayload(userPayload: UserPayload): UserInfo | undefined {
672
- if (!userPayload) return undefined;
648
+ if (!userPayload)
649
+ return undefined;
673
650
 
674
- if (userPayload.userRecord) return userPayload.userRecord; // if we have a user record, use that directly
651
+ if (userPayload.userRecord)
652
+ return userPayload.userRecord; // if we have a user record, use that directly
675
653
 
676
- if (!userPayload.email) return undefined;
654
+ if (!userPayload.email)
655
+ return undefined;
677
656
 
678
657
  return UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload.email.toLowerCase().trim());
679
658
  }
@@ -690,24 +669,15 @@ export class ResolverBase {
690
669
 
691
670
  if (!this.EventSubscriptions.has(uniqueKey)) {
692
671
  // listen for events from the entityObject in case it is a long running task and we can push messages back to the client via pubSub
693
- LogDebug(
694
- `ResolverBase.ListenForEntityMessages: About to call MJGlobal.Instance.GetEventListener() to get the event listener subscription for ${uniqueKey}`
695
- );
672
+ LogDebug(`ResolverBase.ListenForEntityMessages: About to call MJGlobal.Instance.GetEventListener() to get the event listener subscription for ${uniqueKey}`);
696
673
  const theSub = MJGlobal.Instance.GetEventListener(false).subscribe(async (event: MJEvent) => {
697
674
  if (event) {
698
675
  const baseEntity = <BaseEntity>event.args?.baseEntity;
699
676
  const baseEntityValues = baseEntity ? baseEntity.GetAll() : null;
700
- const eventToLog = {
701
- entityName: entityObject.EntityInfo.Name,
702
- baseEntity: baseEntityValues,
703
- event: event.event,
704
- eventCode: event.eventCode,
705
- };
706
- LogDebug(
707
- `ResolverBase.ListenForEntityMessages: Received Event from within MJGlobal.Instance.GetEventListener() callback. Will call EmitCloudEvent() next\nEvent data:\n${JSON.stringify(eventToLog)}`
708
- );
677
+ const eventToLog = { entityName: entityObject.EntityInfo.Name, baseEntity: baseEntityValues, event: event.event, eventCode: event.eventCode };
678
+ LogDebug(`ResolverBase.ListenForEntityMessages: Received Event from within MJGlobal.Instance.GetEventListener() callback. Will call EmitCloudEvent() next\nEvent data:\n${JSON.stringify(eventToLog)}`);
709
679
  await this.EmitCloudEvent(event);
710
- LogDebug(`ResolverBase.ListenForEntityMessages: EmitCloudEvent() completed successfully`);
680
+ LogDebug(`ResolverBase.ListenForEntityMessages: EmitCloudEvent() completed successfully`);
711
681
 
712
682
  if (event.args && event.args instanceof BaseEntityEvent) {
713
683
  const baseEntityEvent = event.args as BaseEntityEvent;
@@ -730,13 +700,7 @@ export class ResolverBase {
730
700
  }
731
701
  }
732
702
 
733
- protected async CreateRecord(
734
- entityName: string,
735
- input: any,
736
- provider: DatabaseProviderBase,
737
- userPayload: UserPayload,
738
- pubSub: PubSubEngine
739
- ) {
703
+ protected async CreateRecord(entityName: string, input: any, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
740
704
  if (await this.BeforeCreate(provider, input)) {
741
705
  // fire event and proceed if it wasn't cancelled
742
706
  const entityObject = await provider.GetEntityObject(entityName, this.GetUserFromPayload(userPayload));
@@ -762,13 +726,7 @@ export class ResolverBase {
762
726
  }
763
727
  protected async AfterCreate(provider: DatabaseProviderBase, input: any) {}
764
728
 
765
- protected async UpdateRecord(
766
- entityName: string,
767
- input: any,
768
- provider: DatabaseProviderBase,
769
- userPayload: UserPayload,
770
- pubSub: PubSubEngine
771
- ) {
729
+ protected async UpdateRecord(entityName: string, input: any, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
772
730
  if (await this.BeforeUpdate(provider, input)) {
773
731
  // fire event and proceed if it wasn't cancelled
774
732
  const userInfo = this.GetUserFromPayload(userPayload);
@@ -821,11 +779,11 @@ export class ResolverBase {
821
779
  }
822
780
 
823
781
  this.ListenForEntityMessages(entityObject, pubSub, userPayload);
824
-
782
+
825
783
  if (await entityObject.Save()) {
826
784
  // save worked, fire afterevent and return all the data
827
785
  await this.AfterUpdate(provider, input); // fire event
828
-
786
+
829
787
  return this.MapFieldNamesToCodeNames(entityName, entityObject.GetAll());
830
788
  } else {
831
789
  throw new GraphQLError(entityObject.LatestResult?.Message ?? 'Unknown error', {
@@ -837,7 +795,7 @@ export class ResolverBase {
837
795
  extensions: { code: 'SAVE_ENTITY_ERROR', entityName },
838
796
  });
839
797
  }
840
-
798
+
841
799
  /**
842
800
  * This routine compares the OldValues property in the input object to the values in the DB that we just loaded. If there are differences, we need to check to see if the client
843
801
  * is trying to update any of those fields (e.g. overlap). If there is overlap, we throw an error. If there is no overlap, we can proceed with the update even if the DB Values
@@ -861,7 +819,8 @@ export class ResolverBase {
861
819
  case EntityFieldTSType.Number:
862
820
  if (val == null && val == undefined) {
863
821
  val = null;
864
- } else {
822
+ }
823
+ else {
865
824
  let typeLowered = (field.Type as string).toLowerCase();
866
825
 
867
826
  switch (typeLowered) {
@@ -962,7 +921,7 @@ export class ResolverBase {
962
921
  DBDifferences: dbDifferences,
963
922
  Overlap: overlap,
964
923
  };
965
-
924
+
966
925
  // Log as warning to console and ErrorLog table instead of throwing error
967
926
  console.warn('Entity save inconsistency detected but allowing save to continue:', JSON.stringify(msg));
968
927
  LogError({
@@ -973,8 +932,8 @@ export class ResolverBase {
973
932
  entityName: entityObject.EntityInfo.Name,
974
933
  clientDifferences: clientDifferences,
975
934
  dbDifferences: dbDifferences,
976
- overlap: overlap,
977
- },
935
+ overlap: overlap
936
+ }
978
937
  });
979
938
 
980
939
  // Create ErrorLog record in the database
@@ -986,7 +945,7 @@ export class ResolverBase {
986
945
  errorLogEntity.Status = 'Warning';
987
946
  errorLogEntity.Category = 'Entity Save';
988
947
  errorLogEntity.CreatedBy = contextUser.Email || contextUser.Name;
989
-
948
+
990
949
  const saveResult = await errorLogEntity.Save();
991
950
  if (!saveResult) {
992
951
  console.error('Failed to save ErrorLog record');
@@ -1017,7 +976,7 @@ export class ResolverBase {
1017
976
  const returnValue = entityObject.GetAll(); // grab the values before we delete so we can return last state before delete if we are successful.
1018
977
 
1019
978
  this.ListenForEntityMessages(entityObject, pubSub, userPayload);
1020
-
979
+
1021
980
  if (await entityObject.Delete(options)) {
1022
981
  await this.AfterDelete(provider, key); // fire event
1023
982
  return returnValue;
@@ -1,7 +1,7 @@
1
1
  import { Arg, Ctx, Field, InputType, Int, ObjectType, PubSubEngine, Query, Resolver } from 'type-graphql';
2
2
  import { AppContext } from '../types.js';
3
3
  import { ResolverBase } from './ResolverBase.js';
4
- import { LogError, LogStatus, EntityInfo } from '@memberjunction/global';
4
+ import { LogError, LogStatus, EntityInfo } from '@memberjunction/core';
5
5
  import { RequireSystemUser } from '../directives/RequireSystemUser.js';
6
6
  import { GetReadOnlyProvider } from '../util.js';
7
7
  import { UserViewEntityExtended } from '@memberjunction/core-entities';
@@ -385,8 +385,8 @@ export class RunViewGenericInput {
385
385
 
386
386
  @ObjectType()
387
387
  export class RunViewResultRow {
388
- @Field(() => [KeyValuePairOutputType], {
389
- description: 'Primary key values for the record',
388
+ @Field(() => [KeyValuePairOutputType], {
389
+ description: 'Primary key values for the record'
390
390
  })
391
391
  PrimaryKey: KeyValuePairOutputType[];
392
392
 
@@ -399,8 +399,8 @@ export class RunViewResultRow {
399
399
 
400
400
  @ObjectType()
401
401
  export class RunViewGenericResultRow {
402
- @Field(() => [KeyValuePairOutputType], {
403
- description: 'Primary key values for the record',
402
+ @Field(() => [KeyValuePairOutputType], {
403
+ description: 'Primary key values for the record'
404
404
  })
405
405
  PrimaryKey: KeyValuePairOutputType[];
406
406
 
@@ -470,11 +470,10 @@ export class RunViewResolver extends ResolverBase {
470
470
  try {
471
471
  const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
472
472
  const rawData = await super.RunViewByNameGeneric(input, provider, userPayload, pubSub);
473
- if (rawData === null) return null;
473
+ if (rawData === null)
474
+ return null;
474
475
 
475
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
476
- await super.findBy<UserViewEntityExtended>(provider, 'User Views', { Name: input.ViewName }, userPayload.userRecord)
477
- );
476
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { Name: input.ViewName }, userPayload.userRecord));
478
477
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
479
478
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
480
479
  return {
@@ -499,11 +498,10 @@ export class RunViewResolver extends ResolverBase {
499
498
  try {
500
499
  const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
501
500
  const rawData = await super.RunViewByIDGeneric(input, provider, userPayload, pubSub);
502
- if (rawData === null) return null;
501
+ if (rawData === null)
502
+ return null;
503
503
 
504
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
505
- await super.findBy<UserViewEntityExtended>(provider, 'User Views', { ID: input.ViewID }, userPayload.userRecord)
506
- );
504
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
507
505
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
508
506
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
509
507
  return {
@@ -597,7 +595,7 @@ export class RunViewResolver extends ResolverBase {
597
595
  ErrorMessage: `Failed to execute view: ${input.ViewName}`,
598
596
  RowCount: 0,
599
597
  TotalRowCount: 0,
600
- ExecutionTime: 0,
598
+ ExecutionTime: 0
601
599
  };
602
600
  }
603
601
 
@@ -622,7 +620,7 @@ export class RunViewResolver extends ResolverBase {
622
620
  ErrorMessage: errorMessage,
623
621
  RowCount: 0,
624
622
  TotalRowCount: 0,
625
- ExecutionTime: 0,
623
+ ExecutionTime: 0
626
624
  };
627
625
  }
628
626
  }
@@ -644,13 +642,11 @@ export class RunViewResolver extends ResolverBase {
644
642
  ErrorMessage: `Failed to execute view with ID: ${input.ViewID}`,
645
643
  RowCount: 0,
646
644
  TotalRowCount: 0,
647
- ExecutionTime: 0,
645
+ ExecutionTime: 0
648
646
  };
649
647
  }
650
648
 
651
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
652
- await super.findBy<UserViewEntityExtended>(provider, 'User Views', { ID: input.ViewID }, userPayload.userRecord)
653
- );
649
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
654
650
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
655
651
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
656
652
  return {
@@ -671,7 +667,7 @@ export class RunViewResolver extends ResolverBase {
671
667
  ErrorMessage: errorMessage,
672
668
  RowCount: 0,
673
669
  TotalRowCount: 0,
674
- ExecutionTime: 0,
670
+ ExecutionTime: 0
675
671
  };
676
672
  }
677
673
  }
@@ -693,7 +689,7 @@ export class RunViewResolver extends ResolverBase {
693
689
  ErrorMessage: 'Failed to execute dynamic view',
694
690
  RowCount: 0,
695
691
  TotalRowCount: 0,
696
- ExecutionTime: 0,
692
+ ExecutionTime: 0
697
693
  };
698
694
  }
699
695
 
@@ -707,7 +703,7 @@ export class RunViewResolver extends ResolverBase {
707
703
  ErrorMessage: errorMsg,
708
704
  RowCount: 0,
709
705
  TotalRowCount: 0,
710
- ExecutionTime: 0,
706
+ ExecutionTime: 0
711
707
  };
712
708
  }
713
709
  const returnData = this.processRawData(rawData.Results, entity.ID, entity);
@@ -729,7 +725,7 @@ export class RunViewResolver extends ResolverBase {
729
725
  ErrorMessage: errorMessage,
730
726
  RowCount: 0,
731
727
  TotalRowCount: 0,
732
- ExecutionTime: 0,
728
+ ExecutionTime: 0
733
729
  };
734
730
  }
735
731
  }
@@ -779,13 +775,13 @@ export class RunViewResolver extends ResolverBase {
779
775
  const returnResult = [];
780
776
  for (let i = 0; i < rawData.length; i++) {
781
777
  const row = rawData[i];
782
-
778
+
783
779
  // Build the primary key array from the entity's primary key fields
784
- const primaryKey: KeyValuePairOutputType[] = entityInfo.PrimaryKeys.map((pk) => ({
780
+ const primaryKey: KeyValuePairOutputType[] = entityInfo.PrimaryKeys.map(pk => ({
785
781
  FieldName: pk.Name,
786
- Value: row[pk.Name]?.toString() || '',
782
+ Value: row[pk.Name]?.toString() || ''
787
783
  }));
788
-
784
+
789
785
  returnResult.push({
790
786
  PrimaryKey: primaryKey,
791
787
  EntityID: entityId,