@memberjunction/server 2.111.1 → 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,7 +1,5 @@
1
- import { KeyValuePair } from "@memberjunction/core";
2
- import { Field, InputType, ObjectType } from "type-graphql";
3
-
4
-
1
+ import { KeyValuePair } from '@memberjunction/global';
2
+ import { Field, InputType, ObjectType } from 'type-graphql';
5
3
 
6
4
  @InputType()
7
5
  export class KeyValuePairInputType {
@@ -20,7 +18,6 @@ export class KeyValuePairOutputType {
20
18
  @Field(() => String)
21
19
  Value: string;
22
20
  }
23
-
24
21
 
25
22
  @InputType()
26
23
  export class CompositeKeyInputType {
@@ -32,4 +29,4 @@ export class CompositeKeyInputType {
32
29
  export class CompositeKeyOutputType {
33
30
  @Field(() => [KeyValuePairOutputType])
34
31
  KeyValuePairs: KeyValuePair[];
35
- }
32
+ }
@@ -15,7 +15,7 @@ import {
15
15
  RunViewParams,
16
16
  RunViewResult,
17
17
  UserInfo,
18
- } from '@memberjunction/core';
18
+ } from '@memberjunction/global';
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,7 +41,9 @@ 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(`>>>>> MJServer.ResolverBase.EventSubscriptions: Creating new Map - this should only happen once per server instance <<<<<<`);
44
+ LogDebug(
45
+ `>>>>> MJServer.ResolverBase.EventSubscriptions: Creating new Map - this should only happen once per server instance <<<<<<`
46
+ );
45
47
  g[ResolverBase._eventSubscriptionKey] = new Map<string, Subscription>();
46
48
  }
47
49
  return g[ResolverBase._eventSubscriptionKey];
@@ -89,7 +91,7 @@ export class ResolverBase {
89
91
  const e = provider.Entities.find((e) => e.Name === entity);
90
92
  if (!e) throw new Error(`Entity ${entity} not found in metadata`);
91
93
  // now build a SQL string using the entityInfo and using the properties in the params object
92
- let extraFilter = "";
94
+ let extraFilter = '';
93
95
  const keys = Object.keys(params);
94
96
  keys.forEach((k, i) => {
95
97
  if (i > 0) extraFilter += ' AND ';
@@ -102,25 +104,35 @@ export class ResolverBase {
102
104
 
103
105
  // ok, now we have a SQL string, run it and return the results
104
106
  // use the SQLServerDataProvider
105
- const result = await rv.RunView({
106
- EntityName: entity,
107
- ExtraFilter: extraFilter,
108
- }, contextUser)
107
+ const result = await rv.RunView(
108
+ {
109
+ EntityName: entity,
110
+ ExtraFilter: extraFilter,
111
+ },
112
+ contextUser
113
+ );
109
114
  if (result && result.Success && result.Results.length > 0) {
110
115
  return result.Results;
111
- }
112
- else {
116
+ } else {
113
117
  return [];
114
118
  }
115
119
  }
116
120
 
117
- async RunViewByNameGeneric(viewInput: RunViewByNameInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
121
+ async RunViewByNameGeneric(
122
+ viewInput: RunViewByNameInput,
123
+ provider: DatabaseProviderBase,
124
+ userPayload: UserPayload,
125
+ pubSub: PubSubEngine
126
+ ) {
118
127
  try {
119
128
  const rv = provider as any as IRunViewProvider;
120
- const result = await rv.RunView<UserViewEntityExtended>({
121
- EntityName: 'User Views',
122
- ExtraFilter: "Name='" + viewInput.ViewName + "'",
123
- }, userPayload.userRecord);
129
+ const result = await rv.RunView<UserViewEntityExtended>(
130
+ {
131
+ EntityName: 'User Views',
132
+ ExtraFilter: "Name='" + viewInput.ViewName + "'",
133
+ },
134
+ userPayload.userRecord
135
+ );
124
136
  if (result && result.Success && result.Results.length > 0) {
125
137
  const viewInfo = result.Results[0];
126
138
  return this.RunViewGenericInternal(
@@ -142,8 +154,7 @@ export class ResolverBase {
142
154
  viewInput.MaxRows,
143
155
  viewInput.StartRow
144
156
  );
145
- }
146
- else {
157
+ } else {
147
158
  LogError(`RunViewByNameGeneric: View ${viewInput.ViewName} not found or no results returned`);
148
159
  return null;
149
160
  }
@@ -183,7 +194,12 @@ export class ResolverBase {
183
194
  }
184
195
  }
185
196
 
186
- async RunDynamicViewGeneric(viewInput: RunDynamicViewInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
197
+ async RunDynamicViewGeneric(
198
+ viewInput: RunDynamicViewInput,
199
+ provider: DatabaseProviderBase,
200
+ userPayload: UserPayload,
201
+ pubSub: PubSubEngine
202
+ ) {
187
203
  try {
188
204
  const md = provider;
189
205
  const entity = md.Entities.find((e) => e.Name === viewInput.EntityName);
@@ -234,7 +250,9 @@ export class ResolverBase {
234
250
  let viewInfo: UserViewEntityExtended | null = null;
235
251
 
236
252
  if (viewInput.ViewName) {
237
- viewInfo = this.safeFirstArrayElement(await this.findBy(provider, 'User Views', { Name: viewInput.ViewName }, userPayload.userRecord));
253
+ viewInfo = this.safeFirstArrayElement(
254
+ await this.findBy(provider, 'User Views', { Name: viewInput.ViewName }, userPayload.userRecord)
255
+ );
238
256
  } else if (viewInput.ViewID) {
239
257
  viewInfo = await provider.GetEntityObject<UserViewEntityExtended>('User Views', contextUser);
240
258
  await viewInfo.Load(viewInput.ViewID);
@@ -272,7 +290,7 @@ export class ResolverBase {
272
290
  forceAuditLog: viewInput.ForceAuditLog,
273
291
  auditLogDescription: viewInput.AuditLogDescription,
274
292
  resultType: viewInput.ResultType,
275
- userPayload,
293
+ userPayload,
276
294
  });
277
295
  } catch (err) {
278
296
  LogError(err);
@@ -284,7 +302,7 @@ export class ResolverBase {
284
302
  return results;
285
303
  }
286
304
 
287
- private static _priorEmittedData: {Entity: string, PKey: CompositeKey}[] = [];
305
+ private static _priorEmittedData: { Entity: string; PKey: CompositeKey }[] = [];
288
306
  protected async EmitCloudEvent({ component, event, eventCode, args }: MJEvent) {
289
307
  if (ResolverBase._emit && event === MJEventType.ComponentEvent && eventCode === BaseEntity.BaseEventCode) {
290
308
  const extendedType = args instanceof BaseEntityEvent ? `.${args.type}` : '';
@@ -299,20 +317,20 @@ export class ResolverBase {
299
317
  // check to see if the combination of Entity and pkey was already emitted, if so, Log that condtion next
300
318
  const pkey = args.baseEntity.PrimaryKeys as CompositeKey;
301
319
  const emittedData = { Entity: args.baseEntity.EntityInfo.Name, PKey: pkey };
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
- })) {
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
+ ) {
316
334
  console.log(`IMPORTANT: CloudEvent already emitted for ${JSON.stringify(emittedData)}`);
317
335
  }
318
336
 
@@ -334,7 +352,7 @@ export class ResolverBase {
334
352
  if (!userPayload) {
335
353
  throw new Error(`userPayload is null`);
336
354
  }
337
-
355
+
338
356
  // first check permissions, the logged in user must have read permissions on the entity to run the view
339
357
  if (entityInfo) {
340
358
  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
@@ -346,8 +364,7 @@ export class ResolverBase {
346
364
  if (!userPermissions.CanRead) {
347
365
  throw new Error(`User ${userPayload.email} does not have read permissions on ${entityInfo.Name}`);
348
366
  }
349
- }
350
- else {
367
+ } else {
351
368
  throw new Error(`Entity not found in metadata`);
352
369
  }
353
370
  }
@@ -379,7 +396,7 @@ export class ResolverBase {
379
396
  try {
380
397
  if (!viewInfo || !userPayload) return null;
381
398
 
382
- const md = provider
399
+ const md = provider;
383
400
  const user = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload?.email.toLowerCase().trim());
384
401
  if (!user) throw new Error(`User ${userPayload?.email} not found in metadata`);
385
402
 
@@ -399,11 +416,9 @@ export class ResolverBase {
399
416
  let optimizedFields = fields;
400
417
  if (fields?.length) {
401
418
  // Always ensure primary keys are included for proper record handling
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
-
419
+ const primaryKeys = entityInfo.PrimaryKeys.map((pk) => pk.Name);
420
+ const missingPrimaryKeys = primaryKeys.filter((pk) => !fields.find((f) => f.toLowerCase() === pk.toLowerCase()));
421
+
407
422
  if (missingPrimaryKeys.length) {
408
423
  optimizedFields = [...fields, ...missingPrimaryKeys];
409
424
  }
@@ -416,7 +431,7 @@ export class ResolverBase {
416
431
  EntityName: viewInfo.Entity,
417
432
  ExtraFilter: extraFilter,
418
433
  OrderBy: orderBy,
419
- Fields: optimizedFields, // Use optimized fields list
434
+ Fields: optimizedFields, // Use optimized fields list
420
435
  UserSearchString: userSearchString,
421
436
  ExcludeUserViewRunID: excludeUserViewRunID,
422
437
  OverrideExcludeFilter: overrideExcludeFilter,
@@ -439,7 +454,7 @@ export class ResolverBase {
439
454
  mapper.MapFields(r);
440
455
  }
441
456
  }
442
-
457
+
443
458
  return result;
444
459
  } catch (err) {
445
460
  // Fix #9: Improved error handling with structured logging
@@ -451,7 +466,7 @@ export class ResolverBase {
451
466
  entityName: viewInfo?.Entity,
452
467
  errorType: error.constructor.name,
453
468
  // Only include stack trace for non-validation errors
454
- stack: error.message?.includes('not found in metadata') ? undefined : error.stack
469
+ stack: error.message?.includes('not found in metadata') ? undefined : error.stack,
455
470
  });
456
471
  throw err;
457
472
  }
@@ -471,18 +486,18 @@ export class ResolverBase {
471
486
  let md: Metadata | null = null;
472
487
  const rv = params[0].provider as any as IRunViewProvider;
473
488
  let runViewParams: RunViewParams[] = [];
474
-
489
+
475
490
  // Fix #1: Get user info only once for all queries
476
491
  let contextUser: UserInfo | null = null;
477
492
  if (params[0]?.userPayload?.email) {
478
493
  const userEmail = params[0].userPayload.email.toLowerCase().trim();
479
- const user = UserCache.Users.find(u => u.Email.toLowerCase().trim() === userEmail);
494
+ const user = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userEmail);
480
495
  if (!user) {
481
496
  throw new Error(`User ${userEmail} not found in metadata`);
482
497
  }
483
498
  contextUser = user;
484
499
  }
485
-
500
+
486
501
  // Create a map of entities to validate only once per entity
487
502
  const validatedEntities = new Set<string>();
488
503
  md = new Metadata();
@@ -493,7 +508,7 @@ export class ResolverBase {
493
508
  // Validate entity only once per entity type
494
509
  const entityName = param.viewInfo.Entity;
495
510
  if (!validatedEntities.has(entityName)) {
496
- const entityInfo = md.Entities.find(e => e.Name === entityName);
511
+ const entityInfo = md.Entities.find((e) => e.Name === entityName);
497
512
  if (!entityInfo) {
498
513
  throw new Error(`Entity ${entityName} not found in metadata`);
499
514
  }
@@ -550,7 +565,12 @@ export class ResolverBase {
550
565
  }
551
566
  }
552
567
 
553
- protected async createRecordAccessAuditLogRecord(provider: DatabaseProviderBase, userPayload: UserPayload, entityName: string, recordId: any): Promise<any> {
568
+ protected async createRecordAccessAuditLogRecord(
569
+ provider: DatabaseProviderBase,
570
+ userPayload: UserPayload,
571
+ entityName: string,
572
+ recordId: any
573
+ ): Promise<any> {
554
574
  try {
555
575
  const md = provider;
556
576
  const entityInfo = md.Entities.find((e) => e.Name.trim().toLowerCase() === entityName.trim().toLowerCase());
@@ -571,7 +591,13 @@ export class ResolverBase {
571
591
  }
572
592
  }
573
593
 
574
- protected getRowLevelSecurityWhereClause(provider: DatabaseProviderBase, entityName: string, userPayload: UserPayload, type: EntityPermissionType, returnPrefix: string) {
594
+ protected getRowLevelSecurityWhereClause(
595
+ provider: DatabaseProviderBase,
596
+ entityName: string,
597
+ userPayload: UserPayload,
598
+ type: EntityPermissionType,
599
+ returnPrefix: string
600
+ ) {
575
601
  const md = provider;
576
602
  const entityInfo = md.Entities.find((e) => e.Name.trim().toLowerCase() === entityName.trim().toLowerCase());
577
603
  if (!entityInfo) throw new Error(`Entity ${entityName} not found in metadata`);
@@ -620,10 +646,8 @@ export class ResolverBase {
620
646
 
621
647
  if (recordId) auditLog.RecordID = recordId;
622
648
 
623
- if (await auditLog.Save())
624
- return auditLog;
625
- else
626
- throw new Error(`Error saving audit log record`);
649
+ if (await auditLog.Save()) return auditLog;
650
+ else throw new Error(`Error saving audit log record`);
627
651
  } catch (err) {
628
652
  console.log(err);
629
653
  return null;
@@ -645,14 +669,11 @@ export class ResolverBase {
645
669
  return UserCache.Users.find((u) => u.Email.toLowerCase().trim() === email.toLowerCase().trim());
646
670
  }
647
671
  protected GetUserFromPayload(userPayload: UserPayload): UserInfo | undefined {
648
- if (!userPayload)
649
- return undefined;
672
+ if (!userPayload) return undefined;
650
673
 
651
- if (userPayload.userRecord)
652
- return userPayload.userRecord; // if we have a user record, use that directly
674
+ if (userPayload.userRecord) return userPayload.userRecord; // if we have a user record, use that directly
653
675
 
654
- if (!userPayload.email)
655
- return undefined;
676
+ if (!userPayload.email) return undefined;
656
677
 
657
678
  return UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload.email.toLowerCase().trim());
658
679
  }
@@ -669,15 +690,24 @@ export class ResolverBase {
669
690
 
670
691
  if (!this.EventSubscriptions.has(uniqueKey)) {
671
692
  // 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
672
- LogDebug(`ResolverBase.ListenForEntityMessages: About to call MJGlobal.Instance.GetEventListener() to get the event listener subscription for ${uniqueKey}`);
693
+ LogDebug(
694
+ `ResolverBase.ListenForEntityMessages: About to call MJGlobal.Instance.GetEventListener() to get the event listener subscription for ${uniqueKey}`
695
+ );
673
696
  const theSub = MJGlobal.Instance.GetEventListener(false).subscribe(async (event: MJEvent) => {
674
697
  if (event) {
675
698
  const baseEntity = <BaseEntity>event.args?.baseEntity;
676
699
  const baseEntityValues = baseEntity ? baseEntity.GetAll() : null;
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)}`);
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
+ );
679
709
  await this.EmitCloudEvent(event);
680
- LogDebug(`ResolverBase.ListenForEntityMessages: EmitCloudEvent() completed successfully`);
710
+ LogDebug(`ResolverBase.ListenForEntityMessages: EmitCloudEvent() completed successfully`);
681
711
 
682
712
  if (event.args && event.args instanceof BaseEntityEvent) {
683
713
  const baseEntityEvent = event.args as BaseEntityEvent;
@@ -700,7 +730,13 @@ export class ResolverBase {
700
730
  }
701
731
  }
702
732
 
703
- protected async CreateRecord(entityName: string, input: any, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
733
+ protected async CreateRecord(
734
+ entityName: string,
735
+ input: any,
736
+ provider: DatabaseProviderBase,
737
+ userPayload: UserPayload,
738
+ pubSub: PubSubEngine
739
+ ) {
704
740
  if (await this.BeforeCreate(provider, input)) {
705
741
  // fire event and proceed if it wasn't cancelled
706
742
  const entityObject = await provider.GetEntityObject(entityName, this.GetUserFromPayload(userPayload));
@@ -726,7 +762,13 @@ export class ResolverBase {
726
762
  }
727
763
  protected async AfterCreate(provider: DatabaseProviderBase, input: any) {}
728
764
 
729
- protected async UpdateRecord(entityName: string, input: any, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
765
+ protected async UpdateRecord(
766
+ entityName: string,
767
+ input: any,
768
+ provider: DatabaseProviderBase,
769
+ userPayload: UserPayload,
770
+ pubSub: PubSubEngine
771
+ ) {
730
772
  if (await this.BeforeUpdate(provider, input)) {
731
773
  // fire event and proceed if it wasn't cancelled
732
774
  const userInfo = this.GetUserFromPayload(userPayload);
@@ -779,11 +821,11 @@ export class ResolverBase {
779
821
  }
780
822
 
781
823
  this.ListenForEntityMessages(entityObject, pubSub, userPayload);
782
-
824
+
783
825
  if (await entityObject.Save()) {
784
826
  // save worked, fire afterevent and return all the data
785
827
  await this.AfterUpdate(provider, input); // fire event
786
-
828
+
787
829
  return this.MapFieldNamesToCodeNames(entityName, entityObject.GetAll());
788
830
  } else {
789
831
  throw new GraphQLError(entityObject.LatestResult?.Message ?? 'Unknown error', {
@@ -795,7 +837,7 @@ export class ResolverBase {
795
837
  extensions: { code: 'SAVE_ENTITY_ERROR', entityName },
796
838
  });
797
839
  }
798
-
840
+
799
841
  /**
800
842
  * 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
801
843
  * 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
@@ -819,8 +861,7 @@ export class ResolverBase {
819
861
  case EntityFieldTSType.Number:
820
862
  if (val == null && val == undefined) {
821
863
  val = null;
822
- }
823
- else {
864
+ } else {
824
865
  let typeLowered = (field.Type as string).toLowerCase();
825
866
 
826
867
  switch (typeLowered) {
@@ -921,7 +962,7 @@ export class ResolverBase {
921
962
  DBDifferences: dbDifferences,
922
963
  Overlap: overlap,
923
964
  };
924
-
965
+
925
966
  // Log as warning to console and ErrorLog table instead of throwing error
926
967
  console.warn('Entity save inconsistency detected but allowing save to continue:', JSON.stringify(msg));
927
968
  LogError({
@@ -932,8 +973,8 @@ export class ResolverBase {
932
973
  entityName: entityObject.EntityInfo.Name,
933
974
  clientDifferences: clientDifferences,
934
975
  dbDifferences: dbDifferences,
935
- overlap: overlap
936
- }
976
+ overlap: overlap,
977
+ },
937
978
  });
938
979
 
939
980
  // Create ErrorLog record in the database
@@ -945,7 +986,7 @@ export class ResolverBase {
945
986
  errorLogEntity.Status = 'Warning';
946
987
  errorLogEntity.Category = 'Entity Save';
947
988
  errorLogEntity.CreatedBy = contextUser.Email || contextUser.Name;
948
-
989
+
949
990
  const saveResult = await errorLogEntity.Save();
950
991
  if (!saveResult) {
951
992
  console.error('Failed to save ErrorLog record');
@@ -976,7 +1017,7 @@ export class ResolverBase {
976
1017
  const returnValue = entityObject.GetAll(); // grab the values before we delete so we can return last state before delete if we are successful.
977
1018
 
978
1019
  this.ListenForEntityMessages(entityObject, pubSub, userPayload);
979
-
1020
+
980
1021
  if (await entityObject.Delete(options)) {
981
1022
  await this.AfterDelete(provider, key); // fire event
982
1023
  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/core';
4
+ import { LogError, LogStatus, EntityInfo } from '@memberjunction/global';
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,10 +470,11 @@ 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)
474
- return null;
473
+ if (rawData === null) return null;
475
474
 
476
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { Name: input.ViewName }, userPayload.userRecord));
475
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
476
+ await super.findBy<UserViewEntityExtended>(provider, 'User Views', { Name: input.ViewName }, userPayload.userRecord)
477
+ );
477
478
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
478
479
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
479
480
  return {
@@ -498,10 +499,11 @@ export class RunViewResolver extends ResolverBase {
498
499
  try {
499
500
  const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
500
501
  const rawData = await super.RunViewByIDGeneric(input, provider, userPayload, pubSub);
501
- if (rawData === null)
502
- return null;
502
+ if (rawData === null) return null;
503
503
 
504
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
504
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
505
+ await super.findBy<UserViewEntityExtended>(provider, 'User Views', { ID: input.ViewID }, userPayload.userRecord)
506
+ );
505
507
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
506
508
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
507
509
  return {
@@ -595,7 +597,7 @@ export class RunViewResolver extends ResolverBase {
595
597
  ErrorMessage: `Failed to execute view: ${input.ViewName}`,
596
598
  RowCount: 0,
597
599
  TotalRowCount: 0,
598
- ExecutionTime: 0
600
+ ExecutionTime: 0,
599
601
  };
600
602
  }
601
603
 
@@ -620,7 +622,7 @@ export class RunViewResolver extends ResolverBase {
620
622
  ErrorMessage: errorMessage,
621
623
  RowCount: 0,
622
624
  TotalRowCount: 0,
623
- ExecutionTime: 0
625
+ ExecutionTime: 0,
624
626
  };
625
627
  }
626
628
  }
@@ -642,11 +644,13 @@ export class RunViewResolver extends ResolverBase {
642
644
  ErrorMessage: `Failed to execute view with ID: ${input.ViewID}`,
643
645
  RowCount: 0,
644
646
  TotalRowCount: 0,
645
- ExecutionTime: 0
647
+ ExecutionTime: 0,
646
648
  };
647
649
  }
648
650
 
649
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
651
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
652
+ await super.findBy<UserViewEntityExtended>(provider, 'User Views', { ID: input.ViewID }, userPayload.userRecord)
653
+ );
650
654
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
651
655
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
652
656
  return {
@@ -667,7 +671,7 @@ export class RunViewResolver extends ResolverBase {
667
671
  ErrorMessage: errorMessage,
668
672
  RowCount: 0,
669
673
  TotalRowCount: 0,
670
- ExecutionTime: 0
674
+ ExecutionTime: 0,
671
675
  };
672
676
  }
673
677
  }
@@ -689,7 +693,7 @@ export class RunViewResolver extends ResolverBase {
689
693
  ErrorMessage: 'Failed to execute dynamic view',
690
694
  RowCount: 0,
691
695
  TotalRowCount: 0,
692
- ExecutionTime: 0
696
+ ExecutionTime: 0,
693
697
  };
694
698
  }
695
699
 
@@ -703,7 +707,7 @@ export class RunViewResolver extends ResolverBase {
703
707
  ErrorMessage: errorMsg,
704
708
  RowCount: 0,
705
709
  TotalRowCount: 0,
706
- ExecutionTime: 0
710
+ ExecutionTime: 0,
707
711
  };
708
712
  }
709
713
  const returnData = this.processRawData(rawData.Results, entity.ID, entity);
@@ -725,7 +729,7 @@ export class RunViewResolver extends ResolverBase {
725
729
  ErrorMessage: errorMessage,
726
730
  RowCount: 0,
727
731
  TotalRowCount: 0,
728
- ExecutionTime: 0
732
+ ExecutionTime: 0,
729
733
  };
730
734
  }
731
735
  }
@@ -775,13 +779,13 @@ export class RunViewResolver extends ResolverBase {
775
779
  const returnResult = [];
776
780
  for (let i = 0; i < rawData.length; i++) {
777
781
  const row = rawData[i];
778
-
782
+
779
783
  // Build the primary key array from the entity's primary key fields
780
- const primaryKey: KeyValuePairOutputType[] = entityInfo.PrimaryKeys.map(pk => ({
784
+ const primaryKey: KeyValuePairOutputType[] = entityInfo.PrimaryKeys.map((pk) => ({
781
785
  FieldName: pk.Name,
782
- Value: row[pk.Name]?.toString() || ''
786
+ Value: row[pk.Name]?.toString() || '',
783
787
  }));
784
-
788
+
785
789
  returnResult.push({
786
790
  PrimaryKey: primaryKey,
787
791
  EntityID: entityId,