@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.
- package/dist/agents/skip-agent.d.ts +4 -4
- package/dist/agents/skip-agent.d.ts.map +1 -1
- package/dist/agents/skip-agent.js +951 -808
- package/dist/agents/skip-agent.js.map +1 -1
- package/dist/agents/skip-sdk.d.ts +1 -1
- package/dist/agents/skip-sdk.d.ts.map +1 -1
- package/dist/agents/skip-sdk.js +43 -53
- package/dist/agents/skip-sdk.js.map +1 -1
- package/dist/apolloServer/index.js +1 -1
- package/dist/auth/AuthProviderFactory.d.ts +1 -1
- package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
- package/dist/auth/AuthProviderFactory.js +3 -1
- package/dist/auth/AuthProviderFactory.js.map +1 -1
- package/dist/auth/BaseAuthProvider.d.ts +1 -1
- package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
- package/dist/auth/BaseAuthProvider.js +2 -3
- package/dist/auth/BaseAuthProvider.js.map +1 -1
- package/dist/auth/IAuthProvider.d.ts +1 -1
- package/dist/auth/IAuthProvider.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.js +1 -1
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +6 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.js +1 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/newUsers.d.ts +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +7 -7
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
- package/dist/auth/providers/Auth0Provider.js +1 -1
- package/dist/auth/providers/Auth0Provider.js.map +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
- package/dist/auth/providers/CognitoProvider.js +6 -3
- package/dist/auth/providers/CognitoProvider.js.map +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
- package/dist/auth/providers/GoogleProvider.js +1 -1
- package/dist/auth/providers/GoogleProvider.js.map +1 -1
- package/dist/auth/providers/MSALProvider.d.ts +1 -1
- package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
- package/dist/auth/providers/MSALProvider.js +1 -1
- package/dist/auth/providers/MSALProvider.js.map +1 -1
- package/dist/auth/providers/OktaProvider.d.ts +1 -1
- package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
- package/dist/auth/providers/OktaProvider.js +1 -1
- package/dist/auth/providers/OktaProvider.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -22
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +7 -9
- package/dist/context.js.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
- package/dist/generated/generated.d.ts +788 -658
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2050 -3054
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
- package/dist/generic/KeyInputOutputTypes.js +1 -1
- package/dist/generic/KeyInputOutputTypes.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +1 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +10 -15
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +15 -15
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -18
- package/dist/index.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +2 -2
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +30 -28
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.d.ts +2 -2
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
- package/dist/resolvers/AskSkipResolver.js +50 -60
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +38 -36
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +40 -43
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +1 -1
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/EntityResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityResolver.js +1 -1
- package/dist/resolvers/EntityResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -1
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +1 -1
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +5 -5
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +6 -8
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +3 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +11 -11
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/ReportResolver.js +1 -1
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +28 -27
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +31 -31
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +9 -9
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +14 -15
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +44 -48
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/TaskResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskResolver.js +7 -7
- package/dist/resolvers/TaskResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +12 -12
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +1 -1
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +16 -14
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +25 -23
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +21 -17
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
- package/dist/services/ScheduledJobsService.d.ts.map +1 -1
- package/dist/services/ScheduledJobsService.js +6 -4
- package/dist/services/ScheduledJobsService.js.map +1 -1
- package/dist/services/TaskOrchestrator.d.ts +1 -1
- package/dist/services/TaskOrchestrator.d.ts.map +1 -1
- package/dist/services/TaskOrchestrator.js +30 -30
- package/dist/services/TaskOrchestrator.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/package.json +39 -36
- package/src/agents/skip-agent.ts +1200 -1067
- package/src/agents/skip-sdk.ts +851 -877
- package/src/apolloServer/index.ts +2 -2
- package/src/auth/AuthProviderFactory.ts +14 -8
- package/src/auth/BaseAuthProvider.ts +4 -5
- package/src/auth/IAuthProvider.ts +2 -2
- package/src/auth/exampleNewUserSubClass.ts +2 -9
- package/src/auth/index.ts +26 -31
- package/src/auth/initializeProviders.ts +3 -3
- package/src/auth/newUsers.ts +134 -166
- package/src/auth/providers/Auth0Provider.ts +5 -5
- package/src/auth/providers/CognitoProvider.ts +10 -7
- package/src/auth/providers/GoogleProvider.ts +5 -4
- package/src/auth/providers/MSALProvider.ts +5 -5
- package/src/auth/providers/OktaProvider.ts +7 -6
- package/src/config.ts +54 -63
- package/src/context.ts +30 -42
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +40442 -48106
- package/src/generic/KeyInputOutputTypes.ts +6 -3
- package/src/generic/ResolverBase.ts +78 -119
- package/src/generic/RunViewResolver.ts +23 -27
- package/src/index.ts +48 -66
- package/src/resolvers/ActionResolver.ts +57 -46
- package/src/resolvers/AskSkipResolver.ts +533 -607
- package/src/resolvers/ComponentRegistryResolver.ts +562 -547
- package/src/resolvers/CreateQueryResolver.ts +655 -683
- package/src/resolvers/DatasetResolver.ts +6 -5
- package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
- package/src/resolvers/EntityRecordNameResolver.ts +5 -9
- package/src/resolvers/EntityResolver.ts +7 -9
- package/src/resolvers/FileCategoryResolver.ts +2 -2
- package/src/resolvers/FileResolver.ts +4 -4
- package/src/resolvers/GetDataContextDataResolver.ts +118 -106
- package/src/resolvers/GetDataResolver.ts +205 -194
- package/src/resolvers/MergeRecordsResolver.ts +5 -5
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +78 -95
- package/src/resolvers/ReportResolver.ts +2 -2
- package/src/resolvers/RunAIAgentResolver.ts +828 -818
- package/src/resolvers/RunAIPromptResolver.ts +709 -693
- package/src/resolvers/RunTemplateResolver.ts +103 -105
- package/src/resolvers/SqlLoggingConfigResolver.ts +72 -69
- package/src/resolvers/SyncDataResolver.ts +352 -386
- package/src/resolvers/SyncRolesUsersResolver.ts +350 -387
- package/src/resolvers/TaskResolver.ts +115 -110
- package/src/resolvers/TransactionGroupResolver.ts +138 -143
- package/src/resolvers/UserFavoriteResolver.ts +8 -17
- package/src/resolvers/UserViewResolver.ts +12 -17
- package/src/rest/EntityCRUDHandler.ts +268 -291
- package/src/rest/RESTEndpointHandler.ts +776 -782
- package/src/rest/ViewOperationsHandler.ts +195 -191
- package/src/scheduler/LearningCycleScheduler.ts +52 -8
- package/src/services/ScheduledJobsService.ts +132 -129
- package/src/services/TaskOrchestrator.ts +776 -792
- package/src/types.ts +9 -15
- 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/
|
|
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/
|
|
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>(
|
|
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
|
|
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/
|
|
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
|
|
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/
|
|
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/
|
|
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/
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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:
|
|
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:
|
|
168
|
-
firstName:
|
|
169
|
-
lastName:
|
|
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/
|
|
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
|
+
}
|
package/src/auth/newUsers.ts
CHANGED
|
@@ -1,174 +1,142 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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/
|
|
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 =
|
|
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
|
+
}
|