@memberjunction/server 2.112.0 → 2.113.1
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,264 +1,275 @@
|
|
|
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/core';
|
|
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
|
-
|
|
17
|
+
|
|
18
|
+
|
|
18
19
|
@ObjectType()
|
|
19
20
|
export class GetDataOutputType {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
@Field(() => Boolean)
|
|
22
|
+
Success: boolean;
|
|
22
23
|
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
@Field(() => [String])
|
|
25
|
+
Queries: string[];
|
|
25
26
|
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
@Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
|
|
28
|
+
ErrorMessages: (string | null)[];
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Each query's results will be converted to JSON and returned as a string
|
|
32
|
+
*/
|
|
33
|
+
@Field(() => [String], { nullable: 'itemsAndList' }) // Allow nulls inside array & entire field nullable
|
|
34
|
+
Results: (string | null)[];
|
|
34
35
|
}
|
|
35
|
-
|
|
36
|
+
|
|
36
37
|
@ObjectType()
|
|
37
38
|
export class SimpleEntityResultType {
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
@Field(() => Boolean)
|
|
40
|
+
Success: boolean;
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
@Field(() => String, { nullable: true })
|
|
43
|
+
ErrorMessage?: string;
|
|
43
44
|
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
@Field(() => [SimpleEntityOutputType])
|
|
46
|
+
Results: SimpleEntityOutputType[];
|
|
46
47
|
}
|
|
47
48
|
|
|
48
49
|
@ObjectType()
|
|
49
50
|
export class SimpleEntityOutputType {
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
@Field(() => String)
|
|
52
|
+
ID: string;
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
@Field(() => String)
|
|
55
|
+
Name: string;
|
|
55
56
|
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
@Field(() => String, { nullable: true })
|
|
58
|
+
Description?: string;
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
|
|
60
|
+
@Field(() => String)
|
|
61
|
+
SchemaName: string;
|
|
61
62
|
|
|
62
|
-
|
|
63
|
-
|
|
63
|
+
@Field(() => String)
|
|
64
|
+
BaseView: string;
|
|
64
65
|
|
|
65
|
-
|
|
66
|
-
|
|
66
|
+
@Field(() => String)
|
|
67
|
+
BaseTable: string;
|
|
67
68
|
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
@Field(() => String, { nullable: true })
|
|
70
|
+
CodeName?: string;
|
|
70
71
|
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
@Field(() => String, { nullable: true })
|
|
73
|
+
ClassName?: string;
|
|
73
74
|
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
@Field(() => [SimpleEntityFieldOutputType])
|
|
76
|
+
Fields: SimpleEntityFieldOutputType[];
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
@ObjectType()
|
|
79
80
|
export class SimpleEntityFieldOutputType {
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
@Field(() => String)
|
|
82
|
+
ID: string;
|
|
82
83
|
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
@Field(() => String)
|
|
85
|
+
Name: string;
|
|
85
86
|
|
|
86
|
-
|
|
87
|
-
|
|
87
|
+
@Field(() => String, { nullable: true })
|
|
88
|
+
Description?: string;
|
|
88
89
|
|
|
89
|
-
|
|
90
|
-
|
|
90
|
+
@Field(() => String)
|
|
91
|
+
Type: string;
|
|
91
92
|
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
@Field(() => Boolean)
|
|
94
|
+
AllowsNull: boolean;
|
|
94
95
|
|
|
95
|
-
|
|
96
|
-
|
|
96
|
+
@Field(() => Number)
|
|
97
|
+
MaxLength: number;
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
/**
|
|
100
101
|
* General purpose resolver for fetching different kinds of data payloads for SYSTEM users only.
|
|
101
102
|
*/
|
|
102
103
|
export class GetDataResolver {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
104
|
+
/**
|
|
105
|
+
* 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.
|
|
106
|
+
* @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.
|
|
107
|
+
* @param token - the short-lived access token that is required to perform this operation.
|
|
108
|
+
*/
|
|
109
|
+
@RequireSystemUser()
|
|
110
|
+
@Query(() => GetDataOutputType)
|
|
111
|
+
async GetData(
|
|
112
|
+
@Arg('input', () => GetDataInputType) input: GetDataInputType,
|
|
113
|
+
@Ctx() context: AppContext
|
|
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
|
|
113
117
|
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.`);
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
118
|
+
LogStatus(`${JSON.stringify(input)}`);
|
|
119
|
+
|
|
120
|
+
// validate the token
|
|
121
|
+
if (!isTokenValid(input.Token)) {
|
|
122
|
+
throw new Error(`Token ${input.Token} is not valid or has expired`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Use the read-only connection for executing queries
|
|
126
|
+
const readOnlyDataSource = GetReadOnlyDataSource(context.dataSources, {allowFallbackToReadWrite: false})
|
|
127
|
+
if (!readOnlyDataSource) {
|
|
128
|
+
throw new Error('Read-only data source not found');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// 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
|
|
132
|
+
// and also so that we can capture the error message for each query and return it
|
|
133
|
+
const results = await Promise.allSettled(
|
|
134
|
+
input.Queries.map(async (query) => {
|
|
135
|
+
try {
|
|
136
|
+
const request = new sql.Request(readOnlyDataSource);
|
|
137
|
+
const result = await request.query(query);
|
|
138
|
+
return { result: result.recordset, error: null };
|
|
139
|
+
} catch (err) {
|
|
140
|
+
return { result: null, error: err };
|
|
141
|
+
}
|
|
142
|
+
})
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// Extract results and errors from the promises
|
|
146
|
+
const processedResults = results.map((res) => res.status === "fulfilled" ? res.value.result : null);
|
|
147
|
+
const errorMessages = results.map((res) => res.status === "fulfilled" ? res.value.error : res.reason);
|
|
148
|
+
|
|
149
|
+
// record the use of the token
|
|
150
|
+
const returnVal = { Success: errorMessages.filter((e) => e !== null).length === 0,
|
|
151
|
+
Results: processedResults.map((r) => JSON.stringify(r)),
|
|
152
|
+
Queries: input.Queries,
|
|
153
|
+
ErrorMessages: errorMessages }
|
|
154
|
+
|
|
155
|
+
recordTokenUse(input.Token, {request: input, results: returnVal});
|
|
156
|
+
|
|
157
|
+
// Success below is derived from having no errorMessages, check that array
|
|
158
|
+
return returnVal;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
LogError(err);
|
|
162
|
+
return { Success: false, ErrorMessages: [typeof err === 'string' ? err : (err as any).message], Results: [], Queries: input.Queries };
|
|
163
|
+
}
|
|
160
164
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
165
|
+
|
|
166
|
+
@RequireSystemUser()
|
|
167
|
+
@Query(() => SimpleEntityResultType)
|
|
168
|
+
async GetAllEntities(
|
|
169
|
+
@Ctx() context: AppContext
|
|
170
|
+
): Promise<SimpleEntityResultType> {
|
|
171
|
+
try {
|
|
172
|
+
const md = GetReadOnlyProvider(context.providers);
|
|
173
|
+
const result = md.Entities.map((e) => {
|
|
174
|
+
return {
|
|
175
|
+
ID: e.ID,
|
|
176
|
+
Name: e.Name,
|
|
177
|
+
Description: e.Description,
|
|
178
|
+
SchemaName: e.SchemaName,
|
|
179
|
+
BaseView: e.BaseView,
|
|
180
|
+
BaseTable: e.BaseTable,
|
|
181
|
+
CodeName: e.CodeName,
|
|
182
|
+
ClassName: e.ClassName,
|
|
183
|
+
Fields: e.Fields.map((f) => {
|
|
184
|
+
return {
|
|
185
|
+
ID: f.ID,
|
|
186
|
+
Name: f.Name,
|
|
187
|
+
Description: f.Description,
|
|
188
|
+
Type: f.Type,
|
|
189
|
+
AllowsNull: f.AllowsNull,
|
|
190
|
+
MaxLength: f.MaxLength,
|
|
191
|
+
};
|
|
192
|
+
})
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
return { Success: true, Results: result };
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
LogError(err);
|
|
199
|
+
return { Success: false, ErrorMessage: typeof err === 'string' ? err : (err as any).message, Results: [] };
|
|
200
|
+
}
|
|
194
201
|
}
|
|
195
|
-
|
|
202
|
+
|
|
203
|
+
|
|
196
204
|
}
|
|
205
|
+
|
|
197
206
|
|
|
198
207
|
export class TokenUseLog {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
208
|
+
Token: string;
|
|
209
|
+
UsedAt: Date;
|
|
210
|
+
UsePayload: any;
|
|
202
211
|
}
|
|
203
212
|
/**
|
|
204
213
|
* 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
|
|
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
|
|
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
|
|
206
215
|
* lived compared to the system level API key which rotates but less frequently.
|
|
207
216
|
*/
|
|
208
217
|
export class GetDataAccessToken {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
218
|
+
Token: string;
|
|
219
|
+
ExpiresAt: Date;
|
|
220
|
+
RequstedAt: Date;
|
|
221
|
+
/**
|
|
222
|
+
* 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.
|
|
223
|
+
*/
|
|
224
|
+
RequestorPayload: any;
|
|
225
|
+
TokenUses: TokenUseLog[];
|
|
217
226
|
}
|
|
218
227
|
const __accessTokens: GetDataAccessToken[] = [];
|
|
219
|
-
const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
|
|
228
|
+
const __defaultTokenLifeSpan = 1000 * 60 * 5; // 5 minutes
|
|
220
229
|
export function registerAccessToken(token?: string, lifeSpan: number = __defaultTokenLifeSpan, requestorPayload?: any): GetDataAccessToken {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
230
|
+
const tokenToUse = token || uuidv4();
|
|
231
|
+
|
|
232
|
+
if (tokenExists(tokenToUse)) {
|
|
233
|
+
// should never happen if we used the uuidv4() function but could happen if someone tries to use a custom token
|
|
234
|
+
throw new Error(`Token ${tokenToUse} already exists`);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
const newToken = new GetDataAccessToken();
|
|
238
|
+
newToken.Token = tokenToUse;
|
|
239
|
+
newToken.ExpiresAt = new Date(new Date().getTime() + lifeSpan);
|
|
240
|
+
newToken.RequstedAt = new Date();
|
|
241
|
+
newToken.RequestorPayload = requestorPayload;
|
|
242
|
+
__accessTokens.push(newToken);
|
|
243
|
+
return newToken;
|
|
235
244
|
}
|
|
236
245
|
export function deleteAccessToken(token: string) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
246
|
+
const index = __accessTokens.findIndex((t) => t.Token === token);
|
|
247
|
+
if (index >= 0) {
|
|
248
|
+
__accessTokens.splice(index, 1);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
throw new Error(`Token ${token} does not exist`);
|
|
252
|
+
}
|
|
243
253
|
}
|
|
244
254
|
export function tokenExists(token: string) {
|
|
245
|
-
|
|
255
|
+
return __accessTokens.find((t) => t.Token === token) !== undefined;
|
|
246
256
|
}
|
|
247
257
|
export function isTokenValid(token: string) {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
258
|
+
const t = __accessTokens.find((t) => t.Token === token);
|
|
259
|
+
if (t) {
|
|
260
|
+
return t.ExpiresAt > new Date();
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
254
264
|
export function recordTokenUse(token: string, usePayload: any) {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
265
|
+
const t = __accessTokens.find((t) => t.Token === token);
|
|
266
|
+
if (t) {
|
|
267
|
+
if (!t.TokenUses) {
|
|
268
|
+
t.TokenUses = [];
|
|
269
|
+
}
|
|
270
|
+
t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
throw new Error(`Token ${token} does not exist`);
|
|
259
274
|
}
|
|
260
|
-
t.TokenUses.push({ Token: token, UsedAt: new Date(), UsePayload: usePayload });
|
|
261
|
-
} else {
|
|
262
|
-
throw new Error(`Token ${token} does not exist`);
|
|
263
|
-
}
|
|
264
275
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogError, Metadata, CompositeKey } from '@memberjunction/
|
|
1
|
+
import { LogError, Metadata, CompositeKey } from '@memberjunction/core';
|
|
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(
|
|
70
|
+
return result.map(dep => ({
|
|
71
71
|
EntityName: dep.EntityName,
|
|
72
72
|
RelatedEntityName: dep.RelatedEntityName,
|
|
73
73
|
FieldName: dep.FieldName,
|
|
74
|
-
CompositeKey: dep.PrimaryKey
|
|
74
|
+
CompositeKey: dep.PrimaryKey // Map PrimaryKey to CompositeKey
|
|
75
75
|
}));
|
|
76
76
|
} catch (e) {
|
|
77
77
|
LogError(e);
|