@memberjunction/server 2.111.1 → 2.112.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +808 -951
- 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 +53 -43
- 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 +1 -3
- 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 +3 -2
- 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 +3 -6
- 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 +22 -10
- 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 +9 -7
- 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 +648 -648
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2986 -1133
- 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 +15 -10
- 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 +18 -9
- 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 +28 -30
- 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 +60 -50
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +36 -38
- 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 +43 -40
- 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 +8 -6
- 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 +27 -28
- 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 +15 -14
- 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 +48 -44
- 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 +14 -16
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +23 -25
- 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 +17 -21
- 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 +4 -6
- 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 +0 -1
- 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 +36 -37
- package/src/agents/skip-agent.ts +1067 -1200
- package/src/agents/skip-sdk.ts +877 -851
- package/src/apolloServer/index.ts +2 -2
- package/src/auth/AuthProviderFactory.ts +8 -14
- package/src/auth/BaseAuthProvider.ts +5 -4
- package/src/auth/IAuthProvider.ts +2 -2
- package/src/auth/exampleNewUserSubClass.ts +9 -2
- package/src/auth/index.ts +31 -26
- package/src/auth/initializeProviders.ts +3 -3
- package/src/auth/newUsers.ts +166 -134
- package/src/auth/providers/Auth0Provider.ts +5 -5
- package/src/auth/providers/CognitoProvider.ts +7 -10
- package/src/auth/providers/GoogleProvider.ts +4 -5
- package/src/auth/providers/MSALProvider.ts +5 -5
- package/src/auth/providers/OktaProvider.ts +6 -7
- package/src/config.ts +63 -54
- package/src/context.ts +42 -30
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +48130 -39930
- package/src/generic/KeyInputOutputTypes.ts +3 -6
- package/src/generic/ResolverBase.ts +119 -78
- package/src/generic/RunViewResolver.ts +27 -23
- package/src/index.ts +66 -42
- package/src/resolvers/ActionResolver.ts +46 -57
- package/src/resolvers/AskSkipResolver.ts +607 -533
- package/src/resolvers/ComponentRegistryResolver.ts +547 -562
- package/src/resolvers/CreateQueryResolver.ts +683 -655
- package/src/resolvers/DatasetResolver.ts +5 -6
- package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
- package/src/resolvers/EntityRecordNameResolver.ts +9 -5
- package/src/resolvers/EntityResolver.ts +9 -7
- package/src/resolvers/FileCategoryResolver.ts +2 -2
- package/src/resolvers/FileResolver.ts +4 -4
- package/src/resolvers/GetDataContextDataResolver.ts +106 -118
- package/src/resolvers/GetDataResolver.ts +194 -205
- package/src/resolvers/MergeRecordsResolver.ts +5 -5
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +95 -78
- package/src/resolvers/ReportResolver.ts +2 -2
- package/src/resolvers/RunAIAgentResolver.ts +818 -828
- package/src/resolvers/RunAIPromptResolver.ts +693 -709
- package/src/resolvers/RunTemplateResolver.ts +105 -103
- package/src/resolvers/SqlLoggingConfigResolver.ts +69 -72
- package/src/resolvers/SyncDataResolver.ts +386 -352
- package/src/resolvers/SyncRolesUsersResolver.ts +387 -350
- package/src/resolvers/TaskResolver.ts +110 -115
- package/src/resolvers/TransactionGroupResolver.ts +143 -138
- package/src/resolvers/UserFavoriteResolver.ts +17 -8
- package/src/resolvers/UserViewResolver.ts +17 -12
- package/src/rest/EntityCRUDHandler.ts +291 -268
- package/src/rest/RESTEndpointHandler.ts +782 -776
- package/src/rest/ViewOperationsHandler.ts +191 -195
- package/src/scheduler/LearningCycleScheduler.ts +8 -52
- package/src/services/ScheduledJobsService.ts +129 -132
- package/src/services/TaskOrchestrator.ts +792 -776
- package/src/types.ts +15 -9
- 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/
|
|
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/
|
|
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
|
-
|
|
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/
|
|
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
|
|
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/
|
|
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/
|
|
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(
|
|
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/
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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 = (
|
|
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/
|
|
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
|
+
}
|
package/src/auth/newUsers.ts
CHANGED
|
@@ -1,142 +1,174 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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/
|
|
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
|
+
}
|