@memberjunction/server 2.112.0 → 2.113.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/dist/agents/skip-agent.d.ts +4 -4
  2. package/dist/agents/skip-agent.d.ts.map +1 -1
  3. package/dist/agents/skip-agent.js +951 -808
  4. package/dist/agents/skip-agent.js.map +1 -1
  5. package/dist/agents/skip-sdk.d.ts +1 -1
  6. package/dist/agents/skip-sdk.d.ts.map +1 -1
  7. package/dist/agents/skip-sdk.js +43 -53
  8. package/dist/agents/skip-sdk.js.map +1 -1
  9. package/dist/apolloServer/index.js +1 -1
  10. package/dist/auth/AuthProviderFactory.d.ts +1 -1
  11. package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
  12. package/dist/auth/AuthProviderFactory.js +3 -1
  13. package/dist/auth/AuthProviderFactory.js.map +1 -1
  14. package/dist/auth/BaseAuthProvider.d.ts +1 -1
  15. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  16. package/dist/auth/BaseAuthProvider.js +2 -3
  17. package/dist/auth/BaseAuthProvider.js.map +1 -1
  18. package/dist/auth/IAuthProvider.d.ts +1 -1
  19. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  20. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  21. package/dist/auth/exampleNewUserSubClass.js +1 -1
  22. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  23. package/dist/auth/index.d.ts +1 -1
  24. package/dist/auth/index.d.ts.map +1 -1
  25. package/dist/auth/index.js +6 -6
  26. package/dist/auth/index.js.map +1 -1
  27. package/dist/auth/initializeProviders.js +1 -1
  28. package/dist/auth/initializeProviders.js.map +1 -1
  29. package/dist/auth/newUsers.d.ts +1 -1
  30. package/dist/auth/newUsers.d.ts.map +1 -1
  31. package/dist/auth/newUsers.js +7 -7
  32. package/dist/auth/newUsers.js.map +1 -1
  33. package/dist/auth/providers/Auth0Provider.d.ts +1 -1
  34. package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
  35. package/dist/auth/providers/Auth0Provider.js +1 -1
  36. package/dist/auth/providers/Auth0Provider.js.map +1 -1
  37. package/dist/auth/providers/CognitoProvider.d.ts +1 -1
  38. package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
  39. package/dist/auth/providers/CognitoProvider.js +6 -3
  40. package/dist/auth/providers/CognitoProvider.js.map +1 -1
  41. package/dist/auth/providers/GoogleProvider.d.ts +1 -1
  42. package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
  43. package/dist/auth/providers/GoogleProvider.js +1 -1
  44. package/dist/auth/providers/GoogleProvider.js.map +1 -1
  45. package/dist/auth/providers/MSALProvider.d.ts +1 -1
  46. package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
  47. package/dist/auth/providers/MSALProvider.js +1 -1
  48. package/dist/auth/providers/MSALProvider.js.map +1 -1
  49. package/dist/auth/providers/OktaProvider.d.ts +1 -1
  50. package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
  51. package/dist/auth/providers/OktaProvider.js +1 -1
  52. package/dist/auth/providers/OktaProvider.js.map +1 -1
  53. package/dist/config.d.ts.map +1 -1
  54. package/dist/config.js +10 -22
  55. package/dist/config.js.map +1 -1
  56. package/dist/context.d.ts +1 -1
  57. package/dist/context.d.ts.map +1 -1
  58. package/dist/context.js +7 -9
  59. package/dist/context.js.map +1 -1
  60. package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
  61. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  62. package/dist/entitySubclasses/entityPermissions.server.js +1 -1
  63. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  64. package/dist/generated/generated.d.ts +788 -658
  65. package/dist/generated/generated.d.ts.map +1 -1
  66. package/dist/generated/generated.js +2050 -3054
  67. package/dist/generated/generated.js.map +1 -1
  68. package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
  69. package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
  70. package/dist/generic/KeyInputOutputTypes.js +1 -1
  71. package/dist/generic/KeyInputOutputTypes.js.map +1 -1
  72. package/dist/generic/ResolverBase.d.ts +1 -1
  73. package/dist/generic/ResolverBase.d.ts.map +1 -1
  74. package/dist/generic/ResolverBase.js +10 -15
  75. package/dist/generic/ResolverBase.js.map +1 -1
  76. package/dist/generic/RunViewResolver.d.ts +1 -1
  77. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  78. package/dist/generic/RunViewResolver.js +15 -15
  79. package/dist/generic/RunViewResolver.js.map +1 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +13 -18
  82. package/dist/index.js.map +1 -1
  83. package/dist/resolvers/ActionResolver.d.ts +2 -2
  84. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  85. package/dist/resolvers/ActionResolver.js +30 -28
  86. package/dist/resolvers/ActionResolver.js.map +1 -1
  87. package/dist/resolvers/AskSkipResolver.d.ts +2 -2
  88. package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
  89. package/dist/resolvers/AskSkipResolver.js +50 -60
  90. package/dist/resolvers/AskSkipResolver.js.map +1 -1
  91. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  92. package/dist/resolvers/ComponentRegistryResolver.js +38 -36
  93. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  94. package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
  95. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  96. package/dist/resolvers/CreateQueryResolver.js +40 -43
  97. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  98. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  99. package/dist/resolvers/DatasetResolver.js +1 -1
  100. package/dist/resolvers/DatasetResolver.js.map +1 -1
  101. package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
  102. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  103. package/dist/resolvers/EntityRecordNameResolver.js +1 -1
  104. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  105. package/dist/resolvers/EntityResolver.d.ts.map +1 -1
  106. package/dist/resolvers/EntityResolver.js +1 -1
  107. package/dist/resolvers/EntityResolver.js.map +1 -1
  108. package/dist/resolvers/FileCategoryResolver.js +1 -1
  109. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  110. package/dist/resolvers/FileResolver.js +1 -1
  111. package/dist/resolvers/FileResolver.js.map +1 -1
  112. package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
  113. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  114. package/dist/resolvers/GetDataContextDataResolver.js +5 -5
  115. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  116. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  117. package/dist/resolvers/GetDataResolver.js +6 -8
  118. package/dist/resolvers/GetDataResolver.js.map +1 -1
  119. package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
  120. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  121. package/dist/resolvers/MergeRecordsResolver.js +3 -3
  122. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  123. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
  124. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  125. package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
  126. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  127. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  128. package/dist/resolvers/QueryResolver.js +11 -11
  129. package/dist/resolvers/QueryResolver.js.map +1 -1
  130. package/dist/resolvers/ReportResolver.js +1 -1
  131. package/dist/resolvers/ReportResolver.js.map +1 -1
  132. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  133. package/dist/resolvers/RunAIAgentResolver.js +28 -27
  134. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  135. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  136. package/dist/resolvers/RunAIPromptResolver.js +31 -31
  137. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  138. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  139. package/dist/resolvers/RunTemplateResolver.js +9 -9
  140. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  141. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  142. package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
  143. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  144. package/dist/resolvers/SyncDataResolver.d.ts +1 -1
  145. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  146. package/dist/resolvers/SyncDataResolver.js +14 -15
  147. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  148. package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
  149. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  150. package/dist/resolvers/SyncRolesUsersResolver.js +44 -48
  151. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  152. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  153. package/dist/resolvers/TaskResolver.js +7 -7
  154. package/dist/resolvers/TaskResolver.js.map +1 -1
  155. package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
  156. package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
  157. package/dist/resolvers/TransactionGroupResolver.js +12 -12
  158. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  159. package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
  160. package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
  161. package/dist/resolvers/UserFavoriteResolver.js +1 -1
  162. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  163. package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
  164. package/dist/resolvers/UserViewResolver.js.map +1 -1
  165. package/dist/rest/EntityCRUDHandler.d.ts +1 -1
  166. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  167. package/dist/rest/EntityCRUDHandler.js +16 -14
  168. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  169. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  170. package/dist/rest/RESTEndpointHandler.js +25 -23
  171. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  172. package/dist/rest/ViewOperationsHandler.d.ts +1 -1
  173. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  174. package/dist/rest/ViewOperationsHandler.js +21 -17
  175. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  176. package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
  177. package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
  178. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  179. package/dist/services/ScheduledJobsService.js +6 -4
  180. package/dist/services/ScheduledJobsService.js.map +1 -1
  181. package/dist/services/TaskOrchestrator.d.ts +1 -1
  182. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  183. package/dist/services/TaskOrchestrator.js +30 -30
  184. package/dist/services/TaskOrchestrator.js.map +1 -1
  185. package/dist/types.d.ts +3 -3
  186. package/dist/types.d.ts.map +1 -1
  187. package/dist/types.js +1 -0
  188. package/dist/types.js.map +1 -1
  189. package/dist/util.d.ts +1 -1
  190. package/dist/util.d.ts.map +1 -1
  191. package/dist/util.js +2 -2
  192. package/dist/util.js.map +1 -1
  193. package/package.json +39 -36
  194. package/src/agents/skip-agent.ts +1200 -1067
  195. package/src/agents/skip-sdk.ts +851 -877
  196. package/src/apolloServer/index.ts +2 -2
  197. package/src/auth/AuthProviderFactory.ts +14 -8
  198. package/src/auth/BaseAuthProvider.ts +4 -5
  199. package/src/auth/IAuthProvider.ts +2 -2
  200. package/src/auth/exampleNewUserSubClass.ts +2 -9
  201. package/src/auth/index.ts +26 -31
  202. package/src/auth/initializeProviders.ts +3 -3
  203. package/src/auth/newUsers.ts +134 -166
  204. package/src/auth/providers/Auth0Provider.ts +5 -5
  205. package/src/auth/providers/CognitoProvider.ts +10 -7
  206. package/src/auth/providers/GoogleProvider.ts +5 -4
  207. package/src/auth/providers/MSALProvider.ts +5 -5
  208. package/src/auth/providers/OktaProvider.ts +7 -6
  209. package/src/config.ts +54 -63
  210. package/src/context.ts +30 -42
  211. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  212. package/src/generated/generated.ts +40442 -48106
  213. package/src/generic/KeyInputOutputTypes.ts +6 -3
  214. package/src/generic/ResolverBase.ts +78 -119
  215. package/src/generic/RunViewResolver.ts +23 -27
  216. package/src/index.ts +48 -66
  217. package/src/resolvers/ActionResolver.ts +57 -46
  218. package/src/resolvers/AskSkipResolver.ts +533 -607
  219. package/src/resolvers/ComponentRegistryResolver.ts +562 -547
  220. package/src/resolvers/CreateQueryResolver.ts +655 -683
  221. package/src/resolvers/DatasetResolver.ts +6 -5
  222. package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
  223. package/src/resolvers/EntityRecordNameResolver.ts +5 -9
  224. package/src/resolvers/EntityResolver.ts +7 -9
  225. package/src/resolvers/FileCategoryResolver.ts +2 -2
  226. package/src/resolvers/FileResolver.ts +4 -4
  227. package/src/resolvers/GetDataContextDataResolver.ts +118 -106
  228. package/src/resolvers/GetDataResolver.ts +205 -194
  229. package/src/resolvers/MergeRecordsResolver.ts +5 -5
  230. package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
  231. package/src/resolvers/QueryResolver.ts +78 -95
  232. package/src/resolvers/ReportResolver.ts +2 -2
  233. package/src/resolvers/RunAIAgentResolver.ts +828 -818
  234. package/src/resolvers/RunAIPromptResolver.ts +709 -693
  235. package/src/resolvers/RunTemplateResolver.ts +103 -105
  236. package/src/resolvers/SqlLoggingConfigResolver.ts +72 -69
  237. package/src/resolvers/SyncDataResolver.ts +352 -386
  238. package/src/resolvers/SyncRolesUsersResolver.ts +350 -387
  239. package/src/resolvers/TaskResolver.ts +115 -110
  240. package/src/resolvers/TransactionGroupResolver.ts +138 -143
  241. package/src/resolvers/UserFavoriteResolver.ts +8 -17
  242. package/src/resolvers/UserViewResolver.ts +12 -17
  243. package/src/rest/EntityCRUDHandler.ts +268 -291
  244. package/src/rest/RESTEndpointHandler.ts +776 -782
  245. package/src/rest/ViewOperationsHandler.ts +195 -191
  246. package/src/scheduler/LearningCycleScheduler.ts +52 -8
  247. package/src/services/ScheduledJobsService.ts +132 -129
  248. package/src/services/TaskOrchestrator.ts +776 -792
  249. package/src/types.ts +9 -15
  250. package/src/util.ts +109 -112
@@ -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/global';
7
+ import { Metadata } from '@memberjunction/core';
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/global';
1
+ import { AuthProviderConfig } from '@memberjunction/core';
2
2
  import { IAuthProvider } from './IAuthProvider.js';
3
3
  import { BaseAuthProvider } from './BaseAuthProvider.js';
4
4
  import { MJGlobal } from '@memberjunction/global';
@@ -40,12 +40,16 @@ 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>(BaseAuthProvider, config.type.toLowerCase(), config);
44
-
43
+ const provider = MJGlobal.Instance.ClassFactory.CreateInstance<BaseAuthProvider>(
44
+ BaseAuthProvider,
45
+ config.type.toLowerCase(),
46
+ config
47
+ );
48
+
45
49
  if (!provider) {
46
50
  throw new Error(`No provider registered for type: ${config.type}`);
47
51
  }
48
-
52
+
49
53
  return provider;
50
54
  } catch (error) {
51
55
  const message = error instanceof Error ? error.message : String(error);
@@ -62,10 +66,10 @@ export class AuthProviderFactory {
62
66
  }
63
67
 
64
68
  this.providers.set(provider.name, provider);
65
-
69
+
66
70
  // Clear issuer cache when registering new provider
67
71
  this.issuerCache.clear();
68
-
72
+
69
73
  console.log(`Registered auth provider: ${provider.name} with issuer: ${provider.issuer}`);
70
74
  }
71
75
 
@@ -126,7 +130,9 @@ export class AuthProviderFactory {
126
130
  // Get all registrations for BaseAuthProvider from ClassFactory
127
131
  const registrations = MJGlobal.Instance.ClassFactory.GetAllRegistrations(BaseAuthProvider);
128
132
  // Extract unique keys (provider types) from registrations
129
- const providerTypes = registrations.map((reg) => reg.Key).filter((key): key is string => key !== null && key !== undefined);
133
+ const providerTypes = registrations
134
+ .map(reg => reg.Key)
135
+ .filter((key): key is string => key !== null && key !== undefined);
130
136
  // Return unique provider types
131
137
  return Array.from(new Set(providerTypes));
132
138
  }
@@ -143,4 +149,4 @@ export class AuthProviderFactory {
143
149
  return false;
144
150
  }
145
151
  }
146
- }
152
+ }
@@ -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/global';
3
+ import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/core';
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,8 +43,7 @@ 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
47
- .getSigningKey(header.kid)
46
+ this.jwksClient.getSigningKey(header.kid)
48
47
  .then((key) => {
49
48
  const signingKey = 'publicKey' in key ? key.publicKey : key.rsaPublicKey;
50
49
  callback(null, signingKey);
@@ -69,4 +68,4 @@ export abstract class BaseAuthProvider implements IAuthProvider {
69
68
  * Abstract method for extracting user info - must be implemented by each provider
70
69
  */
71
70
  abstract extractUserInfo(payload: JwtPayload): AuthUserInfo;
72
- }
71
+ }
@@ -1,5 +1,5 @@
1
1
  import { JwtHeader, JwtPayload, SigningKeyCallback } from 'jsonwebtoken';
2
- import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/global';
2
+ import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/core';
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/global';
2
+ import { Metadata, RunView, LogError, EntitySaveOptions } from '@memberjunction/core';
3
3
  import { NewUserBase } from './newUsers.js';
4
4
  import { UserCache } from '@memberjunction/sqlserver-dataprovider';
5
5
  import { configInfo } from '../config.js';
@@ -13,14 +13,7 @@ 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(
17
- firstName: string,
18
- lastName: string,
19
- email: string,
20
- linkedRecordType: string = 'None',
21
- linkedEntityId?: string,
22
- linkedEntityRecordId?: string
23
- ) {
16
+ public override async createNewUser(firstName: string, lastName: string, email: string, linkedRecordType: string = 'None', linkedEntityId?: string, linkedEntityRecordId?: string) {
24
17
  try {
25
18
  const md = new Metadata();
26
19
 
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/global';
5
+ import { Metadata, RoleInfo, UserInfo } from '@memberjunction/core';
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,21 +68,18 @@ 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
- {},
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
- },
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);
84
81
  }
85
- );
82
+ });
86
83
 
87
84
  export class UserPayload {
88
85
  aio?: string;
@@ -111,14 +108,14 @@ export class UserPayload {
111
108
  */
112
109
  export const getSigningKeys = (issuer: string) => (header: JwtHeader, cb: SigningKeyCallback) => {
113
110
  const factory = AuthProviderFactory.getInstance();
114
-
111
+
115
112
  // Initialize providers if not already done
116
113
  if (!factory.hasProviders()) {
117
114
  initializeAuthProviders();
118
115
  }
119
116
 
120
117
  const provider = factory.getByIssuer(issuer);
121
-
118
+
122
119
  if (!provider) {
123
120
  // Check if we have any providers at all
124
121
  if (!factory.hasProviders()) {
@@ -133,9 +130,7 @@ export const getSigningKeys = (issuer: string) => (header: JwtHeader, cb: Signin
133
130
  /**
134
131
  * Extracts user information from JWT payload using the appropriate provider
135
132
  */
136
- export const extractUserInfoFromPayload = (
137
- payload: JwtPayload
138
- ): {
133
+ export const extractUserInfoFromPayload = (payload: JwtPayload): {
139
134
  email?: string;
140
135
  firstName?: string;
141
136
  lastName?: string;
@@ -144,31 +139,31 @@ export const extractUserInfoFromPayload = (
144
139
  } => {
145
140
  const factory = AuthProviderFactory.getInstance();
146
141
  const issuer = payload.iss;
147
-
142
+
148
143
  if (!issuer) {
149
144
  // Fallback to default extraction
150
145
  const preferredUsername = payload.preferred_username as string | undefined;
151
146
  return {
152
- email: (payload.email as string | undefined) || preferredUsername,
147
+ email: payload.email as string | undefined || preferredUsername,
153
148
  firstName: payload.given_name as string | undefined,
154
149
  lastName: payload.family_name as string | undefined,
155
150
  fullName: payload.name as string | undefined,
156
- preferredUsername,
151
+ preferredUsername
157
152
  };
158
153
  }
159
154
 
160
155
  const provider = factory.getByIssuer(issuer);
161
-
156
+
162
157
  if (!provider) {
163
158
  // Fallback to default extraction
164
159
  const fullName = payload.name as string | undefined;
165
160
  const preferredUsername = payload.preferred_username as string | undefined;
166
161
  return {
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],
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],
170
165
  fullName,
171
- preferredUsername,
166
+ preferredUsername
172
167
  };
173
168
  }
174
169
 
@@ -272,4 +267,4 @@ export const verifyUserRecord = async (
272
267
  };
273
268
 
274
269
  // Initialize providers on module load
275
- initializeAuthProviders();
270
+ initializeAuthProviders();
@@ -1,5 +1,5 @@
1
1
  import { configInfo } from '../config.js';
2
- import { AuthProviderConfig, LogError, LogStatus } from '@memberjunction/global';
2
+ import { AuthProviderConfig, LogError, LogStatus } from '@memberjunction/core';
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,174 +1,142 @@
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';
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";
22
6
 
23
7
  export class NewUserBase {
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;
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);
139
15
  }
140
16
 
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
- }
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;
161
44
  }
162
- } else {
163
- LogError(`Failed to create User Application ${appName} for new user ${user.Name}:`, undefined, userApplication.LatestResult);
164
- }
165
- }
166
- }
167
45
 
168
- return user;
169
- } catch (e) {
170
- LogError(e);
171
- return undefined;
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
+ }
76
+ }
77
+
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
+ }
133
+ }
134
+
135
+ return user;
136
+ }
137
+ catch (e) {
138
+ LogError(e);
139
+ return undefined;
140
+ }
172
141
  }
173
- }
174
142
  }
@@ -1,6 +1,6 @@
1
1
  import { JwtPayload } from 'jsonwebtoken';
2
2
  import { RegisterClass } from '@memberjunction/global';
3
- import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/global';
3
+ import { AuthProviderConfig, AuthUserInfo } from '@memberjunction/core';
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
+ }