@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,275 +1,264 @@
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/core';
3
+ import { LogError, LogStatus, Metadata } from '@memberjunction/global';
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
-
18
-
17
+
19
18
  @ObjectType()
20
19
  export class GetDataOutputType {
21
- @Field(() => Boolean)
22
- Success: boolean;
20
+ @Field(() => Boolean)
21
+ Success: boolean;
23
22
 
24
- @Field(() => [String])
25
- Queries: string[];
23
+ @Field(() => [String])
24
+ Queries: string[];
26
25
 
27
- @Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
28
- ErrorMessages: (string | null)[];
26
+ @Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
27
+ ErrorMessages: (string | null)[];
29
28
 
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)[];
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)[];
35
34
  }
36
-
35
+
37
36
  @ObjectType()
38
37
  export class SimpleEntityResultType {
39
- @Field(() => Boolean)
40
- Success: boolean;
38
+ @Field(() => Boolean)
39
+ Success: boolean;
41
40
 
42
- @Field(() => String, { nullable: true })
43
- ErrorMessage?: string;
41
+ @Field(() => String, { nullable: true })
42
+ ErrorMessage?: string;
44
43
 
45
- @Field(() => [SimpleEntityOutputType])
46
- Results: SimpleEntityOutputType[];
44
+ @Field(() => [SimpleEntityOutputType])
45
+ Results: SimpleEntityOutputType[];
47
46
  }
48
47
 
49
48
  @ObjectType()
50
49
  export class SimpleEntityOutputType {
51
- @Field(() => String)
52
- ID: string;
50
+ @Field(() => String)
51
+ ID: string;
53
52
 
54
- @Field(() => String)
55
- Name: string;
53
+ @Field(() => String)
54
+ Name: string;
56
55
 
57
- @Field(() => String, { nullable: true })
58
- Description?: string;
56
+ @Field(() => String, { nullable: true })
57
+ Description?: string;
59
58
 
60
- @Field(() => String)
61
- SchemaName: string;
59
+ @Field(() => String)
60
+ SchemaName: string;
62
61
 
63
- @Field(() => String)
64
- BaseView: string;
62
+ @Field(() => String)
63
+ BaseView: string;
65
64
 
66
- @Field(() => String)
67
- BaseTable: string;
65
+ @Field(() => String)
66
+ BaseTable: string;
68
67
 
69
- @Field(() => String, { nullable: true })
70
- CodeName?: string;
68
+ @Field(() => String, { nullable: true })
69
+ CodeName?: string;
71
70
 
72
- @Field(() => String, { nullable: true })
73
- ClassName?: string;
71
+ @Field(() => String, { nullable: true })
72
+ ClassName?: string;
74
73
 
75
- @Field(() => [SimpleEntityFieldOutputType])
76
- Fields: SimpleEntityFieldOutputType[];
74
+ @Field(() => [SimpleEntityFieldOutputType])
75
+ Fields: SimpleEntityFieldOutputType[];
77
76
  }
78
77
 
79
78
  @ObjectType()
80
79
  export class SimpleEntityFieldOutputType {
81
- @Field(() => String)
82
- ID: string;
80
+ @Field(() => String)
81
+ ID: string;
83
82
 
84
- @Field(() => String)
85
- Name: string;
83
+ @Field(() => String)
84
+ Name: string;
86
85
 
87
- @Field(() => String, { nullable: true })
88
- Description?: string;
86
+ @Field(() => String, { nullable: true })
87
+ Description?: string;
89
88
 
90
- @Field(() => String)
91
- Type: string;
89
+ @Field(() => String)
90
+ Type: string;
92
91
 
93
- @Field(() => Boolean)
94
- AllowsNull: boolean;
92
+ @Field(() => Boolean)
93
+ AllowsNull: boolean;
95
94
 
96
- @Field(() => Number)
97
- MaxLength: number;
95
+ @Field(() => Number)
96
+ MaxLength: number;
98
97
  }
99
98
 
100
99
  /**
101
100
  * General purpose resolver for fetching different kinds of data payloads for SYSTEM users only.
102
101
  */
103
102
  export class GetDataResolver {
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
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
117
113
  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.`);
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
- }
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 };
164
160
  }
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
- }
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: [] };
201
194
  }
202
-
203
-
195
+ }
204
196
  }
205
-
206
197
 
207
198
  export class TokenUseLog {
208
- Token: string;
209
- UsedAt: Date;
210
- UsePayload: any;
199
+ Token: string;
200
+ UsedAt: Date;
201
+ UsePayload: any;
211
202
  }
212
203
  /**
213
204
  * 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
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
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
215
206
  * lived compared to the system level API key which rotates but less frequently.
216
207
  */
217
208
  export class GetDataAccessToken {
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[];
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[];
226
217
  }
227
218
  const __accessTokens: GetDataAccessToken[] = [];
228
- const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
219
+ const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
229
220
  export function registerAccessToken(token?: string, lifeSpan: number = __defaultTokenLifeSpan, requestorPayload?: any): GetDataAccessToken {
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;
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;
244
235
  }
245
236
  export function deleteAccessToken(token: string) {
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
- }
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
+ }
253
243
  }
254
244
  export function tokenExists(token: string) {
255
- return __accessTokens.find((t) => t.Token === token) !== undefined;
245
+ return __accessTokens.find((t) => t.Token === token) !== undefined;
256
246
  }
257
247
  export function isTokenValid(token: string) {
258
- const t = __accessTokens.find((t) => t.Token === token);
259
- if (t) {
260
- return t.ExpiresAt > new Date();
261
- }
262
- return false;
263
- }
248
+ const t = __accessTokens.find((t) => t.Token === token);
249
+ if (t) {
250
+ return t.ExpiresAt > new Date();
251
+ }
252
+ return false;
253
+ }
264
254
  export function recordTokenUse(token: string, usePayload: any) {
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`);
255
+ const t = __accessTokens.find((t) => t.Token === token);
256
+ if (t) {
257
+ if (!t.TokenUses) {
258
+ t.TokenUses = [];
274
259
  }
260
+ t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
261
+ } else {
262
+ throw new Error(`Token ${token} does not exist`);
263
+ }
275
264
  }
@@ -1,4 +1,4 @@
1
- import { LogError, Metadata, CompositeKey } from '@memberjunction/core';
1
+ import { LogError, Metadata, CompositeKey } from '@memberjunction/global';
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/core';
9
+ } from '@memberjunction/global';
10
10
  import { AppContext } from '../types.js';
11
11
  import { UserCache } from '@memberjunction/sqlserver-dataprovider';
12
12