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