@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
|
@@ -1,9 +1,8 @@
|
|
|
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
|
-
|
|
7
6
|
/**
|
|
8
7
|
* AWS Cognito authentication provider implementation
|
|
9
8
|
*/
|
|
@@ -18,21 +17,19 @@ export class CognitoProvider extends BaseAuthProvider {
|
|
|
18
17
|
*/
|
|
19
18
|
extractUserInfo(payload: JwtPayload): AuthUserInfo {
|
|
20
19
|
// Cognito uses custom claims with 'cognito:' prefix for some fields
|
|
21
|
-
const email = payload.email as string | undefined ||
|
|
22
|
-
payload['cognito:username'] as string | undefined;
|
|
20
|
+
const email = (payload.email as string | undefined) || (payload['cognito:username'] as string | undefined);
|
|
23
21
|
const fullName = payload.name as string | undefined;
|
|
24
22
|
const firstName = payload.given_name as string | undefined;
|
|
25
23
|
const lastName = payload.family_name as string | undefined;
|
|
26
|
-
const preferredUsername =
|
|
27
|
-
|
|
28
|
-
email;
|
|
24
|
+
const preferredUsername =
|
|
25
|
+
(payload['cognito:username'] as string | undefined) || (payload.preferred_username as string | undefined) || email;
|
|
29
26
|
|
|
30
27
|
return {
|
|
31
28
|
email,
|
|
32
29
|
firstName: firstName || fullName?.split(' ')[0],
|
|
33
30
|
lastName: lastName || fullName?.split(' ')[1] || fullName?.split(' ')[0],
|
|
34
31
|
fullName,
|
|
35
|
-
preferredUsername
|
|
32
|
+
preferredUsername,
|
|
36
33
|
};
|
|
37
34
|
}
|
|
38
35
|
|
|
@@ -44,7 +41,7 @@ export class CognitoProvider extends BaseAuthProvider {
|
|
|
44
41
|
const hasClientId = !!this.config.clientId;
|
|
45
42
|
const hasRegion = !!this.config.region;
|
|
46
43
|
const hasUserPoolId = !!this.config.userPoolId;
|
|
47
|
-
|
|
44
|
+
|
|
48
45
|
return baseValid && hasClientId && hasRegion && hasUserPoolId;
|
|
49
46
|
}
|
|
50
|
-
}
|
|
47
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
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
|
-
|
|
7
6
|
/**
|
|
8
7
|
* Google Identity Platform authentication provider implementation
|
|
9
8
|
*/
|
|
@@ -29,7 +28,7 @@ export class GoogleProvider extends BaseAuthProvider {
|
|
|
29
28
|
firstName: firstName || fullName?.split(' ')[0],
|
|
30
29
|
lastName: lastName || fullName?.split(' ')[1] || fullName?.split(' ')[0],
|
|
31
30
|
fullName,
|
|
32
|
-
preferredUsername
|
|
31
|
+
preferredUsername,
|
|
33
32
|
};
|
|
34
33
|
}
|
|
35
34
|
|
|
@@ -39,7 +38,7 @@ export class GoogleProvider extends BaseAuthProvider {
|
|
|
39
38
|
validateConfig(): boolean {
|
|
40
39
|
const baseValid = super.validateConfig();
|
|
41
40
|
const hasClientId = !!this.config.clientId;
|
|
42
|
-
|
|
41
|
+
|
|
43
42
|
return baseValid && hasClientId;
|
|
44
43
|
}
|
|
45
|
-
}
|
|
44
|
+
}
|
|
@@ -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
|
/**
|
|
@@ -17,7 +17,7 @@ export class MSALProvider extends BaseAuthProvider {
|
|
|
17
17
|
*/
|
|
18
18
|
extractUserInfo(payload: JwtPayload): AuthUserInfo {
|
|
19
19
|
// MSAL/Azure AD uses some custom claims
|
|
20
|
-
const email = payload.email as string | undefined || payload.preferred_username as string | undefined;
|
|
20
|
+
const email = (payload.email as string | undefined) || (payload.preferred_username as string | undefined);
|
|
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;
|
|
@@ -28,7 +28,7 @@ export class MSALProvider extends BaseAuthProvider {
|
|
|
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 MSALProvider extends BaseAuthProvider {
|
|
|
39
39
|
const baseValid = super.validateConfig();
|
|
40
40
|
const hasClientId = !!this.config.clientId;
|
|
41
41
|
const hasTenantId = !!this.config.tenantId;
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
return baseValid && hasClientId && hasTenantId;
|
|
44
44
|
}
|
|
45
|
-
}
|
|
45
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
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
|
-
|
|
7
6
|
/**
|
|
8
7
|
* Okta authentication provider implementation
|
|
9
8
|
*/
|
|
@@ -18,18 +17,18 @@ export class OktaProvider extends BaseAuthProvider {
|
|
|
18
17
|
*/
|
|
19
18
|
extractUserInfo(payload: JwtPayload): AuthUserInfo {
|
|
20
19
|
// Okta uses standard OIDC claims plus some custom ones
|
|
21
|
-
const email = payload.email as string | undefined || payload.preferred_username as string | undefined;
|
|
20
|
+
const email = (payload.email as string | undefined) || (payload.preferred_username as string | undefined);
|
|
22
21
|
const fullName = payload.name as string | undefined;
|
|
23
22
|
const firstName = payload.given_name as string | undefined;
|
|
24
23
|
const lastName = payload.family_name as string | undefined;
|
|
25
|
-
const preferredUsername = payload.preferred_username as string | undefined || email;
|
|
24
|
+
const preferredUsername = (payload.preferred_username as string | undefined) || email;
|
|
26
25
|
|
|
27
26
|
return {
|
|
28
27
|
email,
|
|
29
28
|
firstName: firstName || fullName?.split(' ')[0],
|
|
30
29
|
lastName: lastName || fullName?.split(' ')[1] || fullName?.split(' ')[0],
|
|
31
30
|
fullName,
|
|
32
|
-
preferredUsername
|
|
31
|
+
preferredUsername,
|
|
33
32
|
};
|
|
34
33
|
}
|
|
35
34
|
|
|
@@ -40,7 +39,7 @@ export class OktaProvider extends BaseAuthProvider {
|
|
|
40
39
|
const baseValid = super.validateConfig();
|
|
41
40
|
const hasClientId = !!this.config.clientId;
|
|
42
41
|
const hasDomain = !!this.config.domain;
|
|
43
|
-
|
|
42
|
+
|
|
44
43
|
return baseValid && hasClientId && hasDomain;
|
|
45
44
|
}
|
|
46
|
-
}
|
|
45
|
+
}
|
package/src/config.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { cosmiconfigSync } from 'cosmiconfig';
|
|
3
|
-
import { LogError, LogStatus } from '@memberjunction/
|
|
3
|
+
import { LogError, LogStatus } from '@memberjunction/global';
|
|
4
4
|
|
|
5
5
|
const explorer = cosmiconfigSync('mj', { searchStrategy: 'global' });
|
|
6
6
|
|
|
@@ -22,14 +22,17 @@ const databaseSettingsInfoSchema = z.object({
|
|
|
22
22
|
metadataCacheRefreshInterval: z.number(),
|
|
23
23
|
dbReadOnlyUsername: z.string().optional(),
|
|
24
24
|
dbReadOnlyPassword: z.string().optional(),
|
|
25
|
-
connectionPool: z
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
connectionPool: z
|
|
26
|
+
.object({
|
|
27
|
+
max: z.number().optional().default(50),
|
|
28
|
+
min: z.number().optional().default(5),
|
|
29
|
+
idleTimeoutMillis: z.number().optional().default(30000),
|
|
30
|
+
acquireTimeoutMillis: z.number().optional().default(30000),
|
|
31
|
+
})
|
|
32
|
+
.optional()
|
|
33
|
+
.default({}),
|
|
31
34
|
});
|
|
32
|
-
|
|
35
|
+
|
|
33
36
|
const viewingSystemInfoSchema = z.object({
|
|
34
37
|
enableSmartFilters: z.boolean().optional(),
|
|
35
38
|
});
|
|
@@ -44,28 +47,25 @@ const restApiOptionsSchema = z.object({
|
|
|
44
47
|
|
|
45
48
|
/**
|
|
46
49
|
* Returns a new Zod object that accepts boolean, string, or number values and transforms them to boolean.
|
|
47
|
-
* @returns
|
|
50
|
+
* @returns
|
|
48
51
|
*/
|
|
49
52
|
const zodBooleanWithTransforms = () => {
|
|
50
53
|
return z
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
})
|
|
68
|
-
}
|
|
54
|
+
.union([z.boolean(), z.string(), z.number()])
|
|
55
|
+
.optional()
|
|
56
|
+
.default(false)
|
|
57
|
+
.transform((v) => {
|
|
58
|
+
if (typeof v === 'string') {
|
|
59
|
+
return v === '1' || v.toLowerCase() === 'true';
|
|
60
|
+
} else if (typeof v === 'number') {
|
|
61
|
+
return v === 1;
|
|
62
|
+
} else if (typeof v === 'boolean') {
|
|
63
|
+
return v;
|
|
64
|
+
} else {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
69
|
|
|
70
70
|
const askSkipInfoSchema = z.object({
|
|
71
71
|
url: z.string().optional(), // Base URL for Skip API
|
|
@@ -103,32 +103,38 @@ const sqlLoggingSchema = z.object({
|
|
|
103
103
|
sessionTimeout: z.number().optional().default(3600000), // 1 hour
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
-
const authProviderSchema = z
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
106
|
+
const authProviderSchema = z
|
|
107
|
+
.object({
|
|
108
|
+
name: z.string(),
|
|
109
|
+
type: z.string(),
|
|
110
|
+
issuer: z.string(),
|
|
111
|
+
audience: z.string(),
|
|
112
|
+
jwksUri: z.string(),
|
|
113
|
+
clientId: z.string().optional(),
|
|
114
|
+
clientSecret: z.string().optional(),
|
|
115
|
+
tenantId: z.string().optional(),
|
|
116
|
+
domain: z.string().optional(),
|
|
117
|
+
})
|
|
118
|
+
.passthrough(); // Allow additional provider-specific fields
|
|
119
|
+
|
|
120
|
+
const componentRegistrySchema = z
|
|
121
|
+
.object({
|
|
122
|
+
id: z.string().optional(),
|
|
123
|
+
name: z.string().optional(),
|
|
124
|
+
apiKey: z.string().optional(),
|
|
125
|
+
cache: z.boolean().optional().default(true),
|
|
126
|
+
timeout: z.number().optional(),
|
|
127
|
+
retryPolicy: z
|
|
128
|
+
.object({
|
|
129
|
+
maxRetries: z.number().optional(),
|
|
130
|
+
initialDelay: z.number().optional(),
|
|
131
|
+
maxDelay: z.number().optional(),
|
|
132
|
+
backoffMultiplier: z.number().optional(),
|
|
133
|
+
})
|
|
134
|
+
.optional(),
|
|
135
|
+
headers: z.record(z.string()).optional(),
|
|
136
|
+
})
|
|
137
|
+
.passthrough(); // Allow additional fields
|
|
132
138
|
|
|
133
139
|
const scheduledJobsSchema = z.object({
|
|
134
140
|
enabled: z.boolean().optional().default(false),
|
|
@@ -151,7 +157,10 @@ const configInfoSchema = z.object({
|
|
|
151
157
|
|
|
152
158
|
apiKey: z.string().optional(),
|
|
153
159
|
baseUrl: z.string().default('http://localhost'),
|
|
154
|
-
publicUrl: z
|
|
160
|
+
publicUrl: z
|
|
161
|
+
.string()
|
|
162
|
+
.optional()
|
|
163
|
+
.default(process.env.MJAPI_PUBLIC_URL || ''), // Public URL for callbacks (e.g., ngrok URL when developing)
|
|
155
164
|
|
|
156
165
|
dbHost: z.string().default('localhost'),
|
|
157
166
|
dbDatabase: z.string(),
|
package/src/context.ts
CHANGED
|
@@ -5,22 +5,29 @@ import 'reflect-metadata';
|
|
|
5
5
|
import { Subject, firstValueFrom } from 'rxjs';
|
|
6
6
|
import { AuthenticationError, AuthorizationError } from 'type-graphql';
|
|
7
7
|
import sql from 'mssql';
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
getSigningKeys,
|
|
10
|
+
getSystemUser,
|
|
11
|
+
getValidationOptions,
|
|
12
|
+
verifyUserRecord,
|
|
13
|
+
extractUserInfoFromPayload,
|
|
14
|
+
TokenExpiredError,
|
|
15
|
+
} from './auth/index.js';
|
|
9
16
|
import { authCache } from './cache.js';
|
|
10
17
|
import { userEmailMap, apiKey, mj_core_schema } from './config.js';
|
|
11
18
|
import { DataSourceInfo, UserPayload } from './types.js';
|
|
12
19
|
import { GetReadOnlyDataSource, GetReadWriteDataSource } from './util.js';
|
|
13
20
|
import { v4 as uuidv4 } from 'uuid';
|
|
14
21
|
import e from 'express';
|
|
15
|
-
import { DatabaseProviderBase } from '@memberjunction/
|
|
22
|
+
import { DatabaseProviderBase } from '@memberjunction/global';
|
|
16
23
|
import { SQLServerDataProvider, SQLServerProviderConfigData } from '@memberjunction/sqlserver-dataprovider';
|
|
17
24
|
import { AuthProviderFactory } from './auth/AuthProviderFactory.js';
|
|
18
|
-
import { Metadata } from '@memberjunction/
|
|
25
|
+
import { Metadata } from '@memberjunction/global';
|
|
19
26
|
|
|
20
27
|
const verifyAsync = async (issuer: string, token: string): Promise<jwt.JwtPayload> =>
|
|
21
28
|
new Promise((resolve, reject) => {
|
|
22
29
|
const options = getValidationOptions(issuer);
|
|
23
|
-
|
|
30
|
+
|
|
24
31
|
if (!options) {
|
|
25
32
|
reject(new Error(`No validation options found for issuer ${issuer}`));
|
|
26
33
|
return;
|
|
@@ -46,7 +53,7 @@ export const getUserPayload = async (
|
|
|
46
53
|
sessionId = 'default',
|
|
47
54
|
dataSources: DataSourceInfo[],
|
|
48
55
|
requestDomain?: string,
|
|
49
|
-
requestApiKey?: string
|
|
56
|
+
requestApiKey?: string
|
|
50
57
|
): Promise<UserPayload> => {
|
|
51
58
|
try {
|
|
52
59
|
const readOnlyDataSource = GetReadOnlyDataSource(dataSources, { allowFallbackToReadWrite: true });
|
|
@@ -105,14 +112,8 @@ export const getUserPayload = async (
|
|
|
105
112
|
// Use provider to extract user information
|
|
106
113
|
const userInfo = extractUserInfoFromPayload(payload);
|
|
107
114
|
const email = userInfo.email ? ((userEmailMap ?? {})[userInfo.email] ?? userInfo.email) : userInfo.preferredUsername;
|
|
108
|
-
|
|
109
|
-
const userRecord = await verifyUserRecord(
|
|
110
|
-
email,
|
|
111
|
-
userInfo.firstName,
|
|
112
|
-
userInfo.lastName,
|
|
113
|
-
requestDomain,
|
|
114
|
-
readWriteDataSource
|
|
115
|
-
);
|
|
115
|
+
|
|
116
|
+
const userRecord = await verifyUserRecord(email, userInfo.firstName, userInfo.lastName, requestDomain, readWriteDataSource);
|
|
116
117
|
|
|
117
118
|
if (!userRecord) {
|
|
118
119
|
console.error(`User ${email} not found`);
|
|
@@ -133,7 +134,15 @@ export const getUserPayload = async (
|
|
|
133
134
|
};
|
|
134
135
|
|
|
135
136
|
export const contextFunction =
|
|
136
|
-
({
|
|
137
|
+
({
|
|
138
|
+
setupComplete$,
|
|
139
|
+
dataSource,
|
|
140
|
+
dataSources,
|
|
141
|
+
}: {
|
|
142
|
+
setupComplete$: Subject<unknown>;
|
|
143
|
+
dataSource: sql.ConnectionPool;
|
|
144
|
+
dataSources: DataSourceInfo[];
|
|
145
|
+
}) =>
|
|
137
146
|
async ({ req }: { req: IncomingMessage }) => {
|
|
138
147
|
await firstValueFrom(setupComplete$); // wait for setup to complete before processing the request
|
|
139
148
|
|
|
@@ -143,7 +152,7 @@ export const contextFunction =
|
|
|
143
152
|
const sessionId = sessionIdRaw ? sessionIdRaw.toString() : '';
|
|
144
153
|
const bearerToken = req.headers.authorization ?? '';
|
|
145
154
|
const apiKey = String(req.headers['x-mj-api-key']);
|
|
146
|
-
|
|
155
|
+
|
|
147
156
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
148
157
|
const reqAny = req as any;
|
|
149
158
|
const operationName: string | undefined = reqAny.body?.operationName;
|
|
@@ -156,11 +165,13 @@ export const contextFunction =
|
|
|
156
165
|
sessionId,
|
|
157
166
|
dataSources,
|
|
158
167
|
requestDomain?.hostname ? requestDomain.hostname : undefined,
|
|
159
|
-
apiKey
|
|
168
|
+
apiKey
|
|
160
169
|
);
|
|
161
170
|
|
|
162
|
-
if (Metadata.Provider.Entities.length === 0
|
|
163
|
-
console.warn(
|
|
171
|
+
if (Metadata.Provider.Entities.length === 0) {
|
|
172
|
+
console.warn(
|
|
173
|
+
'WARNING: No entities found in global/shared metadata, this can often be due to the use of **global** Metadata/RunView/DB Providers in a multi-user environment. Check your code to make sure you are using the providers passed to you in AppContext by MJServer and not calling new Metadata() new RunView() new RunQuery() and similar patterns as those are unstable at times in multi-user server environments!!!'
|
|
174
|
+
);
|
|
164
175
|
}
|
|
165
176
|
|
|
166
177
|
// now create a new instance of SQLServerDataProvider for each request
|
|
@@ -176,28 +187,29 @@ export const contextFunction =
|
|
|
176
187
|
const rConfig = new SQLServerProviderConfigData(readOnlyDataSource, mj_core_schema, 0, undefined, undefined, false);
|
|
177
188
|
await rp.Config(rConfig);
|
|
178
189
|
}
|
|
179
|
-
}
|
|
180
|
-
catch (e) {
|
|
190
|
+
} catch (e) {
|
|
181
191
|
// no read only data source available, so rp will remain null, this is OK!
|
|
182
192
|
}
|
|
183
193
|
|
|
184
|
-
const providers = [
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
194
|
+
const providers = [
|
|
195
|
+
{
|
|
196
|
+
provider: p,
|
|
197
|
+
type: 'Read-Write' as 'Read-Write' | 'Read-Only',
|
|
198
|
+
},
|
|
199
|
+
];
|
|
188
200
|
if (rp) {
|
|
189
201
|
providers.push({
|
|
190
202
|
provider: rp,
|
|
191
|
-
type: 'Read-Only' as 'Read-Write' | 'Read-Only'
|
|
203
|
+
type: 'Read-Only' as 'Read-Write' | 'Read-Only',
|
|
192
204
|
});
|
|
193
205
|
}
|
|
194
206
|
|
|
195
|
-
const contextResult = {
|
|
196
|
-
dataSource,
|
|
197
|
-
dataSources,
|
|
207
|
+
const contextResult = {
|
|
208
|
+
dataSource,
|
|
209
|
+
dataSources,
|
|
198
210
|
userPayload: userPayload,
|
|
199
211
|
providers,
|
|
200
212
|
};
|
|
201
|
-
|
|
213
|
+
|
|
202
214
|
return contextResult;
|
|
203
|
-
};
|
|
215
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { RegisterClass } from '@memberjunction/global';
|
|
2
|
-
import { BaseEntity, EntityDeleteOptions, EntitySaveOptions } from '@memberjunction/
|
|
2
|
+
import { BaseEntity, EntityDeleteOptions, EntitySaveOptions } from '@memberjunction/global';
|
|
3
3
|
import { EntityPermissionEntity } from '@memberjunction/core-entities';
|
|
4
4
|
import axios from 'axios';
|
|
5
5
|
import { ___codeGenAPIPort, ___codeGenAPISubmissionDelay, ___codeGenAPIURL } from '../config.js';
|
|
@@ -7,7 +7,7 @@ import { ___codeGenAPIPort, ___codeGenAPISubmissionDelay, ___codeGenAPIURL } fro
|
|
|
7
7
|
/**
|
|
8
8
|
* Server-side only class that extends the entity permissions object to watch for changes to entity permissions, build a queue of entities that have been changed, and then from time to time, submit
|
|
9
9
|
* them to an API server that will execute the underlying permission changes at the database level.
|
|
10
|
-
*
|
|
10
|
+
*
|
|
11
11
|
* This class is within the memberjunction/server package because it is closely coupled to other aspects of what
|
|
12
12
|
* happens in the server. That's why it is not in the core-entities-server package.
|
|
13
13
|
*/
|
|
@@ -104,4 +104,4 @@ export class EntityPermissionsEntity_Server extends EntityPermissionEntity {
|
|
|
104
104
|
}
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
-
export function LoadEntityPermissionsServerSubClass() {}
|
|
107
|
+
export function LoadEntityPermissionsServerSubClass() {}
|