@memberjunction/server 3.4.0 → 4.1.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 (269) hide show
  1. package/README.md +689 -513
  2. package/dist/agents/skip-agent.d.ts +65 -0
  3. package/dist/agents/skip-agent.d.ts.map +1 -1
  4. package/dist/agents/skip-agent.js +63 -5
  5. package/dist/agents/skip-agent.js.map +1 -1
  6. package/dist/agents/skip-sdk.d.ts +163 -0
  7. package/dist/agents/skip-sdk.d.ts.map +1 -1
  8. package/dist/agents/skip-sdk.js +143 -12
  9. package/dist/agents/skip-sdk.js.map +1 -1
  10. package/dist/apolloServer/index.d.ts +0 -1
  11. package/dist/apolloServer/index.d.ts.map +1 -1
  12. package/dist/auth/APIKeyScopeAuth.d.ts +82 -0
  13. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  14. package/dist/auth/APIKeyScopeAuth.js +78 -0
  15. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  16. package/dist/auth/AuthProviderFactory.d.ts +35 -0
  17. package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
  18. package/dist/auth/AuthProviderFactory.js +51 -4
  19. package/dist/auth/AuthProviderFactory.js.map +1 -1
  20. package/dist/auth/BaseAuthProvider.d.ts +21 -0
  21. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  22. package/dist/auth/BaseAuthProvider.js +24 -9
  23. package/dist/auth/BaseAuthProvider.js.map +1 -1
  24. package/dist/auth/IAuthProvider.d.ts +32 -0
  25. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  26. package/dist/auth/exampleNewUserSubClass.d.ts +5 -1
  27. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  28. package/dist/auth/exampleNewUserSubClass.js +21 -6
  29. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  30. package/dist/auth/index.d.ts +14 -0
  31. package/dist/auth/index.d.ts.map +1 -1
  32. package/dist/auth/index.js +35 -22
  33. package/dist/auth/index.js.map +1 -1
  34. package/dist/auth/initializeProviders.d.ts +3 -0
  35. package/dist/auth/initializeProviders.d.ts.map +1 -1
  36. package/dist/auth/initializeProviders.js +6 -0
  37. package/dist/auth/initializeProviders.js.map +1 -1
  38. package/dist/auth/newUsers.d.ts.map +1 -1
  39. package/dist/auth/newUsers.js +14 -3
  40. package/dist/auth/newUsers.js.map +1 -1
  41. package/dist/auth/providers/Auth0Provider.d.ts +9 -0
  42. package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
  43. package/dist/auth/providers/Auth0Provider.js +10 -0
  44. package/dist/auth/providers/Auth0Provider.js.map +1 -1
  45. package/dist/auth/providers/CognitoProvider.d.ts +9 -0
  46. package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
  47. package/dist/auth/providers/CognitoProvider.js +10 -0
  48. package/dist/auth/providers/CognitoProvider.js.map +1 -1
  49. package/dist/auth/providers/GoogleProvider.d.ts +9 -0
  50. package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
  51. package/dist/auth/providers/GoogleProvider.js +11 -1
  52. package/dist/auth/providers/GoogleProvider.js.map +1 -1
  53. package/dist/auth/providers/MSALProvider.d.ts +9 -0
  54. package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
  55. package/dist/auth/providers/MSALProvider.js +10 -0
  56. package/dist/auth/providers/MSALProvider.js.map +1 -1
  57. package/dist/auth/providers/OktaProvider.d.ts +9 -0
  58. package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
  59. package/dist/auth/providers/OktaProvider.js +10 -0
  60. package/dist/auth/providers/OktaProvider.js.map +1 -1
  61. package/dist/config.d.ts +12 -0
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +42 -8
  64. package/dist/config.js.map +1 -1
  65. package/dist/context.d.ts +8 -1
  66. package/dist/context.d.ts.map +1 -1
  67. package/dist/context.js +26 -4
  68. package/dist/context.js.map +1 -1
  69. package/dist/directives/Public.js +2 -0
  70. package/dist/directives/Public.js.map +1 -1
  71. package/dist/entitySubclasses/entityPermissions.server.d.ts +7 -2
  72. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  73. package/dist/entitySubclasses/entityPermissions.server.js +26 -8
  74. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  75. package/dist/generated/generated.d.ts +539 -2
  76. package/dist/generated/generated.d.ts.map +1 -1
  77. package/dist/generated/generated.js +9985 -14951
  78. package/dist/generated/generated.js.map +1 -1
  79. package/dist/generic/DeleteOptionsInput.d.ts +3 -0
  80. package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
  81. package/dist/generic/DeleteOptionsInput.js +3 -2
  82. package/dist/generic/DeleteOptionsInput.js.map +1 -1
  83. package/dist/generic/KeyInputOutputTypes.js +0 -6
  84. package/dist/generic/KeyInputOutputTypes.js.map +1 -1
  85. package/dist/generic/KeyValuePairInput.d.ts +4 -0
  86. package/dist/generic/KeyValuePairInput.d.ts.map +1 -1
  87. package/dist/generic/KeyValuePairInput.js +4 -2
  88. package/dist/generic/KeyValuePairInput.js.map +1 -1
  89. package/dist/generic/PushStatusResolver.js +0 -3
  90. package/dist/generic/PushStatusResolver.js.map +1 -1
  91. package/dist/generic/ResolverBase.d.ts +58 -0
  92. package/dist/generic/ResolverBase.d.ts.map +1 -1
  93. package/dist/generic/ResolverBase.js +203 -18
  94. package/dist/generic/ResolverBase.js.map +1 -1
  95. package/dist/generic/RunViewResolver.d.ts +22 -0
  96. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  97. package/dist/generic/RunViewResolver.js +42 -108
  98. package/dist/generic/RunViewResolver.js.map +1 -1
  99. package/dist/index.d.ts +12 -0
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +94 -37
  102. package/dist/index.js.map +1 -1
  103. package/dist/orm.d.ts.map +1 -1
  104. package/dist/orm.js +2 -1
  105. package/dist/orm.js.map +1 -1
  106. package/dist/resolvers/APIKeyResolver.d.ts +74 -0
  107. package/dist/resolvers/APIKeyResolver.d.ts.map +1 -1
  108. package/dist/resolvers/APIKeyResolver.js +49 -10
  109. package/dist/resolvers/APIKeyResolver.js.map +1 -1
  110. package/dist/resolvers/ActionResolver.d.ts +189 -0
  111. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  112. package/dist/resolvers/ActionResolver.js +152 -21
  113. package/dist/resolvers/ActionResolver.js.map +1 -1
  114. package/dist/resolvers/ColorResolver.js +0 -5
  115. package/dist/resolvers/ColorResolver.js.map +1 -1
  116. package/dist/resolvers/ComponentRegistryResolver.d.ts +65 -0
  117. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  118. package/dist/resolvers/ComponentRegistryResolver.js +118 -40
  119. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  120. package/dist/resolvers/CreateQueryResolver.d.ts +47 -0
  121. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  122. package/dist/resolvers/CreateQueryResolver.js +92 -116
  123. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  124. package/dist/resolvers/DatasetResolver.js +2 -14
  125. package/dist/resolvers/DatasetResolver.js.map +1 -1
  126. package/dist/resolvers/EntityCommunicationsResolver.d.ts +40 -0
  127. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  128. package/dist/resolvers/EntityCommunicationsResolver.js +2 -36
  129. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  130. package/dist/resolvers/EntityRecordNameResolver.js +0 -7
  131. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  132. package/dist/resolvers/FileCategoryResolver.d.ts +1 -1
  133. package/dist/resolvers/FileCategoryResolver.d.ts.map +1 -1
  134. package/dist/resolvers/FileCategoryResolver.js +15 -3
  135. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  136. package/dist/resolvers/FileResolver.d.ts +16 -0
  137. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  138. package/dist/resolvers/FileResolver.js +59 -74
  139. package/dist/resolvers/FileResolver.js.map +1 -1
  140. package/dist/resolvers/GetDataContextDataResolver.d.ts +18 -1
  141. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  142. package/dist/resolvers/GetDataContextDataResolver.js +17 -9
  143. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  144. package/dist/resolvers/GetDataResolver.d.ts +19 -0
  145. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  146. package/dist/resolvers/GetDataResolver.js +35 -35
  147. package/dist/resolvers/GetDataResolver.js.map +1 -1
  148. package/dist/resolvers/InfoResolver.d.ts +2 -2
  149. package/dist/resolvers/InfoResolver.d.ts.map +1 -1
  150. package/dist/resolvers/InfoResolver.js +17 -20
  151. package/dist/resolvers/InfoResolver.js.map +1 -1
  152. package/dist/resolvers/MCPResolver.d.ts +325 -1
  153. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  154. package/dist/resolvers/MCPResolver.js +931 -24
  155. package/dist/resolvers/MCPResolver.js.map +1 -1
  156. package/dist/resolvers/MergeRecordsResolver.js +3 -29
  157. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  158. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  159. package/dist/resolvers/PotentialDuplicateRecordResolver.js +0 -3
  160. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  161. package/dist/resolvers/QueryResolver.d.ts +20 -0
  162. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  163. package/dist/resolvers/QueryResolver.js +44 -36
  164. package/dist/resolvers/QueryResolver.js.map +1 -1
  165. package/dist/resolvers/ReportResolver.d.ts +3 -0
  166. package/dist/resolvers/ReportResolver.d.ts.map +1 -1
  167. package/dist/resolvers/ReportResolver.js +9 -10
  168. package/dist/resolvers/ReportResolver.js.map +1 -1
  169. package/dist/resolvers/RunAIAgentResolver.d.ts +54 -0
  170. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  171. package/dist/resolvers/RunAIAgentResolver.js +116 -40
  172. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  173. package/dist/resolvers/RunAIPromptResolver.d.ts +42 -0
  174. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  175. package/dist/resolvers/RunAIPromptResolver.js +95 -22
  176. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  177. package/dist/resolvers/RunTemplateResolver.js +9 -6
  178. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  179. package/dist/resolvers/RunTestResolver.d.ts +12 -0
  180. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  181. package/dist/resolvers/RunTestResolver.js +35 -21
  182. package/dist/resolvers/RunTestResolver.js.map +1 -1
  183. package/dist/resolvers/SqlLoggingConfigResolver.d.ts +312 -0
  184. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  185. package/dist/resolvers/SqlLoggingConfigResolver.js +295 -45
  186. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  187. package/dist/resolvers/SyncDataResolver.d.ts +21 -0
  188. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  189. package/dist/resolvers/SyncDataResolver.js +36 -22
  190. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  191. package/dist/resolvers/SyncRolesUsersResolver.d.ts +14 -0
  192. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  193. package/dist/resolvers/SyncRolesUsersResolver.js +54 -21
  194. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  195. package/dist/resolvers/TaskResolver.d.ts +13 -0
  196. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  197. package/dist/resolvers/TaskResolver.js +22 -7
  198. package/dist/resolvers/TaskResolver.js.map +1 -1
  199. package/dist/resolvers/TelemetryResolver.d.ts +22 -0
  200. package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
  201. package/dist/resolvers/TelemetryResolver.js +45 -79
  202. package/dist/resolvers/TelemetryResolver.js.map +1 -1
  203. package/dist/resolvers/TransactionGroupResolver.js +11 -13
  204. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  205. package/dist/resolvers/UserFavoriteResolver.js +3 -12
  206. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  207. package/dist/resolvers/UserResolver.js +10 -0
  208. package/dist/resolvers/UserResolver.js.map +1 -1
  209. package/dist/resolvers/UserViewResolver.js +4 -0
  210. package/dist/resolvers/UserViewResolver.js.map +1 -1
  211. package/dist/resolvers/VersionHistoryResolver.d.ts +39 -0
  212. package/dist/resolvers/VersionHistoryResolver.d.ts.map +1 -0
  213. package/dist/resolvers/VersionHistoryResolver.js +208 -0
  214. package/dist/resolvers/VersionHistoryResolver.js.map +1 -0
  215. package/dist/rest/EntityCRUDHandler.d.ts +19 -0
  216. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  217. package/dist/rest/EntityCRUDHandler.js +55 -0
  218. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  219. package/dist/rest/OAuthCallbackHandler.d.ts +143 -0
  220. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -0
  221. package/dist/rest/OAuthCallbackHandler.js +634 -0
  222. package/dist/rest/OAuthCallbackHandler.js.map +1 -0
  223. package/dist/rest/RESTEndpointHandler.d.ts +120 -0
  224. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  225. package/dist/rest/RESTEndpointHandler.js +213 -24
  226. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  227. package/dist/rest/ViewOperationsHandler.d.ts +19 -0
  228. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  229. package/dist/rest/ViewOperationsHandler.js +39 -0
  230. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  231. package/dist/rest/index.d.ts +1 -0
  232. package/dist/rest/index.d.ts.map +1 -1
  233. package/dist/rest/index.js +1 -0
  234. package/dist/rest/index.js.map +1 -1
  235. package/dist/rest/setupRESTEndpoints.d.ts +35 -0
  236. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  237. package/dist/rest/setupRESTEndpoints.js +15 -1
  238. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  239. package/dist/services/ScheduledJobsService.d.ts +31 -0
  240. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  241. package/dist/services/ScheduledJobsService.js +38 -4
  242. package/dist/services/ScheduledJobsService.js.map +1 -1
  243. package/dist/services/TaskOrchestrator.d.ts +73 -0
  244. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  245. package/dist/services/TaskOrchestrator.js +137 -15
  246. package/dist/services/TaskOrchestrator.js.map +1 -1
  247. package/dist/types.d.ts +14 -0
  248. package/dist/types.d.ts.map +1 -1
  249. package/dist/types.js +0 -13
  250. package/dist/types.js.map +1 -1
  251. package/dist/util.d.ts +37 -1
  252. package/dist/util.d.ts.map +1 -1
  253. package/dist/util.js +55 -8
  254. package/dist/util.js.map +1 -1
  255. package/package.json +83 -78
  256. package/src/auth/exampleNewUserSubClass.ts +1 -5
  257. package/src/auth/newUsers.ts +4 -2
  258. package/src/entitySubclasses/entityPermissions.server.ts +1 -3
  259. package/src/generated/generated.ts +4707 -2664
  260. package/src/index.ts +73 -62
  261. package/src/resolvers/FileCategoryResolver.ts +1 -1
  262. package/src/resolvers/InfoResolver.ts +10 -6
  263. package/src/resolvers/MCPResolver.ts +910 -10
  264. package/src/resolvers/PotentialDuplicateRecordResolver.ts +0 -4
  265. package/src/resolvers/VersionHistoryResolver.ts +177 -0
  266. package/src/rest/OAuthCallbackHandler.ts +766 -0
  267. package/src/rest/RESTEndpointHandler.ts +58 -35
  268. package/src/rest/index.ts +2 -1
  269. package/src/rest/setupRESTEndpoints.ts +13 -12
package/src/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import dotenv from 'dotenv';
2
2
 
3
- dotenv.config();
3
+ dotenv.config({ quiet: true });
4
4
 
5
5
  import { expressMiddleware } from '@apollo/server/express4';
6
6
  import { mergeSchemas } from '@graphql-tools/schema';
@@ -27,45 +27,10 @@ import { contextFunction, getUserPayload } from './context.js';
27
27
  import { requireSystemUserDirective, publicDirective } from './directives/index.js';
28
28
  import createMSSQLConfig from './orm.js';
29
29
  import { setupRESTEndpoints } from './rest/setupRESTEndpoints.js';
30
-
31
- import { LoadAllCoreActions } from '@memberjunction/core-actions';
32
- LoadAllCoreActions(); // prevent tree shaking for this dynamic module
33
- import { LoadApolloAccountsEnrichmentAction, LoadApolloContactsEnrichmentAction } from '@memberjunction/actions-apollo'
34
- LoadApolloAccountsEnrichmentAction();
35
- LoadApolloContactsEnrichmentAction();
36
-
37
- import { LoadCoreEntitiesServerSubClasses } from '@memberjunction/core-entities-server';
38
- LoadCoreEntitiesServerSubClasses(); // prevent tree shaking for this dynamic module
39
-
40
- import { LoadAgentManagementActions } from '@memberjunction/ai-agent-manager-actions';
41
- LoadAgentManagementActions();
42
-
43
- // Load agent manager core classes (registers custom agent classes like AgentBuilderAgent, AgentArchitectAgent)
44
- import { LoadAgentManagerCore } from '@memberjunction/ai-agent-manager';
45
- LoadAgentManagerCore();
46
-
47
- import { LoadSchedulingEngine } from '@memberjunction/scheduling-engine';
48
- LoadSchedulingEngine(); // This also loads drivers
49
-
50
- import { LoadAllSchedulingActions } from '@memberjunction/scheduling-actions';
51
- LoadAllSchedulingActions(); // prevent tree shaking for scheduling actions
52
-
53
- import { GetTypeformResponsesAction } from '@memberjunction/actions-bizapps-formbuilders';
54
- const x = GetTypeformResponsesAction; // prevent tree shaking for this dynamic module
30
+ import { createOAuthCallbackHandler } from './rest/OAuthCallbackHandler.js';
55
31
 
56
32
  import { resolve } from 'node:path';
57
33
  import { DataSourceInfo, raiseEvent } from './types.js';
58
- import { LoadAIEngine } from '@memberjunction/aiengine';
59
- import { LoadAIProviders } from '@memberjunction/ai-provider-bundle';
60
- // Load AI Engine and all providers to prevent tree shaking
61
- LoadAIEngine();
62
- LoadAIProviders();
63
-
64
- // Load Communication Providers
65
- import { LoadMSGraphProvider } from '@memberjunction/communication-ms-graph';
66
- import { LoadProvider as LoadSendGridProvider } from '@memberjunction/communication-sendgrid';
67
- LoadMSGraphProvider();
68
- LoadSendGridProvider();
69
34
 
70
35
  import { ExternalChangeDetectorEngine } from '@memberjunction/external-change-detection';
71
36
  import { ScheduledJobsService } from './services/ScheduledJobsService.js';
@@ -123,6 +88,18 @@ export * from './resolvers/CreateQueryResolver.js';
123
88
  export * from './resolvers/TelemetryResolver.js';
124
89
  export * from './resolvers/APIKeyResolver.js';
125
90
  export * from './resolvers/MCPResolver.js';
91
+ export * from './resolvers/ActionResolver.js';
92
+ export * from './resolvers/EntityCommunicationsResolver.js';
93
+ export * from './resolvers/EntityResolver.js';
94
+ export * from './resolvers/FileCategoryResolver.js';
95
+ export * from './resolvers/FileResolver.js';
96
+ export * from './resolvers/InfoResolver.js';
97
+ export * from './resolvers/PotentialDuplicateRecordResolver.js';
98
+ export * from './resolvers/RunTestResolver.js';
99
+ export * from './resolvers/UserFavoriteResolver.js';
100
+ export * from './resolvers/UserResolver.js';
101
+ export * from './resolvers/UserViewResolver.js';
102
+ export * from './resolvers/VersionHistoryResolver.js';
126
103
  export { GetReadOnlyDataSource, GetReadWriteDataSource, GetReadWriteProvider, GetReadOnlyProvider } from './util.js';
127
104
 
128
105
  export * from './generated/generated.js';
@@ -300,20 +277,7 @@ export const serve = async (resolverPaths: Array<string>, app: Application = cre
300
277
  level: 6
301
278
  }));
302
279
 
303
- app.use(
304
- graphqlRootPath,
305
- cors<cors.CorsRequest>(),
306
- BodyParser.json({ limit: '50mb' }),
307
- expressMiddleware(apolloServer, {
308
- context: contextFunction({
309
- setupComplete$,
310
- dataSource: extendConnectionPoolWithQuery(pool), // default read-write data source
311
- dataSources // all data source
312
- }),
313
- })
314
- );
315
-
316
- // Setup REST API endpoints
280
+ // Setup REST API endpoints BEFORE GraphQL (since graphqlRootPath may be '/' which catches all routes)
317
281
  const authMiddleware = async (req, res, next) => {
318
282
  try {
319
283
  const sessionIdRaw = req.headers['x-session-id'];
@@ -326,27 +290,58 @@ export const serve = async (resolverPaths: Array<string>, app: Application = cre
326
290
  if (!userPayload) {
327
291
  return res.status(401).json({ error: 'Invalid token' });
328
292
  }
329
-
293
+
294
+ // Set both req.user (standard Express convention) and req['mjUser'] (MJ REST convention)
295
+ // Note: userPayload contains { userRecord: UserInfo, email, sessionId }
296
+ // The mjUser property expects the UserInfo directly (userRecord)
330
297
  req.user = userPayload;
298
+ req['mjUser'] = userPayload.userRecord;
331
299
  next();
332
300
  } catch (error) {
333
301
  console.error('Auth error:', error);
334
302
  return res.status(401).json({ error: 'Authentication failed' });
335
303
  }
336
304
  };
337
-
338
- // Get REST API configuration from the config file
339
- const restApiConfig: RESTApiOptions = {
340
- enabled: configInfo.restApiOptions?.enabled ?? true,
305
+
306
+ // Build public URL for OAuth callbacks
307
+ const oauthPublicUrl = configInfo.publicUrl || `${configInfo.baseUrl}:${configInfo.graphqlPort}${configInfo.graphqlRootPath || ''}`;
308
+ console.log(`[OAuth] publicUrl: ${oauthPublicUrl}`);
309
+
310
+ // Set up OAuth callback routes at /oauth (independent of REST API)
311
+ // These must be registered BEFORE GraphQL middleware since graphqlRootPath may be '/'
312
+ if (oauthPublicUrl) {
313
+ const { callbackRouter, authenticatedRouter } = createOAuthCallbackHandler({
314
+ publicUrl: oauthPublicUrl,
315
+ // TODO: These should be configurable to point to the MJ Explorer UI
316
+ successRedirectUrl: `${oauthPublicUrl}/oauth/success`,
317
+ errorRedirectUrl: `${oauthPublicUrl}/oauth/error`
318
+ });
319
+
320
+ // Create CORS middleware for OAuth routes (needed for cross-origin requests from frontend)
321
+ const oauthCors = cors<cors.CorsRequest>();
322
+
323
+ // OAuth callback is unauthenticated (called by external auth server)
324
+ app.use('/oauth', oauthCors, callbackRouter);
325
+ console.log('[OAuth] Callback route registered at /oauth/callback');
326
+
327
+ // OAuth status, initiate, and exchange endpoints require authentication
328
+ // Must also have CORS for frontend requests and JSON body parsing
329
+ app.use('/oauth', oauthCors, BodyParser.json(), authMiddleware, authenticatedRouter);
330
+ console.log('[OAuth] Authenticated routes registered at /oauth/status, /oauth/initiate, and /oauth/exchange');
331
+ }
332
+
333
+ // Get REST API configuration
334
+ const restApiConfig = {
335
+ enabled: configInfo.restApiOptions?.enabled ?? false,
341
336
  includeEntities: configInfo.restApiOptions?.includeEntities,
342
- excludeEntities: configInfo.restApiOptions?.excludeEntities
337
+ excludeEntities: configInfo.restApiOptions?.excludeEntities,
343
338
  };
344
-
339
+
345
340
  // Apply options from server options if provided (these override the config file)
346
341
  if (options?.restApiOptions) {
347
342
  Object.assign(restApiConfig, options.restApiOptions);
348
343
  }
349
-
344
+
350
345
  // Get REST API configuration from environment variables if present (env vars override everything)
351
346
  if (process.env.MJ_REST_API_ENABLED !== undefined) {
352
347
  restApiConfig.enabled = process.env.MJ_REST_API_ENABLED === 'true';
@@ -354,18 +349,34 @@ export const serve = async (resolverPaths: Array<string>, app: Application = cre
354
349
  console.log('REST API is enabled via environment variable');
355
350
  }
356
351
  }
357
-
352
+
358
353
  if (process.env.MJ_REST_API_INCLUDE_ENTITIES) {
359
354
  restApiConfig.includeEntities = process.env.MJ_REST_API_INCLUDE_ENTITIES.split(',').map(e => e.trim());
360
355
  }
361
-
356
+
362
357
  if (process.env.MJ_REST_API_EXCLUDE_ENTITIES) {
363
358
  restApiConfig.excludeEntities = process.env.MJ_REST_API_EXCLUDE_ENTITIES.split(',').map(e => e.trim());
364
359
  }
365
-
360
+
366
361
  // Set up REST endpoints with the configured options and auth middleware
367
362
  setupRESTEndpoints(app, restApiConfig, authMiddleware);
368
363
 
364
+ // GraphQL middleware (after REST so /api/v1/* routes are handled first)
365
+ // Note: Type assertion needed due to @apollo/server bundling older @types/express types
366
+ // that are incompatible with Express 5.x types (missing 'param' property)
367
+ app.use(
368
+ graphqlRootPath,
369
+ cors<cors.CorsRequest>(),
370
+ BodyParser.json({ limit: '50mb' }),
371
+ expressMiddleware(apolloServer, {
372
+ context: contextFunction({
373
+ setupComplete$,
374
+ dataSource: extendConnectionPoolWithQuery(pool), // default read-write data source
375
+ dataSources // all data source
376
+ }),
377
+ }) as unknown as express.RequestHandler
378
+ );
379
+
369
380
  // Initialize and start scheduled jobs service if enabled
370
381
  let scheduledJobsService: ScheduledJobsService | null = null;
371
382
  if (configInfo.scheduledJobs?.enabled) {
@@ -7,7 +7,7 @@ import sql from 'mssql';
7
7
  import { SQLServerDataProvider } from '@memberjunction/sqlserver-dataprovider';
8
8
  import { GetReadWriteProvider } from '../util.js';
9
9
 
10
- export class FileResolver extends FileCategoryResolverBase {
10
+ export class FileCategoryResolver extends FileCategoryResolverBase {
11
11
  @Mutation(() => MJFileCategory_)
12
12
  async DeleteFileCategory(
13
13
  @Arg('ID', () => String) ID: string,
@@ -1,11 +1,15 @@
1
1
  import { Field, ObjectType, Int, Query, Resolver, Ctx, Info as RequestInfo } from 'type-graphql';
2
2
  import { Public, RequireSystemUser } from '../directives/index.js';
3
- import packageJson from '../../package.json' with { type: 'json' };
3
+ import { createRequire } from 'node:module';
4
4
  import { AppContext } from '../types.js';
5
5
  import os from 'node:os';
6
6
 
7
+ // Use createRequire to import JSON (compatible with module: es2022)
8
+ const require = createRequire(import.meta.url);
9
+ const packageJson = require('../../package.json') as { version: string };
10
+
7
11
  @ObjectType()
8
- export class Info {
12
+ export class ServerInfo {
9
13
  @Public()
10
14
  @Field()
11
15
  Version: string;
@@ -29,11 +33,11 @@ export class Info {
29
33
  Hostname: string;
30
34
  }
31
35
 
32
- @Resolver(Info)
33
- export class InfoResolver {
36
+ @Resolver(ServerInfo)
37
+ export class InfoResolver {
34
38
  @Public()
35
- @Query(() => Info)
36
- Info(@Ctx() context: AppContext): Info {
39
+ @Query(() => ServerInfo)
40
+ Info(@Ctx() context: AppContext): ServerInfo {
37
41
  return {
38
42
  Version: packageJson.version,
39
43
  IsSystemUser: Boolean(context.userPayload.isSystemUser),