@memberjunction/server 2.111.0 → 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,275 +1,264 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, InputType, ObjectType, Query } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
|
-
import { LogError, LogStatus, Metadata } from '@memberjunction/
|
|
3
|
+
import { LogError, LogStatus, Metadata } from '@memberjunction/global';
|
|
4
4
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
5
5
|
import { v4 as uuidv4 } from 'uuid';
|
|
6
6
|
import { GetReadOnlyDataSource, GetReadOnlyProvider } from '../util.js';
|
|
7
7
|
import sql from 'mssql';
|
|
8
|
-
|
|
9
|
-
@InputType()
|
|
8
|
+
|
|
9
|
+
@InputType()
|
|
10
10
|
export class GetDataInputType {
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
@Field(() => String)
|
|
12
|
+
Token: string;
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
@Field(() => [String])
|
|
15
|
+
Queries: string[];
|
|
16
16
|
}
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
|
|
19
18
|
@ObjectType()
|
|
20
19
|
export class GetDataOutputType {
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
@Field(() => Boolean)
|
|
21
|
+
Success: boolean;
|
|
23
22
|
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
@Field(() => [String])
|
|
24
|
+
Queries: string[];
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
@Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
|
|
27
|
+
ErrorMessages: (string | null)[];
|
|
29
28
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Each query's results will be converted to JSON and returned as a string
|
|
31
|
+
*/
|
|
32
|
+
@Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
|
|
33
|
+
Results: (string | null)[];
|
|
35
34
|
}
|
|
36
|
-
|
|
35
|
+
|
|
37
36
|
@ObjectType()
|
|
38
37
|
export class SimpleEntityResultType {
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
@Field(() => Boolean)
|
|
39
|
+
Success: boolean;
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
@Field(() => String, { nullable: true })
|
|
42
|
+
ErrorMessage?: string;
|
|
44
43
|
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
@Field(() => [SimpleEntityOutputType])
|
|
45
|
+
Results: SimpleEntityOutputType[];
|
|
47
46
|
}
|
|
48
47
|
|
|
49
48
|
@ObjectType()
|
|
50
49
|
export class SimpleEntityOutputType {
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
@Field(() => String)
|
|
51
|
+
ID: string;
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
@Field(() => String)
|
|
54
|
+
Name: string;
|
|
56
55
|
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
@Field(() => String, { nullable: true })
|
|
57
|
+
Description?: string;
|
|
59
58
|
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
@Field(() => String)
|
|
60
|
+
SchemaName: string;
|
|
62
61
|
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
@Field(() => String)
|
|
63
|
+
BaseView: string;
|
|
65
64
|
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
@Field(() => String)
|
|
66
|
+
BaseTable: string;
|
|
68
67
|
|
|
69
|
-
|
|
70
|
-
|
|
68
|
+
@Field(() => String, { nullable: true })
|
|
69
|
+
CodeName?: string;
|
|
71
70
|
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
@Field(() => String, { nullable: true })
|
|
72
|
+
ClassName?: string;
|
|
74
73
|
|
|
75
|
-
|
|
76
|
-
|
|
74
|
+
@Field(() => [SimpleEntityFieldOutputType])
|
|
75
|
+
Fields: SimpleEntityFieldOutputType[];
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
@ObjectType()
|
|
80
79
|
export class SimpleEntityFieldOutputType {
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
@Field(() => String)
|
|
81
|
+
ID: string;
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
|
|
83
|
+
@Field(() => String)
|
|
84
|
+
Name: string;
|
|
86
85
|
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
@Field(() => String, { nullable: true })
|
|
87
|
+
Description?: string;
|
|
89
88
|
|
|
90
|
-
|
|
91
|
-
|
|
89
|
+
@Field(() => String)
|
|
90
|
+
Type: string;
|
|
92
91
|
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
@Field(() => Boolean)
|
|
93
|
+
AllowsNull: boolean;
|
|
95
94
|
|
|
96
|
-
|
|
97
|
-
|
|
95
|
+
@Field(() => Number)
|
|
96
|
+
MaxLength: number;
|
|
98
97
|
}
|
|
99
98
|
|
|
100
99
|
/**
|
|
101
100
|
* General purpose resolver for fetching different kinds of data payloads for SYSTEM users only.
|
|
102
101
|
*/
|
|
103
102
|
export class GetDataResolver {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
): Promise<GetDataOutputType> {
|
|
115
|
-
try {
|
|
116
|
-
LogStatus(`GetDataResolver.GetData() ---- IMPORTANT - temporarily using the same connection as rest of the server, we need to separately create a READ ONLY CONNECTION and pass that in
|
|
103
|
+
/**
|
|
104
|
+
* This query will sync the specified items with the existing system. Items will be processed in order and the results of each operation will be returned in the Results array within the return value.
|
|
105
|
+
* @param items - an array of ActionItemInputType objects that specify the action to be taken on the specified entity with the specified primary key and the JSON representation of the field values.
|
|
106
|
+
* @param token - the short-lived access token that is required to perform this operation.
|
|
107
|
+
*/
|
|
108
|
+
@RequireSystemUser()
|
|
109
|
+
@Query(() => GetDataOutputType)
|
|
110
|
+
async GetData(@Arg('input', () => GetDataInputType) input: GetDataInputType, @Ctx() context: AppContext): Promise<GetDataOutputType> {
|
|
111
|
+
try {
|
|
112
|
+
LogStatus(`GetDataResolver.GetData() ---- IMPORTANT - temporarily using the same connection as rest of the server, we need to separately create a READ ONLY CONNECTION and pass that in
|
|
117
113
|
the AppContext so we can use that special connection here to ensure we are using a lower privileged connection for this operation to prevent mutation from being possible.`);
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
114
|
+
LogStatus(`${JSON.stringify(input)}`);
|
|
115
|
+
|
|
116
|
+
// validate the token
|
|
117
|
+
if (!isTokenValid(input.Token)) {
|
|
118
|
+
throw new Error(`Token ${input.Token} is not valid or has expired`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Use the read-only connection for executing queries
|
|
122
|
+
const readOnlyDataSource = GetReadOnlyDataSource(context.dataSources, { allowFallbackToReadWrite: false });
|
|
123
|
+
if (!readOnlyDataSource) {
|
|
124
|
+
throw new Error('Read-only data source not found');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Execute all queries in parallel, but execute each individual query in its own try catch block so that if one fails, the others can still be processed
|
|
128
|
+
// and also so that we can capture the error message for each query and return it
|
|
129
|
+
const results = await Promise.allSettled(
|
|
130
|
+
input.Queries.map(async (query) => {
|
|
131
|
+
try {
|
|
132
|
+
const request = new sql.Request(readOnlyDataSource);
|
|
133
|
+
const result = await request.query(query);
|
|
134
|
+
return { result: result.recordset, error: null };
|
|
135
|
+
} catch (err) {
|
|
136
|
+
return { result: null, error: err };
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
// Extract results and errors from the promises
|
|
142
|
+
const processedResults = results.map((res) => (res.status === 'fulfilled' ? res.value.result : null));
|
|
143
|
+
const errorMessages = results.map((res) => (res.status === 'fulfilled' ? res.value.error : res.reason));
|
|
144
|
+
|
|
145
|
+
// record the use of the token
|
|
146
|
+
const returnVal = {
|
|
147
|
+
Success: errorMessages.filter((e) => e !== null).length === 0,
|
|
148
|
+
Results: processedResults.map((r) => JSON.stringify(r)),
|
|
149
|
+
Queries: input.Queries,
|
|
150
|
+
ErrorMessages: errorMessages,
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
recordTokenUse(input.Token, { request: input, results: returnVal });
|
|
154
|
+
|
|
155
|
+
// Success below is derived from having no errorMessages, check that array
|
|
156
|
+
return returnVal;
|
|
157
|
+
} catch (err) {
|
|
158
|
+
LogError(err);
|
|
159
|
+
return { Success: false, ErrorMessages: [typeof err === 'string' ? err : (err as any).message], Results: [], Queries: input.Queries };
|
|
164
160
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
LogError(err);
|
|
199
|
-
return { Success: false, ErrorMessage: typeof err === 'string' ? err : (err as any).message, Results: [] };
|
|
200
|
-
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@RequireSystemUser()
|
|
164
|
+
@Query(() => SimpleEntityResultType)
|
|
165
|
+
async GetAllEntities(@Ctx() context: AppContext): Promise<SimpleEntityResultType> {
|
|
166
|
+
try {
|
|
167
|
+
const md = GetReadOnlyProvider(context.providers);
|
|
168
|
+
const result = md.Entities.map((e) => {
|
|
169
|
+
return {
|
|
170
|
+
ID: e.ID,
|
|
171
|
+
Name: e.Name,
|
|
172
|
+
Description: e.Description,
|
|
173
|
+
SchemaName: e.SchemaName,
|
|
174
|
+
BaseView: e.BaseView,
|
|
175
|
+
BaseTable: e.BaseTable,
|
|
176
|
+
CodeName: e.CodeName,
|
|
177
|
+
ClassName: e.ClassName,
|
|
178
|
+
Fields: e.Fields.map((f) => {
|
|
179
|
+
return {
|
|
180
|
+
ID: f.ID,
|
|
181
|
+
Name: f.Name,
|
|
182
|
+
Description: f.Description,
|
|
183
|
+
Type: f.Type,
|
|
184
|
+
AllowsNull: f.AllowsNull,
|
|
185
|
+
MaxLength: f.MaxLength,
|
|
186
|
+
};
|
|
187
|
+
}),
|
|
188
|
+
};
|
|
189
|
+
});
|
|
190
|
+
return { Success: true, Results: result };
|
|
191
|
+
} catch (err) {
|
|
192
|
+
LogError(err);
|
|
193
|
+
return { Success: false, ErrorMessage: typeof err === 'string' ? err : (err as any).message, Results: [] };
|
|
201
194
|
}
|
|
202
|
-
|
|
203
|
-
|
|
195
|
+
}
|
|
204
196
|
}
|
|
205
|
-
|
|
206
197
|
|
|
207
198
|
export class TokenUseLog {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
199
|
+
Token: string;
|
|
200
|
+
UsedAt: Date;
|
|
201
|
+
UsePayload: any;
|
|
211
202
|
}
|
|
212
203
|
/**
|
|
213
204
|
* Used to track all active access tokens that are requested by anyone within the server to be able to send to external services that can
|
|
214
|
-
* in turn call back to the GetDataResolver to get data from the server. This is an extra security layer to ensure that tokens are short
|
|
205
|
+
* in turn call back to the GetDataResolver to get data from the server. This is an extra security layer to ensure that tokens are short
|
|
215
206
|
* lived compared to the system level API key which rotates but less frequently.
|
|
216
207
|
*/
|
|
217
208
|
export class GetDataAccessToken {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
209
|
+
Token: string;
|
|
210
|
+
ExpiresAt: Date;
|
|
211
|
+
RequstedAt: Date;
|
|
212
|
+
/**
|
|
213
|
+
* Can be used to store any payload to identify who requested the creation of the token, for example Skip might use this to put in a conversation ID to know which conversation a request is coming back for.
|
|
214
|
+
*/
|
|
215
|
+
RequestorPayload: any;
|
|
216
|
+
TokenUses: TokenUseLog[];
|
|
226
217
|
}
|
|
227
218
|
const __accessTokens: GetDataAccessToken[] = [];
|
|
228
|
-
const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
|
|
219
|
+
const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
|
|
229
220
|
export function registerAccessToken(token?: string, lifeSpan: number = __defaultTokenLifeSpan, requestorPayload?: any): GetDataAccessToken {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
221
|
+
const tokenToUse = token || uuidv4();
|
|
222
|
+
|
|
223
|
+
if (tokenExists(tokenToUse)) {
|
|
224
|
+
// should never happen if we used the uuidv4() function but could happen if someone tries to use a custom token
|
|
225
|
+
throw new Error(`Token ${tokenToUse} already exists`);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const newToken = new GetDataAccessToken();
|
|
229
|
+
newToken.Token = tokenToUse;
|
|
230
|
+
newToken.ExpiresAt = new Date(new Date().getTime() + lifeSpan);
|
|
231
|
+
newToken.RequstedAt = new Date();
|
|
232
|
+
newToken.RequestorPayload = requestorPayload;
|
|
233
|
+
__accessTokens.push(newToken);
|
|
234
|
+
return newToken;
|
|
244
235
|
}
|
|
245
236
|
export function deleteAccessToken(token: string) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
}
|
|
237
|
+
const index = __accessTokens.findIndex((t) => t.Token === token);
|
|
238
|
+
if (index >= 0) {
|
|
239
|
+
__accessTokens.splice(index, 1);
|
|
240
|
+
} else {
|
|
241
|
+
throw new Error(`Token ${token} does not exist`);
|
|
242
|
+
}
|
|
253
243
|
}
|
|
254
244
|
export function tokenExists(token: string) {
|
|
255
|
-
|
|
245
|
+
return __accessTokens.find((t) => t.Token === token) !== undefined;
|
|
256
246
|
}
|
|
257
247
|
export function isTokenValid(token: string) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
248
|
+
const t = __accessTokens.find((t) => t.Token === token);
|
|
249
|
+
if (t) {
|
|
250
|
+
return t.ExpiresAt > new Date();
|
|
251
|
+
}
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
264
254
|
export function recordTokenUse(token: string, usePayload: any) {
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
}
|
|
270
|
-
t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
throw new Error(`Token ${token} does not exist`);
|
|
255
|
+
const t = __accessTokens.find((t) => t.Token === token);
|
|
256
|
+
if (t) {
|
|
257
|
+
if (!t.TokenUses) {
|
|
258
|
+
t.TokenUses = [];
|
|
274
259
|
}
|
|
260
|
+
t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
|
|
261
|
+
} else {
|
|
262
|
+
throw new Error(`Token ${token} does not exist`);
|
|
263
|
+
}
|
|
275
264
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogError, Metadata, CompositeKey } from '@memberjunction/
|
|
1
|
+
import { LogError, Metadata, CompositeKey } from '@memberjunction/global';
|
|
2
2
|
import { Arg, Ctx, Field, InputType, Int, Mutation, ObjectType, PubSub, PubSubEngine, Query, Resolver } from 'type-graphql';
|
|
3
3
|
import { AppContext } from '../types.js';
|
|
4
4
|
import { CompositeKeyInputType, CompositeKeyOutputType } from '../generic/KeyInputOutputTypes.js';
|
|
@@ -31,7 +31,7 @@ export class EntityDependencyResolver {
|
|
|
31
31
|
} catch (err) {
|
|
32
32
|
LogError(err);
|
|
33
33
|
const ctx = z.object({ message: z.string() }).catch(null).parse(err)?.message ?? JSON.stringify(err);
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
throw new Error(ctx);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -65,13 +65,13 @@ export class RecordDependencyResolver {
|
|
|
65
65
|
const md = GetReadOnlyProvider(providers);
|
|
66
66
|
const ck = new CompositeKey(ckInput.KeyValuePairs);
|
|
67
67
|
const result = await md.GetRecordDependencies(entityName, ck);
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
// Map PrimaryKey to CompositeKey for GraphQL response
|
|
70
|
-
return result.map(dep => ({
|
|
70
|
+
return result.map((dep) => ({
|
|
71
71
|
EntityName: dep.EntityName,
|
|
72
72
|
RelatedEntityName: dep.RelatedEntityName,
|
|
73
73
|
FieldName: dep.FieldName,
|
|
74
|
-
CompositeKey: dep.PrimaryKey // Map PrimaryKey to CompositeKey
|
|
74
|
+
CompositeKey: dep.PrimaryKey, // Map PrimaryKey to CompositeKey
|
|
75
75
|
}));
|
|
76
76
|
} catch (e) {
|
|
77
77
|
LogError(e);
|