@memberjunction/server 2.111.0 → 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
@@ -4,7 +4,7 @@ import { Disposable } from 'graphql-ws';
4
4
  import { Server } from 'http';
5
5
  import { enableIntrospection } from '../config.js';
6
6
  import { AppContext } from '../types.js';
7
- import { Metadata } from '@memberjunction/core';
7
+ import { Metadata } from '@memberjunction/global';
8
8
  import { SQLServerDataProvider } from '@memberjunction/sqlserver-dataprovider';
9
9
 
10
10
  const buildApolloServer = (
@@ -24,7 +24,7 @@ const buildApolloServer = (
24
24
  },
25
25
  };
26
26
  },
27
- }
27
+ },
28
28
  ],
29
29
  introspection: enableIntrospection,
30
30
  ...configOverride,
@@ -1,4 +1,4 @@
1
- import { AuthProviderConfig } from '@memberjunction/core';
1
+ import { AuthProviderConfig } from '@memberjunction/global';
2
2
  import { IAuthProvider } from './IAuthProvider.js';
3
3
  import { BaseAuthProvider } from './BaseAuthProvider.js';
4
4
  import { MJGlobal } from '@memberjunction/global';
@@ -40,16 +40,12 @@ export class AuthProviderFactory {
40
40
  // Use MJGlobal ClassFactory to create the provider instance
41
41
  // The provider type in config should match the key used in @RegisterClass
42
42
  // The config is passed as a constructor parameter via the spread operator
43
- const provider = MJGlobal.Instance.ClassFactory.CreateInstance<BaseAuthProvider>(
44
- BaseAuthProvider,
45
- config.type.toLowerCase(),
46
- config
47
- );
48
-
43
+ const provider = MJGlobal.Instance.ClassFactory.CreateInstance<BaseAuthProvider>(BaseAuthProvider, config.type.toLowerCase(), config);
44
+
49
45
  if (!provider) {
50
46
  throw new Error(`No provider registered for type: ${config.type}`);
51
47
  }
52
-
48
+
53
49
  return provider;
54
50
  } catch (error) {
55
51
  const message = error instanceof Error ? error.message : String(error);
@@ -66,10 +62,10 @@ export class AuthProviderFactory {
66
62
  }
67
63
 
68
64
  this.providers.set(provider.name, provider);
69
-
65
+
70
66
  // Clear issuer cache when registering new provider
71
67
  this.issuerCache.clear();
72
-
68
+
73
69
  console.log(`Registered auth provider: ${provider.name} with issuer: ${provider.issuer}`);
74
70
  }
75
71
 
@@ -130,9 +126,7 @@ export class AuthProviderFactory {
130
126
  // Get all registrations for BaseAuthProvider from ClassFactory
131
127
  const registrations = MJGlobal.Instance.ClassFactory.GetAllRegistrations(BaseAuthProvider);
132
128
  // Extract unique keys (provider types) from registrations
133
- const providerTypes = registrations
134
- .map(reg => reg.Key)
135
- .filter((key): key is string => key !== null && key !== undefined);
129
+ const providerTypes = registrations.map((reg) => reg.Key).filter((key): key is string => key !== null && key !== undefined);
136
130
  // Return unique provider types
137
131
  return Array.from(new Set(providerTypes));
138
132
  }
@@ -149,4 +143,4 @@ export class AuthProviderFactory {
149
143
  return false;
150
144
  }
151
145
  }
152
- }
146
+ }
@@ -1,6 +1,6 @@
1
1
  import { JwtHeader, JwtPayload, SigningKeyCallback } from 'jsonwebtoken';
2
2
  import jwksClient from 'jwks-rsa';
3
- import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/core';
3
+ import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/global';
4
4
  import { IAuthProvider } from './IAuthProvider.js';
5
5
 
6
6
  /**
@@ -28,7 +28,7 @@ export abstract class BaseAuthProvider implements IAuthProvider {
28
28
  jwksUri: this.jwksUri,
29
29
  cache: true,
30
30
  cacheMaxEntries: 5,
31
- cacheMaxAge: 600000 // 10 minutes
31
+ cacheMaxAge: 600000, // 10 minutes
32
32
  });
33
33
  }
34
34
 
@@ -43,7 +43,8 @@ export abstract class BaseAuthProvider implements IAuthProvider {
43
43
  * Gets the signing key for token verification
44
44
  */
45
45
  getSigningKey(header: JwtHeader, callback: SigningKeyCallback): void {
46
- this.jwksClient.getSigningKey(header.kid)
46
+ this.jwksClient
47
+ .getSigningKey(header.kid)
47
48
  .then((key) => {
48
49
  const signingKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;
49
50
  callback(null, signingKey);
@@ -68,4 +69,4 @@ export abstract class BaseAuthProvider implements IAuthProvider {
68
69
  * Abstract method for extracting user info - must be implemented by each provider
69
70
  */
70
71
  abstract extractUserInfo(payload: JwtPayload): AuthUserInfo;
71
- }
72
+ }
@@ -1,5 +1,5 @@
1
1
  import { JwtHeader, JwtPayload, SigningKeyCallback } from 'jsonwebtoken';
2
- import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/core';
2
+ import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/global';
3
3
 
4
4
  /**
5
5
  * Interface for authentication providers in MemberJunction
@@ -46,4 +46,4 @@ export interface IAuthProvider {
46
46
  * Checks if a given issuer URL belongs to this provider
47
47
  */
48
48
  matchesIssuer(issuer: string): boolean;
49
- }
49
+ }
@@ -1,5 +1,5 @@
1
1
  import { RegisterClass } from '@memberjunction/global';
2
- import { Metadata, RunView, LogError, EntitySaveOptions } from '@memberjunction/core';
2
+ import { Metadata, RunView, LogError, EntitySaveOptions } from '@memberjunction/global';
3
3
  import { NewUserBase } from './newUsers.js';
4
4
  import { UserCache } from '@memberjunction/sqlserver-dataprovider';
5
5
  import { configInfo } from '../config.js';
@@ -13,7 +13,14 @@ import { configInfo } from '../config.js';
13
13
  // so that your class is actually used.
14
14
  //@RegisterClass(NewUserBase, undefined, 1) /*by putting 1 into the priority setting, MJGlobal ClassFactory will use this instead of the base class as that registration had no priority*/
15
15
  export class ExampleNewUserSubClass extends NewUserBase {
16
- public override async createNewUser(firstName: string, lastName: string, email: string, linkedRecordType: string = 'None', linkedEntityId?: string, linkedEntityRecordId?: string) {
16
+ public override async createNewUser(
17
+ firstName: string,
18
+ lastName: string,
19
+ email: string,
20
+ linkedRecordType: string = 'None',
21
+ linkedEntityId?: string,
22
+ linkedEntityRecordId?: string
23
+ ) {
17
24
  try {
18
25
  const md = new Metadata();
19
26
 
package/src/auth/index.ts CHANGED
@@ -2,7 +2,7 @@ import { JwtHeader, SigningKeyCallback, JwtPayload } from 'jsonwebtoken';
2
2
  import { configInfo } from '../config.js';
3
3
  import { UserCache } from '@memberjunction/sqlserver-dataprovider';
4
4
  import sql from 'mssql';
5
- import { Metadata, RoleInfo, UserInfo } from '@memberjunction/core';
5
+ import { Metadata, RoleInfo, UserInfo } from '@memberjunction/global';
6
6
  import { NewUserBase } from './newUsers.js';
7
7
  import { MJGlobal } from '@memberjunction/global';
8
8
  import { UserEntity, UserEntityType } from '@memberjunction/core-entities';
@@ -53,14 +53,14 @@ const refreshUserCache = async (dataSource?: sql.ConnectionPool) => {
53
53
  export const getValidationOptions = (issuer: string): { audience: string; jwksUri: string } | undefined => {
54
54
  const factory = AuthProviderFactory.getInstance();
55
55
  const provider = factory.getByIssuer(issuer);
56
-
56
+
57
57
  if (!provider) {
58
58
  return undefined;
59
59
  }
60
60
 
61
61
  return {
62
62
  audience: provider.audience,
63
- jwksUri: provider.jwksUri
63
+ jwksUri: provider.jwksUri,
64
64
  };
65
65
  };
66
66
 
@@ -68,18 +68,21 @@ export const getValidationOptions = (issuer: string): { audience: string; jwksUr
68
68
  * Backward compatible validationOptions object
69
69
  * @deprecated Use getValidationOptions() or AuthProviderRegistry instead
70
70
  */
71
- export const validationOptions: Record<string, { audience: string; jwksUri: string }> = new Proxy({}, {
72
- get: (target, prop: string) => {
73
- return getValidationOptions(prop);
74
- },
75
- has: (target, prop: string) => {
76
- return getValidationOptions(prop) !== undefined;
77
- },
78
- ownKeys: () => {
79
- const factory = AuthProviderFactory.getInstance();
80
- return factory.getAllProviders().map(p => p.issuer);
71
+ export const validationOptions: Record<string, { audience: string; jwksUri: string }> = new Proxy(
72
+ {},
73
+ {
74
+ get: (target, prop: string) => {
75
+ return getValidationOptions(prop);
76
+ },
77
+ has: (target, prop: string) => {
78
+ return getValidationOptions(prop) !== undefined;
79
+ },
80
+ ownKeys: () => {
81
+ const factory = AuthProviderFactory.getInstance();
82
+ return factory.getAllProviders().map((p) => p.issuer);
83
+ },
81
84
  }
82
- });
85
+ );
83
86
 
84
87
  export class UserPayload {
85
88
  aio?: string;
@@ -108,14 +111,14 @@ export class UserPayload {
108
111
  */
109
112
  export const getSigningKeys = (issuer: string) => (header: JwtHeader, cb: SigningKeyCallback) => {
110
113
  const factory = AuthProviderFactory.getInstance();
111
-
114
+
112
115
  // Initialize providers if not already done
113
116
  if (!factory.hasProviders()) {
114
117
  initializeAuthProviders();
115
118
  }
116
119
 
117
120
  const provider = factory.getByIssuer(issuer);
118
-
121
+
119
122
  if (!provider) {
120
123
  // Check if we have any providers at all
121
124
  if (!factory.hasProviders()) {
@@ -130,7 +133,9 @@ export const getSigningKeys = (issuer: string) => (header: JwtHeader, cb: Signin
130
133
  /**
131
134
  * Extracts user information from JWT payload using the appropriate provider
132
135
  */
133
- export const extractUserInfoFromPayload = (payload: JwtPayload): {
136
+ export const extractUserInfoFromPayload = (
137
+ payload: JwtPayload
138
+ ): {
134
139
  email?: string;
135
140
  firstName?: string;
136
141
  lastName?: string;
@@ -139,31 +144,31 @@ export const extractUserInfoFromPayload = (payload: JwtPayload): {
139
144
  } => {
140
145
  const factory = AuthProviderFactory.getInstance();
141
146
  const issuer = payload.iss;
142
-
147
+
143
148
  if (!issuer) {
144
149
  // Fallback to default extraction
145
150
  const preferredUsername = payload.preferred_username as string | undefined;
146
151
  return {
147
- email: payload.email as string | undefined || preferredUsername,
152
+ email: (payload.email as string | undefined) || preferredUsername,
148
153
  firstName: payload.given_name as string | undefined,
149
154
  lastName: payload.family_name as string | undefined,
150
155
  fullName: payload.name as string | undefined,
151
- preferredUsername
156
+ preferredUsername,
152
157
  };
153
158
  }
154
159
 
155
160
  const provider = factory.getByIssuer(issuer);
156
-
161
+
157
162
  if (!provider) {
158
163
  // Fallback to default extraction
159
164
  const fullName = payload.name as string | undefined;
160
165
  const preferredUsername = payload.preferred_username as string | undefined;
161
166
  return {
162
- email: payload.email as string | undefined || preferredUsername,
163
- firstName: payload.given_name as string | undefined || fullName?.split(' ')[0],
164
- lastName: payload.family_name as string | undefined || fullName?.split(' ')[1] || fullName?.split(' ')[0],
167
+ email: (payload.email as string | undefined) || preferredUsername,
168
+ firstName: (payload.given_name as string | undefined) || fullName?.split(' ')[0],
169
+ lastName: (payload.family_name as string | undefined) || fullName?.split(' ')[1] || fullName?.split(' ')[0],
165
170
  fullName,
166
- preferredUsername
171
+ preferredUsername,
167
172
  };
168
173
  }
169
174
 
@@ -267,4 +272,4 @@ export const verifyUserRecord = async (
267
272
  };
268
273
 
269
274
  // Initialize providers on module load
270
- initializeAuthProviders();
275
+ initializeAuthProviders();
@@ -1,5 +1,5 @@
1
1
  import { configInfo } from '../config.js';
2
- import { AuthProviderConfig, LogError, LogStatus } from '@memberjunction/core';
2
+ import { AuthProviderConfig, LogError, LogStatus } from '@memberjunction/global';
3
3
  import { AuthProviderFactory } from './AuthProviderFactory.js';
4
4
 
5
5
  /**
@@ -7,7 +7,7 @@ import { AuthProviderFactory } from './AuthProviderFactory.js';
7
7
  */
8
8
  export function initializeAuthProviders(): void {
9
9
  const factory = AuthProviderFactory.getInstance();
10
-
10
+
11
11
  // Clear any existing providers
12
12
  factory.clear();
13
13
 
@@ -28,4 +28,4 @@ export function initializeAuthProviders(): void {
28
28
  if (!factory.hasProviders()) {
29
29
  LogError('No authentication providers configured. Please configure authProviders array in mj.config.cjs');
30
30
  }
31
- }
31
+ }
@@ -1,142 +1,174 @@
1
- import { ApplicationInfo, EntitySaveOptions, LogError, LogStatus, Metadata, RunView, RunViewResult, UserInfo } from "@memberjunction/core";
2
- import { RegisterClass } from "@memberjunction/global";
3
- import { UserCache } from "@memberjunction/sqlserver-dataprovider";
4
- import { configInfo } from "../config.js";
5
- import { UserEntity, UserRoleEntity, UserApplicationEntity, UserApplicationEntityEntity, ApplicationEntityType, ApplicationEntityEntityType } from "@memberjunction/core-entities";
1
+ import {
2
+ ApplicationInfo,
3
+ EntitySaveOptions,
4
+ LogError,
5
+ LogStatus,
6
+ Metadata,
7
+ RunView,
8
+ RunViewResult,
9
+ UserInfo,
10
+ } from '@memberjunction/global';
11
+ import { RegisterClass } from '@memberjunction/global';
12
+ import { UserCache } from '@memberjunction/sqlserver-dataprovider';
13
+ import { configInfo } from '../config.js';
14
+ import {
15
+ UserEntity,
16
+ UserRoleEntity,
17
+ UserApplicationEntity,
18
+ UserApplicationEntityEntity,
19
+ ApplicationEntityType,
20
+ ApplicationEntityEntityType,
21
+ } from '@memberjunction/core-entities';
6
22
 
7
23
  export class NewUserBase {
8
- public async createNewUser(firstName: string, lastName: string, email: string, linkedRecordType: string = 'None', linkedEntityId?: string, linkedEntityRecordId?: string): Promise<UserEntity | null> {
9
- try {
10
- let contextUser: UserInfo | null = null;
11
-
12
- const contextUserForNewUserCreation: string = configInfo?.userHandling?.contextUserForNewUserCreation;
13
- if(contextUserForNewUserCreation){
14
- contextUser = UserCache.Instance.UserByName(contextUserForNewUserCreation);
15
- }
16
-
17
- if (!contextUser) {
18
- LogError(`Failed to load context user ${configInfo?.userHandling?.contextUserForNewUserCreation}, using an existing user with the Owner role instead`);
19
-
20
- contextUser = UserCache.Users.find(user => user.Type.trim().toLowerCase() ==='owner')!;
21
- if (!contextUser) {
22
- LogError(`No existing users found in the database with the Owner role, cannot create a new user`);
23
- return null;
24
- }
25
- }
26
-
27
- const md: Metadata = new Metadata();
28
- const user = await md.GetEntityObject<UserEntity>('Users', contextUser) // To-Do - change this to be a different defined user for the user creation process
29
- user.NewRecord();
30
- user.Name = email;
31
- user.IsActive = true;
32
- user.FirstName = firstName;
33
- user.LastName = lastName;
34
- user.Email = email;
35
- user.Type = 'User';
36
- user.LinkedRecordType = linkedRecordType;
37
-
38
- if (linkedEntityId){
39
- user.LinkedEntityID = linkedEntityId;
40
- }
41
-
42
- if (linkedEntityRecordId){
43
- user.LinkedEntityRecordID = linkedEntityRecordId;
44
- }
45
-
46
- const saveResult: boolean = await user.Save();
47
- if(!saveResult){
48
- LogError(`Failed to create new user ${firstName} ${lastName} ${email}:`, undefined, user.LatestResult);
49
- return null;
50
- }
51
-
52
- if(configInfo.userHandling && configInfo.userHandling.newUserRoles){
53
- // user created, now create however many roles we need to create for this user based on the config settings
54
- LogStatus(`User ${user.Email} created, assigning roles`);
55
- for (const role of configInfo.userHandling.newUserRoles) {
56
- const userRoleEntity: UserRoleEntity = await md.GetEntityObject<UserRoleEntity>('User Roles', contextUser);
57
- userRoleEntity.NewRecord();
58
- userRoleEntity.UserID = user.ID;
59
- const userRole = md.Roles.find(r => r.Name === role);
60
-
61
- if (!userRole) {
62
- LogError(`Role ${role} not found in the database, cannot assign to new user ${user.Name}`);
63
- continue;
64
- }
65
-
66
- userRoleEntity.RoleID = userRole.ID;
67
- const roleSaveResult: boolean = await userRoleEntity.Save();
68
- if(roleSaveResult){
69
- LogStatus(`Assigned role ${role} to new user ${user.Name}`);
70
- }
71
- else{
72
- LogError(`Failed to assign role ${role} to new user ${user.Name}:`, undefined, userRoleEntity.LatestResult);
73
- }
74
-
75
- }
24
+ public async createNewUser(
25
+ firstName: string,
26
+ lastName: string,
27
+ email: string,
28
+ linkedRecordType: string = 'None',
29
+ linkedEntityId?: string,
30
+ linkedEntityRecordId?: string
31
+ ): Promise<UserEntity | null> {
32
+ try {
33
+ let contextUser: UserInfo | null = null;
34
+
35
+ const contextUserForNewUserCreation: string = configInfo?.userHandling?.contextUserForNewUserCreation;
36
+ if (contextUserForNewUserCreation) {
37
+ contextUser = UserCache.Instance.UserByName(contextUserForNewUserCreation);
38
+ }
39
+
40
+ if (!contextUser) {
41
+ LogError(
42
+ `Failed to load context user ${configInfo?.userHandling?.contextUserForNewUserCreation}, using an existing user with the Owner role instead`
43
+ );
44
+
45
+ contextUser = UserCache.Users.find((user) => user.Type.trim().toLowerCase() === 'owner')!;
46
+ if (!contextUser) {
47
+ LogError(`No existing users found in the database with the Owner role, cannot create a new user`);
48
+ return null;
49
+ }
50
+ }
51
+
52
+ const md: Metadata = new Metadata();
53
+ const user = await md.GetEntityObject<UserEntity>('Users', contextUser); // To-Do - change this to be a different defined user for the user creation process
54
+ user.NewRecord();
55
+ user.Name = email;
56
+ user.IsActive = true;
57
+ user.FirstName = firstName;
58
+ user.LastName = lastName;
59
+ user.Email = email;
60
+ user.Type = 'User';
61
+ user.LinkedRecordType = linkedRecordType;
62
+
63
+ if (linkedEntityId) {
64
+ user.LinkedEntityID = linkedEntityId;
65
+ }
66
+
67
+ if (linkedEntityRecordId) {
68
+ user.LinkedEntityRecordID = linkedEntityRecordId;
69
+ }
70
+
71
+ const saveResult: boolean = await user.Save();
72
+ if (!saveResult) {
73
+ LogError(`Failed to create new user ${firstName} ${lastName} ${email}:`, undefined, user.LatestResult);
74
+ return null;
75
+ }
76
+
77
+ if (configInfo.userHandling && configInfo.userHandling.newUserRoles) {
78
+ // user created, now create however many roles we need to create for this user based on the config settings
79
+ LogStatus(`User ${user.Email} created, assigning roles`);
80
+ for (const role of configInfo.userHandling.newUserRoles) {
81
+ const userRoleEntity: UserRoleEntity = await md.GetEntityObject<UserRoleEntity>('User Roles', contextUser);
82
+ userRoleEntity.NewRecord();
83
+ userRoleEntity.UserID = user.ID;
84
+ const userRole = md.Roles.find((r) => r.Name === role);
85
+
86
+ if (!userRole) {
87
+ LogError(`Role ${role} not found in the database, cannot assign to new user ${user.Name}`);
88
+ continue;
89
+ }
90
+
91
+ userRoleEntity.RoleID = userRole.ID;
92
+ const roleSaveResult: boolean = await userRoleEntity.Save();
93
+ if (roleSaveResult) {
94
+ LogStatus(`Assigned role ${role} to new user ${user.Name}`);
95
+ } else {
96
+ LogError(`Failed to assign role ${role} to new user ${user.Name}:`, undefined, userRoleEntity.LatestResult);
97
+ }
98
+ }
99
+ }
100
+
101
+ // Create UserApplication records if specified in the config
102
+ if (configInfo.userHandling && configInfo.userHandling.CreateUserApplicationRecords) {
103
+ LogStatus('Creating User Applications for new user: ' + user.Name);
104
+ for (const appName of configInfo.userHandling.UserApplications) {
105
+ const toLowerCase: string = appName.trim().toLocaleLowerCase();
106
+ const application: ApplicationInfo | undefined = md.Applications.find((a) => a.Name.trim().toLocaleLowerCase() === toLowerCase);
107
+ if (!application) {
108
+ LogError(`Application ${appName} not found in the Metadata, cannot assign to new user ${user.Name}`);
109
+ continue;
110
+ }
111
+
112
+ const userApplication: UserApplicationEntity = await md.GetEntityObject<UserApplicationEntity>('User Applications', contextUser);
113
+ userApplication.NewRecord();
114
+ userApplication.UserID = user.ID;
115
+ userApplication.ApplicationID = application.ID;
116
+ userApplication.IsActive = true;
117
+
118
+ const userApplicationSaveResult: boolean = await userApplication.Save();
119
+ if (userApplicationSaveResult) {
120
+ LogStatus(`Created User Application ${appName} for new user ${user.Name}`);
121
+
122
+ //now create a UserApplicationEntity records for each entity in the application
123
+ const rv: RunView = new RunView();
124
+ const rvResult: RunViewResult<ApplicationEntityEntityType> = await rv.RunView(
125
+ {
126
+ EntityName: 'Application Entities',
127
+ ExtraFilter: `ApplicationID = '${application.ID}' and DefaultForNewUser = 1`,
128
+ },
129
+ contextUser
130
+ );
131
+
132
+ if (!rvResult.Success) {
133
+ LogError(
134
+ `Failed to load Application Entities for Application ${appName} for new user ${user.Name}:`,
135
+ undefined,
136
+ rvResult.ErrorMessage
137
+ );
138
+ continue;
76
139
  }
77
140
 
78
- // Create UserApplication records if specified in the config
79
- if (configInfo.userHandling && configInfo.userHandling.CreateUserApplicationRecords) {
80
- LogStatus("Creating User Applications for new user: " + user.Name);
81
- for(const appName of configInfo.userHandling.UserApplications){
82
- const toLowerCase: string = appName.trim().toLocaleLowerCase();
83
- const application: ApplicationInfo | undefined = md.Applications.find(a => a.Name.trim().toLocaleLowerCase() === toLowerCase);
84
- if (!application) {
85
- LogError(`Application ${appName} not found in the Metadata, cannot assign to new user ${user.Name}`);
86
- continue;
87
- }
88
-
89
- const userApplication: UserApplicationEntity = await md.GetEntityObject<UserApplicationEntity>('User Applications', contextUser);
90
- userApplication.NewRecord();
91
- userApplication.UserID = user.ID;
92
- userApplication.ApplicationID = application.ID;
93
- userApplication.IsActive = true;
94
-
95
- const userApplicationSaveResult: boolean = await userApplication.Save();
96
- if(userApplicationSaveResult){
97
- LogStatus(`Created User Application ${appName} for new user ${user.Name}`);
98
-
99
- //now create a UserApplicationEntity records for each entity in the application
100
- const rv: RunView = new RunView();
101
- const rvResult: RunViewResult<ApplicationEntityEntityType> = await rv.RunView({
102
- EntityName: 'Application Entities',
103
- ExtraFilter: `ApplicationID = '${application.ID}' and DefaultForNewUser = 1`,
104
- }, contextUser);
105
-
106
- if(!rvResult.Success){
107
- LogError(`Failed to load Application Entities for Application ${appName} for new user ${user.Name}:`, undefined, rvResult.ErrorMessage);
108
- continue;
109
- }
110
-
111
- LogStatus(`Creating ${rvResult.Results.length} User Application Entities for User Application ${appName} for new user ${user.Name}`);
112
-
113
- for(const [index, appEntity] of rvResult.Results.entries()){
114
- const userAppEntity: UserApplicationEntityEntity = await md.GetEntityObject<UserApplicationEntityEntity>('User Application Entities', contextUser);
115
- userAppEntity.NewRecord();
116
- userAppEntity.UserApplicationID = userApplication.ID;
117
- userAppEntity.EntityID = appEntity.EntityID;
118
- userAppEntity.Sequence = index;
119
-
120
- const userAppEntitySaveResult: boolean = await userAppEntity.Save();
121
- if(userAppEntitySaveResult){
122
- LogStatus(`Created User Application Entity ${appEntity.Entity} for new user ${user.Name}`);
123
- }
124
- else{
125
- LogError(`Failed to create User Application Entity for new user ${user.Name}:`, undefined, userAppEntity.LatestResult);
126
- }
127
- }
128
- }
129
- else{
130
- LogError(`Failed to create User Application ${appName} for new user ${user.Name}:`, undefined, userApplication.LatestResult);
131
- }
132
- }
141
+ LogStatus(
142
+ `Creating ${rvResult.Results.length} User Application Entities for User Application ${appName} for new user ${user.Name}`
143
+ );
144
+
145
+ for (const [index, appEntity] of rvResult.Results.entries()) {
146
+ const userAppEntity: UserApplicationEntityEntity = await md.GetEntityObject<UserApplicationEntityEntity>(
147
+ 'User Application Entities',
148
+ contextUser
149
+ );
150
+ userAppEntity.NewRecord();
151
+ userAppEntity.UserApplicationID = userApplication.ID;
152
+ userAppEntity.EntityID = appEntity.EntityID;
153
+ userAppEntity.Sequence = index;
154
+
155
+ const userAppEntitySaveResult: boolean = await userAppEntity.Save();
156
+ if (userAppEntitySaveResult) {
157
+ LogStatus(`Created User Application Entity ${appEntity.Entity} for new user ${user.Name}`);
158
+ } else {
159
+ LogError(`Failed to create User Application Entity for new user ${user.Name}:`, undefined, userAppEntity.LatestResult);
160
+ }
133
161
  }
134
-
135
- return user;
136
- }
137
- catch (e) {
138
- LogError(e);
139
- return undefined;
162
+ } else {
163
+ LogError(`Failed to create User Application ${appName} for new user ${user.Name}:`, undefined, userApplication.LatestResult);
164
+ }
140
165
  }
166
+ }
167
+
168
+ return user;
169
+ } catch (e) {
170
+ LogError(e);
171
+ return undefined;
141
172
  }
173
+ }
142
174
  }
@@ -1,6 +1,6 @@
1
1
  import { JwtPayload } from 'jsonwebtoken';
2
2
  import { RegisterClass } from '@memberjunction/global';
3
- import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/core';
3
+ import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/global';
4
4
  import { BaseAuthProvider } from '../BaseAuthProvider.js';
5
5
 
6
6
  /**
@@ -21,14 +21,14 @@ export class Auth0Provider extends BaseAuthProvider {
21
21
  const fullName = payload.name as string | undefined;
22
22
  const firstName = payload.given_name as string | undefined;
23
23
  const lastName = payload.family_name as string | undefined;
24
- const preferredUsername = payload.preferred_username as string | undefined || email;
24
+ const preferredUsername = (payload.preferred_username as string | undefined) || email;
25
25
 
26
26
  return {
27
27
  email,
28
28
  firstName: firstName || fullName?.split(' ')[0],
29
29
  lastName: lastName || fullName?.split(' ')[1] || fullName?.split(' ')[0],
30
30
  fullName,
31
- preferredUsername
31
+ preferredUsername,
32
32
  };
33
33
  }
34
34
 
@@ -39,7 +39,7 @@ export class Auth0Provider extends BaseAuthProvider {
39
39
  const baseValid = super.validateConfig();
40
40
  const hasClientId = !!this.config.clientId;
41
41
  const hasDomain = !!this.config.domain;
42
-
42
+
43
43
  return baseValid && hasClientId && hasDomain;
44
44
  }
45
- }
45
+ }