@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,264 +1,275 @@
1
1
  import { Arg, Ctx, Field, InputType, ObjectType, Query } from 'type-graphql';
2
2
  import { AppContext } from '../types.js';
3
- import { LogError, LogStatus, Metadata } from '@memberjunction/global';
3
+ import { LogError, LogStatus, Metadata } from '@memberjunction/core';
4
4
  import { RequireSystemUser } from '../directives/RequireSystemUser.js';
5
5
  import { v4 as uuidv4 } from 'uuid';
6
6
  import { GetReadOnlyDataSource, GetReadOnlyProvider } from '../util.js';
7
7
  import sql from 'mssql';
8
-
9
- @InputType()
8
+
9
+ @InputType()
10
10
  export class GetDataInputType {
11
- @Field(() => String)
12
- Token: string;
11
+ @Field(() => String)
12
+ Token: string;
13
13
 
14
- @Field(() => [String])
15
- Queries: string[];
14
+ @Field(() => [String])
15
+ Queries: string[];
16
16
  }
17
-
17
+
18
+
18
19
  @ObjectType()
19
20
  export class GetDataOutputType {
20
- @Field(() => Boolean)
21
- Success: boolean;
21
+ @Field(() => Boolean)
22
+ Success: boolean;
22
23
 
23
- @Field(() => [String])
24
- Queries: string[];
24
+ @Field(() => [String])
25
+ Queries: string[];
25
26
 
26
- @Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
27
- ErrorMessages: (string | null)[];
27
+ @Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
28
+ ErrorMessages: (string | null)[];
28
29
 
29
- /**
30
- * Each query's results will be converted to JSON and returned as a string
31
- */
32
- @Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
33
- Results: (string | null)[];
30
+ /**
31
+ * Each query's results will be converted to JSON and returned as a string
32
+ */
33
+ @Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
34
+ Results: (string | null)[];
34
35
  }
35
-
36
+
36
37
  @ObjectType()
37
38
  export class SimpleEntityResultType {
38
- @Field(() => Boolean)
39
- Success: boolean;
39
+ @Field(() => Boolean)
40
+ Success: boolean;
40
41
 
41
- @Field(() => String, { nullable: true })
42
- ErrorMessage?: string;
42
+ @Field(() => String, { nullable: true })
43
+ ErrorMessage?: string;
43
44
 
44
- @Field(() => [SimpleEntityOutputType])
45
- Results: SimpleEntityOutputType[];
45
+ @Field(() => [SimpleEntityOutputType])
46
+ Results: SimpleEntityOutputType[];
46
47
  }
47
48
 
48
49
  @ObjectType()
49
50
  export class SimpleEntityOutputType {
50
- @Field(() => String)
51
- ID: string;
51
+ @Field(() => String)
52
+ ID: string;
52
53
 
53
- @Field(() => String)
54
- Name: string;
54
+ @Field(() => String)
55
+ Name: string;
55
56
 
56
- @Field(() => String, { nullable: true })
57
- Description?: string;
57
+ @Field(() => String, { nullable: true })
58
+ Description?: string;
58
59
 
59
- @Field(() => String)
60
- SchemaName: string;
60
+ @Field(() => String)
61
+ SchemaName: string;
61
62
 
62
- @Field(() => String)
63
- BaseView: string;
63
+ @Field(() => String)
64
+ BaseView: string;
64
65
 
65
- @Field(() => String)
66
- BaseTable: string;
66
+ @Field(() => String)
67
+ BaseTable: string;
67
68
 
68
- @Field(() => String, { nullable: true })
69
- CodeName?: string;
69
+ @Field(() => String, { nullable: true })
70
+ CodeName?: string;
70
71
 
71
- @Field(() => String, { nullable: true })
72
- ClassName?: string;
72
+ @Field(() => String, { nullable: true })
73
+ ClassName?: string;
73
74
 
74
- @Field(() => [SimpleEntityFieldOutputType])
75
- Fields: SimpleEntityFieldOutputType[];
75
+ @Field(() => [SimpleEntityFieldOutputType])
76
+ Fields: SimpleEntityFieldOutputType[];
76
77
  }
77
78
 
78
79
  @ObjectType()
79
80
  export class SimpleEntityFieldOutputType {
80
- @Field(() => String)
81
- ID: string;
81
+ @Field(() => String)
82
+ ID: string;
82
83
 
83
- @Field(() => String)
84
- Name: string;
84
+ @Field(() => String)
85
+ Name: string;
85
86
 
86
- @Field(() => String, { nullable: true })
87
- Description?: string;
87
+ @Field(() => String, { nullable: true })
88
+ Description?: string;
88
89
 
89
- @Field(() => String)
90
- Type: string;
90
+ @Field(() => String)
91
+ Type: string;
91
92
 
92
- @Field(() => Boolean)
93
- AllowsNull: boolean;
93
+ @Field(() => Boolean)
94
+ AllowsNull: boolean;
94
95
 
95
- @Field(() => Number)
96
- MaxLength: number;
96
+ @Field(() => Number)
97
+ MaxLength: number;
97
98
  }
98
99
 
99
100
  /**
100
101
  * General purpose resolver for fetching different kinds of data payloads for SYSTEM users only.
101
102
  */
102
103
  export class GetDataResolver {
103
- /**
104
- * This query will sync the specified items with the existing system. Items will be processed in order and the results of each operation will be returned in the Results array within the return value.
105
- * @param items - an array of ActionItemInputType objects that specify the action to be taken on the specified entity with the specified primary key and the JSON representation of the field values.
106
- * @param token - the short-lived access token that is required to perform this operation.
107
- */
108
- @RequireSystemUser()
109
- @Query(() => GetDataOutputType)
110
- async GetData(@Arg('input', () => GetDataInputType) input: GetDataInputType, @Ctx() context: AppContext): Promise<GetDataOutputType> {
111
- try {
112
- LogStatus(`GetDataResolver.GetData() ---- IMPORTANT - temporarily using the same connection as rest of the server, we need to separately create a READ ONLY CONNECTION and pass that in
104
+ /**
105
+ * This query will sync the specified items with the existing system. Items will be processed in order and the results of each operation will be returned in the Results array within the return value.
106
+ * @param items - an array of ActionItemInputType objects that specify the action to be taken on the specified entity with the specified primary key and the JSON representation of the field values.
107
+ * @param token - the short-lived access token that is required to perform this operation.
108
+ */
109
+ @RequireSystemUser()
110
+ @Query(() => GetDataOutputType)
111
+ async GetData(
112
+ @Arg('input', () => GetDataInputType) input: GetDataInputType,
113
+ @Ctx() context: AppContext
114
+ ): Promise<GetDataOutputType> {
115
+ try {
116
+ LogStatus(`GetDataResolver.GetData() ---- IMPORTANT - temporarily using the same connection as rest of the server, we need to separately create a READ ONLY CONNECTION and pass that in
113
117
  the AppContext so we can use that special connection here to ensure we are using a lower privileged connection for this operation to prevent mutation from being possible.`);
114
- LogStatus(`${JSON.stringify(input)}`);
115
-
116
- // validate the token
117
- if (!isTokenValid(input.Token)) {
118
- throw new Error(`Token ${input.Token} is not valid or has expired`);
119
- }
120
-
121
- // Use the read-only connection for executing queries
122
- const readOnlyDataSource = GetReadOnlyDataSource(context.dataSources, { allowFallbackToReadWrite: false });
123
- if (!readOnlyDataSource) {
124
- throw new Error('Read-only data source not found');
125
- }
126
-
127
- // Execute all queries in parallel, but execute each individual query in its own try catch block so that if one fails, the others can still be processed
128
- // and also so that we can capture the error message for each query and return it
129
- const results = await Promise.allSettled(
130
- input.Queries.map(async (query) => {
131
- try {
132
- const request = new sql.Request(readOnlyDataSource);
133
- const result = await request.query(query);
134
- return { result: result.recordset, error: null };
135
- } catch (err) {
136
- return { result: null, error: err };
137
- }
138
- })
139
- );
140
-
141
- // Extract results and errors from the promises
142
- const processedResults = results.map((res) => (res.status === 'fulfilled' ? res.value.result : null));
143
- const errorMessages = results.map((res) => (res.status === 'fulfilled' ? res.value.error : res.reason));
144
-
145
- // record the use of the token
146
- const returnVal = {
147
- Success: errorMessages.filter((e) => e !== null).length === 0,
148
- Results: processedResults.map((r) => JSON.stringify(r)),
149
- Queries: input.Queries,
150
- ErrorMessages: errorMessages,
151
- };
152
-
153
- recordTokenUse(input.Token, { request: input, results: returnVal });
154
-
155
- // Success below is derived from having no errorMessages, check that array
156
- return returnVal;
157
- } catch (err) {
158
- LogError(err);
159
- return { Success: false, ErrorMessages: [typeof err === 'string' ? err : (err as any).message], Results: [], Queries: input.Queries };
118
+ LogStatus(`${JSON.stringify(input)}`);
119
+
120
+ // validate the token
121
+ if (!isTokenValid(input.Token)) {
122
+ throw new Error(`Token ${input.Token} is not valid or has expired`);
123
+ }
124
+
125
+ // Use the read-only connection for executing queries
126
+ const readOnlyDataSource = GetReadOnlyDataSource(context.dataSources, {allowFallbackToReadWrite: false})
127
+ if (!readOnlyDataSource) {
128
+ throw new Error('Read-only data source not found');
129
+ }
130
+
131
+ // Execute all queries in parallel, but execute each individual query in its own try catch block so that if one fails, the others can still be processed
132
+ // and also so that we can capture the error message for each query and return it
133
+ const results = await Promise.allSettled(
134
+ input.Queries.map(async (query) => {
135
+ try {
136
+ const request = new sql.Request(readOnlyDataSource);
137
+ const result = await request.query(query);
138
+ return { result: result.recordset, error: null };
139
+ } catch (err) {
140
+ return { result: null, error: err };
141
+ }
142
+ })
143
+ );
144
+
145
+ // Extract results and errors from the promises
146
+ const processedResults = results.map((res) => res.status === "fulfilled" ? res.value.result : null);
147
+ const errorMessages = results.map((res) => res.status === "fulfilled" ? res.value.error : res.reason);
148
+
149
+ // record the use of the token
150
+ const returnVal = { Success: errorMessages.filter((e) => e !== null).length === 0,
151
+ Results: processedResults.map((r) => JSON.stringify(r)),
152
+ Queries: input.Queries,
153
+ ErrorMessages: errorMessages }
154
+
155
+ recordTokenUse(input.Token, {request: input, results: returnVal});
156
+
157
+ // Success below is derived from having no errorMessages, check that array
158
+ return returnVal;
159
+ }
160
+ catch (err) {
161
+ LogError(err);
162
+ return { Success: false, ErrorMessages: [typeof err === 'string' ? err : (err as any).message], Results: [], Queries: input.Queries };
163
+ }
160
164
  }
161
- }
162
-
163
- @RequireSystemUser()
164
- @Query(() => SimpleEntityResultType)
165
- async GetAllEntities(@Ctx() context: AppContext): Promise<SimpleEntityResultType> {
166
- try {
167
- const md = GetReadOnlyProvider(context.providers);
168
- const result = md.Entities.map((e) => {
169
- return {
170
- ID: e.ID,
171
- Name: e.Name,
172
- Description: e.Description,
173
- SchemaName: e.SchemaName,
174
- BaseView: e.BaseView,
175
- BaseTable: e.BaseTable,
176
- CodeName: e.CodeName,
177
- ClassName: e.ClassName,
178
- Fields: e.Fields.map((f) => {
179
- return {
180
- ID: f.ID,
181
- Name: f.Name,
182
- Description: f.Description,
183
- Type: f.Type,
184
- AllowsNull: f.AllowsNull,
185
- MaxLength: f.MaxLength,
186
- };
187
- }),
188
- };
189
- });
190
- return { Success: true, Results: result };
191
- } catch (err) {
192
- LogError(err);
193
- return { Success: false, ErrorMessage: typeof err === 'string' ? err : (err as any).message, Results: [] };
165
+
166
+ @RequireSystemUser()
167
+ @Query(() => SimpleEntityResultType)
168
+ async GetAllEntities(
169
+ @Ctx() context: AppContext
170
+ ): Promise<SimpleEntityResultType> {
171
+ try {
172
+ const md = GetReadOnlyProvider(context.providers);
173
+ const result = md.Entities.map((e) => {
174
+ return {
175
+ ID: e.ID,
176
+ Name: e.Name,
177
+ Description: e.Description,
178
+ SchemaName: e.SchemaName,
179
+ BaseView: e.BaseView,
180
+ BaseTable: e.BaseTable,
181
+ CodeName: e.CodeName,
182
+ ClassName: e.ClassName,
183
+ Fields: e.Fields.map((f) => {
184
+ return {
185
+ ID: f.ID,
186
+ Name: f.Name,
187
+ Description: f.Description,
188
+ Type: f.Type,
189
+ AllowsNull: f.AllowsNull,
190
+ MaxLength: f.MaxLength,
191
+ };
192
+ })
193
+ }
194
+ });
195
+ return { Success: true, Results: result };
196
+ }
197
+ catch (err) {
198
+ LogError(err);
199
+ return { Success: false, ErrorMessage: typeof err === 'string' ? err : (err as any).message, Results: [] };
200
+ }
194
201
  }
195
- }
202
+
203
+
196
204
  }
205
+
197
206
 
198
207
  export class TokenUseLog {
199
- Token: string;
200
- UsedAt: Date;
201
- UsePayload: any;
208
+ Token: string;
209
+ UsedAt: Date;
210
+ UsePayload: any;
202
211
  }
203
212
  /**
204
213
  * Used to track all active access tokens that are requested by anyone within the server to be able to send to external services that can
205
- * in turn call back to the GetDataResolver to get data from the server. This is an extra security layer to ensure that tokens are short
214
+ * in turn call back to the GetDataResolver to get data from the server. This is an extra security layer to ensure that tokens are short
206
215
  * lived compared to the system level API key which rotates but less frequently.
207
216
  */
208
217
  export class GetDataAccessToken {
209
- Token: string;
210
- ExpiresAt: Date;
211
- RequstedAt: Date;
212
- /**
213
- * Can be used to store any payload to identify who requested the creation of the token, for example Skip might use this to put in a conversation ID to know which conversation a request is coming back for.
214
- */
215
- RequestorPayload: any;
216
- TokenUses: TokenUseLog[];
218
+ Token: string;
219
+ ExpiresAt: Date;
220
+ RequstedAt: Date;
221
+ /**
222
+ * Can be used to store any payload to identify who requested the creation of the token, for example Skip might use this to put in a conversation ID to know which conversation a request is coming back for.
223
+ */
224
+ RequestorPayload: any;
225
+ TokenUses: TokenUseLog[];
217
226
  }
218
227
  const __accessTokens: GetDataAccessToken[] = [];
219
- const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
228
+ const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
220
229
  export function registerAccessToken(token?: string, lifeSpan: number = __defaultTokenLifeSpan, requestorPayload?: any): GetDataAccessToken {
221
- const tokenToUse = token || uuidv4();
222
-
223
- if (tokenExists(tokenToUse)) {
224
- // should never happen if we used the uuidv4() function but could happen if someone tries to use a custom token
225
- throw new Error(`Token ${tokenToUse} already exists`);
226
- }
227
-
228
- const newToken = new GetDataAccessToken();
229
- newToken.Token = tokenToUse;
230
- newToken.ExpiresAt = new Date(new Date().getTime() + lifeSpan);
231
- newToken.RequstedAt = new Date();
232
- newToken.RequestorPayload = requestorPayload;
233
- __accessTokens.push(newToken);
234
- return newToken;
230
+ const tokenToUse = token || uuidv4();
231
+
232
+ if (tokenExists(tokenToUse)) {
233
+ // should never happen if we used the uuidv4() function but could happen if someone tries to use a custom token
234
+ throw new Error(`Token ${tokenToUse} already exists`);
235
+ }
236
+
237
+ const newToken = new GetDataAccessToken();
238
+ newToken.Token = tokenToUse;
239
+ newToken.ExpiresAt = new Date(new Date().getTime() + lifeSpan);
240
+ newToken.RequstedAt = new Date();
241
+ newToken.RequestorPayload = requestorPayload;
242
+ __accessTokens.push(newToken);
243
+ return newToken;
235
244
  }
236
245
  export function deleteAccessToken(token: string) {
237
- const index = __accessTokens.findIndex((t) => t.Token === token);
238
- if (index >= 0) {
239
- __accessTokens.splice(index, 1);
240
- } else {
241
- throw new Error(`Token ${token} does not exist`);
242
- }
246
+ const index = __accessTokens.findIndex((t) => t.Token === token);
247
+ if (index >= 0) {
248
+ __accessTokens.splice(index, 1);
249
+ }
250
+ else {
251
+ throw new Error(`Token ${token} does not exist`);
252
+ }
243
253
  }
244
254
  export function tokenExists(token: string) {
245
- return __accessTokens.find((t) => t.Token === token) !== undefined;
255
+ return __accessTokens.find((t) => t.Token === token) !== undefined;
246
256
  }
247
257
  export function isTokenValid(token: string) {
248
- const t = __accessTokens.find((t) => t.Token === token);
249
- if (t) {
250
- return t.ExpiresAt > new Date();
251
- }
252
- return false;
253
- }
258
+ const t = __accessTokens.find((t) => t.Token === token);
259
+ if (t) {
260
+ return t.ExpiresAt > new Date();
261
+ }
262
+ return false;
263
+ }
254
264
  export function recordTokenUse(token: string, usePayload: any) {
255
- const t = __accessTokens.find((t) => t.Token === token);
256
- if (t) {
257
- if (!t.TokenUses) {
258
- t.TokenUses = [];
265
+ const t = __accessTokens.find((t) => t.Token === token);
266
+ if (t) {
267
+ if (!t.TokenUses) {
268
+ t.TokenUses = [];
269
+ }
270
+ t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
271
+ }
272
+ else {
273
+ throw new Error(`Token ${token} does not exist`);
259
274
  }
260
- t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
261
- } else {
262
- throw new Error(`Token ${token} does not exist`);
263
- }
264
275
  }
@@ -1,4 +1,4 @@
1
- import { LogError, Metadata, CompositeKey } from '@memberjunction/global';
1
+ import { LogError, Metadata, CompositeKey } from '@memberjunction/core';
2
2
  import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, PubSub, PubSubEngine, Query, Resolver } from 'type-graphql';
3
3
  import { AppContext } from '../types.js';
4
4
  import { CompositeKeyInputType, CompositeKeyOutputType } from '../generic/KeyInputOutputTypes.js';
@@ -31,7 +31,7 @@ export class EntityDependencyResolver {
31
31
  } catch (err) {
32
32
  LogError(err);
33
33
  const ctx = z.object({ message: z.string() }).catch(null).parse(err)?.message ?? JSON.stringify(err);
34
-
34
+
35
35
  throw new Error(ctx);
36
36
  }
37
37
  }
@@ -65,13 +65,13 @@ export class RecordDependencyResolver {
65
65
  const md = GetReadOnlyProvider(providers);
66
66
  const ck = new CompositeKey(ckInput.KeyValuePairs);
67
67
  const result = await md.GetRecordDependencies(entityName, ck);
68
-
68
+
69
69
  // Map PrimaryKey to CompositeKey for GraphQL response
70
- return result.map((dep) => ({
70
+ return result.map(dep => ({
71
71
  EntityName: dep.EntityName,
72
72
  RelatedEntityName: dep.RelatedEntityName,
73
73
  FieldName: dep.FieldName,
74
- CompositeKey: dep.PrimaryKey, // Map PrimaryKey to CompositeKey
74
+ CompositeKey: dep.PrimaryKey // Map PrimaryKey to CompositeKey
75
75
  }));
76
76
  } catch (e) {
77
77
  LogError(e);
@@ -6,7 +6,7 @@ import {
6
6
  Metadata,
7
7
  CompositeKey,
8
8
  PotentialDuplicateResult,
9
- } from '@memberjunction/global';
9
+ } from '@memberjunction/core';
10
10
  import { AppContext } from '../types.js';
11
11
  import { UserCache } from '@memberjunction/sqlserver-dataprovider';
12
12