@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,7 +1,5 @@
|
|
|
1
|
-
import { KeyValuePair } from
|
|
2
|
-
import { Field, InputType, ObjectType } from
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { KeyValuePair } from '@memberjunction/global';
|
|
2
|
+
import { Field, InputType, ObjectType } from 'type-graphql';
|
|
5
3
|
|
|
6
4
|
@InputType()
|
|
7
5
|
export class KeyValuePairInputType {
|
|
@@ -20,7 +18,6 @@ export class KeyValuePairOutputType {
|
|
|
20
18
|
@Field(() => String)
|
|
21
19
|
Value: string;
|
|
22
20
|
}
|
|
23
|
-
|
|
24
21
|
|
|
25
22
|
@InputType()
|
|
26
23
|
export class CompositeKeyInputType {
|
|
@@ -32,4 +29,4 @@ export class CompositeKeyInputType {
|
|
|
32
29
|
export class CompositeKeyOutputType {
|
|
33
30
|
@Field(() => [KeyValuePairOutputType])
|
|
34
31
|
KeyValuePairs: KeyValuePair[];
|
|
35
|
-
}
|
|
32
|
+
}
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
RunViewParams,
|
|
16
16
|
RunViewResult,
|
|
17
17
|
UserInfo,
|
|
18
|
-
} from '@memberjunction/
|
|
18
|
+
} from '@memberjunction/global';
|
|
19
19
|
import { AuditLogEntity, ErrorLogEntity, UserViewEntityExtended } from '@memberjunction/core-entities';
|
|
20
20
|
import { SQLServerDataProvider, UserCache } from '@memberjunction/sqlserver-dataprovider';
|
|
21
21
|
import { PubSubEngine } from 'type-graphql';
|
|
@@ -41,7 +41,9 @@ export class ResolverBase {
|
|
|
41
41
|
// could actually be duplicated and we'd end up with multiple instances of the same map, which would be bad.
|
|
42
42
|
const g = MJGlobal.Instance.GetGlobalObjectStore();
|
|
43
43
|
if (!g[ResolverBase._eventSubscriptionKey]) {
|
|
44
|
-
LogDebug(
|
|
44
|
+
LogDebug(
|
|
45
|
+
`>>>>> MJServer.ResolverBase.EventSubscriptions: Creating new Map - this should only happen once per server instance <<<<<<`
|
|
46
|
+
);
|
|
45
47
|
g[ResolverBase._eventSubscriptionKey] = new Map<string, Subscription>();
|
|
46
48
|
}
|
|
47
49
|
return g[ResolverBase._eventSubscriptionKey];
|
|
@@ -89,7 +91,7 @@ export class ResolverBase {
|
|
|
89
91
|
const e = provider.Entities.find((e) => e.Name === entity);
|
|
90
92
|
if (!e) throw new Error(`Entity ${entity} not found in metadata`);
|
|
91
93
|
// now build a SQL string using the entityInfo and using the properties in the params object
|
|
92
|
-
let extraFilter =
|
|
94
|
+
let extraFilter = '';
|
|
93
95
|
const keys = Object.keys(params);
|
|
94
96
|
keys.forEach((k, i) => {
|
|
95
97
|
if (i > 0) extraFilter += ' AND ';
|
|
@@ -102,25 +104,35 @@ export class ResolverBase {
|
|
|
102
104
|
|
|
103
105
|
// ok, now we have a SQL string, run it and return the results
|
|
104
106
|
// use the SQLServerDataProvider
|
|
105
|
-
const result = await rv.RunView(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
const result = await rv.RunView(
|
|
108
|
+
{
|
|
109
|
+
EntityName: entity,
|
|
110
|
+
ExtraFilter: extraFilter,
|
|
111
|
+
},
|
|
112
|
+
contextUser
|
|
113
|
+
);
|
|
109
114
|
if (result && result.Success && result.Results.length > 0) {
|
|
110
115
|
return result.Results;
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
116
|
+
} else {
|
|
113
117
|
return [];
|
|
114
118
|
}
|
|
115
119
|
}
|
|
116
120
|
|
|
117
|
-
async RunViewByNameGeneric(
|
|
121
|
+
async RunViewByNameGeneric(
|
|
122
|
+
viewInput: RunViewByNameInput,
|
|
123
|
+
provider: DatabaseProviderBase,
|
|
124
|
+
userPayload: UserPayload,
|
|
125
|
+
pubSub: PubSubEngine
|
|
126
|
+
) {
|
|
118
127
|
try {
|
|
119
128
|
const rv = provider as any as IRunViewProvider;
|
|
120
|
-
const result = await rv.RunView<UserViewEntityExtended>(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
129
|
+
const result = await rv.RunView<UserViewEntityExtended>(
|
|
130
|
+
{
|
|
131
|
+
EntityName: 'User Views',
|
|
132
|
+
ExtraFilter: "Name='" + viewInput.ViewName + "'",
|
|
133
|
+
},
|
|
134
|
+
userPayload.userRecord
|
|
135
|
+
);
|
|
124
136
|
if (result && result.Success && result.Results.length > 0) {
|
|
125
137
|
const viewInfo = result.Results[0];
|
|
126
138
|
return this.RunViewGenericInternal(
|
|
@@ -142,8 +154,7 @@ export class ResolverBase {
|
|
|
142
154
|
viewInput.MaxRows,
|
|
143
155
|
viewInput.StartRow
|
|
144
156
|
);
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
157
|
+
} else {
|
|
147
158
|
LogError(`RunViewByNameGeneric: View ${viewInput.ViewName} not found or no results returned`);
|
|
148
159
|
return null;
|
|
149
160
|
}
|
|
@@ -183,7 +194,12 @@ export class ResolverBase {
|
|
|
183
194
|
}
|
|
184
195
|
}
|
|
185
196
|
|
|
186
|
-
async RunDynamicViewGeneric(
|
|
197
|
+
async RunDynamicViewGeneric(
|
|
198
|
+
viewInput: RunDynamicViewInput,
|
|
199
|
+
provider: DatabaseProviderBase,
|
|
200
|
+
userPayload: UserPayload,
|
|
201
|
+
pubSub: PubSubEngine
|
|
202
|
+
) {
|
|
187
203
|
try {
|
|
188
204
|
const md = provider;
|
|
189
205
|
const entity = md.Entities.find((e) => e.Name === viewInput.EntityName);
|
|
@@ -234,7 +250,9 @@ export class ResolverBase {
|
|
|
234
250
|
let viewInfo: UserViewEntityExtended | null = null;
|
|
235
251
|
|
|
236
252
|
if (viewInput.ViewName) {
|
|
237
|
-
viewInfo = this.safeFirstArrayElement(
|
|
253
|
+
viewInfo = this.safeFirstArrayElement(
|
|
254
|
+
await this.findBy(provider, 'User Views', { Name: viewInput.ViewName }, userPayload.userRecord)
|
|
255
|
+
);
|
|
238
256
|
} else if (viewInput.ViewID) {
|
|
239
257
|
viewInfo = await provider.GetEntityObject<UserViewEntityExtended>('User Views', contextUser);
|
|
240
258
|
await viewInfo.Load(viewInput.ViewID);
|
|
@@ -272,7 +290,7 @@ export class ResolverBase {
|
|
|
272
290
|
forceAuditLog: viewInput.ForceAuditLog,
|
|
273
291
|
auditLogDescription: viewInput.AuditLogDescription,
|
|
274
292
|
resultType: viewInput.ResultType,
|
|
275
|
-
userPayload,
|
|
293
|
+
userPayload,
|
|
276
294
|
});
|
|
277
295
|
} catch (err) {
|
|
278
296
|
LogError(err);
|
|
@@ -284,7 +302,7 @@ export class ResolverBase {
|
|
|
284
302
|
return results;
|
|
285
303
|
}
|
|
286
304
|
|
|
287
|
-
private static _priorEmittedData: {Entity: string
|
|
305
|
+
private static _priorEmittedData: { Entity: string; PKey: CompositeKey }[] = [];
|
|
288
306
|
protected async EmitCloudEvent({ component, event, eventCode, args }: MJEvent) {
|
|
289
307
|
if (ResolverBase._emit && event === MJEventType.ComponentEvent && eventCode === BaseEntity.BaseEventCode) {
|
|
290
308
|
const extendedType = args instanceof BaseEntityEvent ? `.${args.type}` : '';
|
|
@@ -299,20 +317,20 @@ export class ResolverBase {
|
|
|
299
317
|
// check to see if the combination of Entity and pkey was already emitted, if so, Log that condtion next
|
|
300
318
|
const pkey = args.baseEntity.PrimaryKeys as CompositeKey;
|
|
301
319
|
const emittedData = { Entity: args.baseEntity.EntityInfo.Name, PKey: pkey };
|
|
302
|
-
if (
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
return false;
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
320
|
+
if (
|
|
321
|
+
ResolverBase._priorEmittedData.find((e) => {
|
|
322
|
+
if (e.Entity !== emittedData.Entity) return false;
|
|
323
|
+
// if we get here compare the pkeys
|
|
324
|
+
const pkey2 = e.PKey as CompositeKey;
|
|
325
|
+
if (pkey.KeyValuePairs.length !== pkey2.KeyValuePairs.length) return false;
|
|
326
|
+
for (const kv of pkey.KeyValuePairs) {
|
|
327
|
+
// find the match by field name
|
|
328
|
+
const kv2 = pkey2.KeyValuePairs.find((k) => k.FieldName === kv.FieldName);
|
|
329
|
+
if (!kv2 || kv2.Value !== kv.Value) return false;
|
|
330
|
+
}
|
|
331
|
+
return true; // if we get here, all the keys matched
|
|
332
|
+
})
|
|
333
|
+
) {
|
|
316
334
|
console.log(`IMPORTANT: CloudEvent already emitted for ${JSON.stringify(emittedData)}`);
|
|
317
335
|
}
|
|
318
336
|
|
|
@@ -334,7 +352,7 @@ export class ResolverBase {
|
|
|
334
352
|
if (!userPayload) {
|
|
335
353
|
throw new Error(`userPayload is null`);
|
|
336
354
|
}
|
|
337
|
-
|
|
355
|
+
|
|
338
356
|
// first check permissions, the logged in user must have read permissions on the entity to run the view
|
|
339
357
|
if (entityInfo) {
|
|
340
358
|
const userInfo = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload.email.toLowerCase().trim()); // get the user record from MD so we have ROLES attached, don't use the one from payload directly
|
|
@@ -346,8 +364,7 @@ export class ResolverBase {
|
|
|
346
364
|
if (!userPermissions.CanRead) {
|
|
347
365
|
throw new Error(`User ${userPayload.email} does not have read permissions on ${entityInfo.Name}`);
|
|
348
366
|
}
|
|
349
|
-
}
|
|
350
|
-
else {
|
|
367
|
+
} else {
|
|
351
368
|
throw new Error(`Entity not found in metadata`);
|
|
352
369
|
}
|
|
353
370
|
}
|
|
@@ -379,7 +396,7 @@ export class ResolverBase {
|
|
|
379
396
|
try {
|
|
380
397
|
if (!viewInfo || !userPayload) return null;
|
|
381
398
|
|
|
382
|
-
const md = provider
|
|
399
|
+
const md = provider;
|
|
383
400
|
const user = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload?.email.toLowerCase().trim());
|
|
384
401
|
if (!user) throw new Error(`User ${userPayload?.email} not found in metadata`);
|
|
385
402
|
|
|
@@ -399,11 +416,9 @@ export class ResolverBase {
|
|
|
399
416
|
let optimizedFields = fields;
|
|
400
417
|
if (fields?.length) {
|
|
401
418
|
// Always ensure primary keys are included for proper record handling
|
|
402
|
-
const primaryKeys = entityInfo.PrimaryKeys.map(pk => pk.Name);
|
|
403
|
-
const missingPrimaryKeys = primaryKeys.filter(pk =>
|
|
404
|
-
|
|
405
|
-
);
|
|
406
|
-
|
|
419
|
+
const primaryKeys = entityInfo.PrimaryKeys.map((pk) => pk.Name);
|
|
420
|
+
const missingPrimaryKeys = primaryKeys.filter((pk) => !fields.find((f) => f.toLowerCase() === pk.toLowerCase()));
|
|
421
|
+
|
|
407
422
|
if (missingPrimaryKeys.length) {
|
|
408
423
|
optimizedFields = [...fields, ...missingPrimaryKeys];
|
|
409
424
|
}
|
|
@@ -416,7 +431,7 @@ export class ResolverBase {
|
|
|
416
431
|
EntityName: viewInfo.Entity,
|
|
417
432
|
ExtraFilter: extraFilter,
|
|
418
433
|
OrderBy: orderBy,
|
|
419
|
-
Fields: optimizedFields,
|
|
434
|
+
Fields: optimizedFields, // Use optimized fields list
|
|
420
435
|
UserSearchString: userSearchString,
|
|
421
436
|
ExcludeUserViewRunID: excludeUserViewRunID,
|
|
422
437
|
OverrideExcludeFilter: overrideExcludeFilter,
|
|
@@ -439,7 +454,7 @@ export class ResolverBase {
|
|
|
439
454
|
mapper.MapFields(r);
|
|
440
455
|
}
|
|
441
456
|
}
|
|
442
|
-
|
|
457
|
+
|
|
443
458
|
return result;
|
|
444
459
|
} catch (err) {
|
|
445
460
|
// Fix #9: Improved error handling with structured logging
|
|
@@ -451,7 +466,7 @@ export class ResolverBase {
|
|
|
451
466
|
entityName: viewInfo?.Entity,
|
|
452
467
|
errorType: error.constructor.name,
|
|
453
468
|
// Only include stack trace for non-validation errors
|
|
454
|
-
stack: error.message?.includes('not found in metadata') ? undefined : error.stack
|
|
469
|
+
stack: error.message?.includes('not found in metadata') ? undefined : error.stack,
|
|
455
470
|
});
|
|
456
471
|
throw err;
|
|
457
472
|
}
|
|
@@ -471,18 +486,18 @@ export class ResolverBase {
|
|
|
471
486
|
let md: Metadata | null = null;
|
|
472
487
|
const rv = params[0].provider as any as IRunViewProvider;
|
|
473
488
|
let runViewParams: RunViewParams[] = [];
|
|
474
|
-
|
|
489
|
+
|
|
475
490
|
// Fix #1: Get user info only once for all queries
|
|
476
491
|
let contextUser: UserInfo | null = null;
|
|
477
492
|
if (params[0]?.userPayload?.email) {
|
|
478
493
|
const userEmail = params[0].userPayload.email.toLowerCase().trim();
|
|
479
|
-
const user = UserCache.Users.find(u => u.Email.toLowerCase().trim() === userEmail);
|
|
494
|
+
const user = UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userEmail);
|
|
480
495
|
if (!user) {
|
|
481
496
|
throw new Error(`User ${userEmail} not found in metadata`);
|
|
482
497
|
}
|
|
483
498
|
contextUser = user;
|
|
484
499
|
}
|
|
485
|
-
|
|
500
|
+
|
|
486
501
|
// Create a map of entities to validate only once per entity
|
|
487
502
|
const validatedEntities = new Set<string>();
|
|
488
503
|
md = new Metadata();
|
|
@@ -493,7 +508,7 @@ export class ResolverBase {
|
|
|
493
508
|
// Validate entity only once per entity type
|
|
494
509
|
const entityName = param.viewInfo.Entity;
|
|
495
510
|
if (!validatedEntities.has(entityName)) {
|
|
496
|
-
const entityInfo = md.Entities.find(e => e.Name === entityName);
|
|
511
|
+
const entityInfo = md.Entities.find((e) => e.Name === entityName);
|
|
497
512
|
if (!entityInfo) {
|
|
498
513
|
throw new Error(`Entity ${entityName} not found in metadata`);
|
|
499
514
|
}
|
|
@@ -550,7 +565,12 @@ export class ResolverBase {
|
|
|
550
565
|
}
|
|
551
566
|
}
|
|
552
567
|
|
|
553
|
-
protected async createRecordAccessAuditLogRecord(
|
|
568
|
+
protected async createRecordAccessAuditLogRecord(
|
|
569
|
+
provider: DatabaseProviderBase,
|
|
570
|
+
userPayload: UserPayload,
|
|
571
|
+
entityName: string,
|
|
572
|
+
recordId: any
|
|
573
|
+
): Promise<any> {
|
|
554
574
|
try {
|
|
555
575
|
const md = provider;
|
|
556
576
|
const entityInfo = md.Entities.find((e) => e.Name.trim().toLowerCase() === entityName.trim().toLowerCase());
|
|
@@ -571,7 +591,13 @@ export class ResolverBase {
|
|
|
571
591
|
}
|
|
572
592
|
}
|
|
573
593
|
|
|
574
|
-
protected getRowLevelSecurityWhereClause(
|
|
594
|
+
protected getRowLevelSecurityWhereClause(
|
|
595
|
+
provider: DatabaseProviderBase,
|
|
596
|
+
entityName: string,
|
|
597
|
+
userPayload: UserPayload,
|
|
598
|
+
type: EntityPermissionType,
|
|
599
|
+
returnPrefix: string
|
|
600
|
+
) {
|
|
575
601
|
const md = provider;
|
|
576
602
|
const entityInfo = md.Entities.find((e) => e.Name.trim().toLowerCase() === entityName.trim().toLowerCase());
|
|
577
603
|
if (!entityInfo) throw new Error(`Entity ${entityName} not found in metadata`);
|
|
@@ -620,10 +646,8 @@ export class ResolverBase {
|
|
|
620
646
|
|
|
621
647
|
if (recordId) auditLog.RecordID = recordId;
|
|
622
648
|
|
|
623
|
-
if (await auditLog.Save())
|
|
624
|
-
|
|
625
|
-
else
|
|
626
|
-
throw new Error(`Error saving audit log record`);
|
|
649
|
+
if (await auditLog.Save()) return auditLog;
|
|
650
|
+
else throw new Error(`Error saving audit log record`);
|
|
627
651
|
} catch (err) {
|
|
628
652
|
console.log(err);
|
|
629
653
|
return null;
|
|
@@ -645,14 +669,11 @@ export class ResolverBase {
|
|
|
645
669
|
return UserCache.Users.find((u) => u.Email.toLowerCase().trim() === email.toLowerCase().trim());
|
|
646
670
|
}
|
|
647
671
|
protected GetUserFromPayload(userPayload: UserPayload): UserInfo | undefined {
|
|
648
|
-
if (!userPayload)
|
|
649
|
-
return undefined;
|
|
672
|
+
if (!userPayload) return undefined;
|
|
650
673
|
|
|
651
|
-
if (userPayload.userRecord)
|
|
652
|
-
return userPayload.userRecord; // if we have a user record, use that directly
|
|
674
|
+
if (userPayload.userRecord) return userPayload.userRecord; // if we have a user record, use that directly
|
|
653
675
|
|
|
654
|
-
if (!userPayload.email)
|
|
655
|
-
return undefined;
|
|
676
|
+
if (!userPayload.email) return undefined;
|
|
656
677
|
|
|
657
678
|
return UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload.email.toLowerCase().trim());
|
|
658
679
|
}
|
|
@@ -669,15 +690,24 @@ export class ResolverBase {
|
|
|
669
690
|
|
|
670
691
|
if (!this.EventSubscriptions.has(uniqueKey)) {
|
|
671
692
|
// listen for events from the entityObject in case it is a long running task and we can push messages back to the client via pubSub
|
|
672
|
-
LogDebug(
|
|
693
|
+
LogDebug(
|
|
694
|
+
`ResolverBase.ListenForEntityMessages: About to call MJGlobal.Instance.GetEventListener() to get the event listener subscription for ${uniqueKey}`
|
|
695
|
+
);
|
|
673
696
|
const theSub = MJGlobal.Instance.GetEventListener(false).subscribe(async (event: MJEvent) => {
|
|
674
697
|
if (event) {
|
|
675
698
|
const baseEntity = <BaseEntity>event.args?.baseEntity;
|
|
676
699
|
const baseEntityValues = baseEntity ? baseEntity.GetAll() : null;
|
|
677
|
-
const eventToLog = {
|
|
678
|
-
|
|
700
|
+
const eventToLog = {
|
|
701
|
+
entityName: entityObject.EntityInfo.Name,
|
|
702
|
+
baseEntity: baseEntityValues,
|
|
703
|
+
event: event.event,
|
|
704
|
+
eventCode: event.eventCode,
|
|
705
|
+
};
|
|
706
|
+
LogDebug(
|
|
707
|
+
`ResolverBase.ListenForEntityMessages: Received Event from within MJGlobal.Instance.GetEventListener() callback. Will call EmitCloudEvent() next\nEvent data:\n${JSON.stringify(eventToLog)}`
|
|
708
|
+
);
|
|
679
709
|
await this.EmitCloudEvent(event);
|
|
680
|
-
LogDebug(`ResolverBase.ListenForEntityMessages: EmitCloudEvent() completed successfully`);
|
|
710
|
+
LogDebug(`ResolverBase.ListenForEntityMessages: EmitCloudEvent() completed successfully`);
|
|
681
711
|
|
|
682
712
|
if (event.args && event.args instanceof BaseEntityEvent) {
|
|
683
713
|
const baseEntityEvent = event.args as BaseEntityEvent;
|
|
@@ -700,7 +730,13 @@ export class ResolverBase {
|
|
|
700
730
|
}
|
|
701
731
|
}
|
|
702
732
|
|
|
703
|
-
protected async CreateRecord(
|
|
733
|
+
protected async CreateRecord(
|
|
734
|
+
entityName: string,
|
|
735
|
+
input: any,
|
|
736
|
+
provider: DatabaseProviderBase,
|
|
737
|
+
userPayload: UserPayload,
|
|
738
|
+
pubSub: PubSubEngine
|
|
739
|
+
) {
|
|
704
740
|
if (await this.BeforeCreate(provider, input)) {
|
|
705
741
|
// fire event and proceed if it wasn't cancelled
|
|
706
742
|
const entityObject = await provider.GetEntityObject(entityName, this.GetUserFromPayload(userPayload));
|
|
@@ -726,7 +762,13 @@ export class ResolverBase {
|
|
|
726
762
|
}
|
|
727
763
|
protected async AfterCreate(provider: DatabaseProviderBase, input: any) {}
|
|
728
764
|
|
|
729
|
-
protected async UpdateRecord(
|
|
765
|
+
protected async UpdateRecord(
|
|
766
|
+
entityName: string,
|
|
767
|
+
input: any,
|
|
768
|
+
provider: DatabaseProviderBase,
|
|
769
|
+
userPayload: UserPayload,
|
|
770
|
+
pubSub: PubSubEngine
|
|
771
|
+
) {
|
|
730
772
|
if (await this.BeforeUpdate(provider, input)) {
|
|
731
773
|
// fire event and proceed if it wasn't cancelled
|
|
732
774
|
const userInfo = this.GetUserFromPayload(userPayload);
|
|
@@ -779,11 +821,11 @@ export class ResolverBase {
|
|
|
779
821
|
}
|
|
780
822
|
|
|
781
823
|
this.ListenForEntityMessages(entityObject, pubSub, userPayload);
|
|
782
|
-
|
|
824
|
+
|
|
783
825
|
if (await entityObject.Save()) {
|
|
784
826
|
// save worked, fire afterevent and return all the data
|
|
785
827
|
await this.AfterUpdate(provider, input); // fire event
|
|
786
|
-
|
|
828
|
+
|
|
787
829
|
return this.MapFieldNamesToCodeNames(entityName, entityObject.GetAll());
|
|
788
830
|
} else {
|
|
789
831
|
throw new GraphQLError(entityObject.LatestResult?.Message ?? 'Unknown error', {
|
|
@@ -795,7 +837,7 @@ export class ResolverBase {
|
|
|
795
837
|
extensions: { code: 'SAVE_ENTITY_ERROR', entityName },
|
|
796
838
|
});
|
|
797
839
|
}
|
|
798
|
-
|
|
840
|
+
|
|
799
841
|
/**
|
|
800
842
|
* This routine compares the OldValues property in the input object to the values in the DB that we just loaded. If there are differences, we need to check to see if the client
|
|
801
843
|
* is trying to update any of those fields (e.g. overlap). If there is overlap, we throw an error. If there is no overlap, we can proceed with the update even if the DB Values
|
|
@@ -819,8 +861,7 @@ export class ResolverBase {
|
|
|
819
861
|
case EntityFieldTSType.Number:
|
|
820
862
|
if (val == null && val == undefined) {
|
|
821
863
|
val = null;
|
|
822
|
-
}
|
|
823
|
-
else {
|
|
864
|
+
} else {
|
|
824
865
|
let typeLowered = (field.Type as string).toLowerCase();
|
|
825
866
|
|
|
826
867
|
switch (typeLowered) {
|
|
@@ -921,7 +962,7 @@ export class ResolverBase {
|
|
|
921
962
|
DBDifferences: dbDifferences,
|
|
922
963
|
Overlap: overlap,
|
|
923
964
|
};
|
|
924
|
-
|
|
965
|
+
|
|
925
966
|
// Log as warning to console and ErrorLog table instead of throwing error
|
|
926
967
|
console.warn('Entity save inconsistency detected but allowing save to continue:', JSON.stringify(msg));
|
|
927
968
|
LogError({
|
|
@@ -932,8 +973,8 @@ export class ResolverBase {
|
|
|
932
973
|
entityName: entityObject.EntityInfo.Name,
|
|
933
974
|
clientDifferences: clientDifferences,
|
|
934
975
|
dbDifferences: dbDifferences,
|
|
935
|
-
overlap: overlap
|
|
936
|
-
}
|
|
976
|
+
overlap: overlap,
|
|
977
|
+
},
|
|
937
978
|
});
|
|
938
979
|
|
|
939
980
|
// Create ErrorLog record in the database
|
|
@@ -945,7 +986,7 @@ export class ResolverBase {
|
|
|
945
986
|
errorLogEntity.Status = 'Warning';
|
|
946
987
|
errorLogEntity.Category = 'Entity Save';
|
|
947
988
|
errorLogEntity.CreatedBy = contextUser.Email || contextUser.Name;
|
|
948
|
-
|
|
989
|
+
|
|
949
990
|
const saveResult = await errorLogEntity.Save();
|
|
950
991
|
if (!saveResult) {
|
|
951
992
|
console.error('Failed to save ErrorLog record');
|
|
@@ -976,7 +1017,7 @@ export class ResolverBase {
|
|
|
976
1017
|
const returnValue = entityObject.GetAll(); // grab the values before we delete so we can return last state before delete if we are successful.
|
|
977
1018
|
|
|
978
1019
|
this.ListenForEntityMessages(entityObject, pubSub, userPayload);
|
|
979
|
-
|
|
1020
|
+
|
|
980
1021
|
if (await entityObject.Delete(options)) {
|
|
981
1022
|
await this.AfterDelete(provider, key); // fire event
|
|
982
1023
|
return returnValue;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Arg, Ctx, Field, InputType, Int, ObjectType, PubSubEngine, Query, Resolver } from 'type-graphql';
|
|
2
2
|
import { AppContext } from '../types.js';
|
|
3
3
|
import { ResolverBase } from './ResolverBase.js';
|
|
4
|
-
import { LogError, LogStatus, EntityInfo } from '@memberjunction/
|
|
4
|
+
import { LogError, LogStatus, EntityInfo } from '@memberjunction/global';
|
|
5
5
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
6
6
|
import { GetReadOnlyProvider } from '../util.js';
|
|
7
7
|
import { UserViewEntityExtended } from '@memberjunction/core-entities';
|
|
@@ -385,8 +385,8 @@ export class RunViewGenericInput {
|
|
|
385
385
|
|
|
386
386
|
@ObjectType()
|
|
387
387
|
export class RunViewResultRow {
|
|
388
|
-
@Field(() => [KeyValuePairOutputType], {
|
|
389
|
-
description: 'Primary key values for the record'
|
|
388
|
+
@Field(() => [KeyValuePairOutputType], {
|
|
389
|
+
description: 'Primary key values for the record',
|
|
390
390
|
})
|
|
391
391
|
PrimaryKey: KeyValuePairOutputType[];
|
|
392
392
|
|
|
@@ -399,8 +399,8 @@ export class RunViewResultRow {
|
|
|
399
399
|
|
|
400
400
|
@ObjectType()
|
|
401
401
|
export class RunViewGenericResultRow {
|
|
402
|
-
@Field(() => [KeyValuePairOutputType], {
|
|
403
|
-
description: 'Primary key values for the record'
|
|
402
|
+
@Field(() => [KeyValuePairOutputType], {
|
|
403
|
+
description: 'Primary key values for the record',
|
|
404
404
|
})
|
|
405
405
|
PrimaryKey: KeyValuePairOutputType[];
|
|
406
406
|
|
|
@@ -470,10 +470,11 @@ export class RunViewResolver extends ResolverBase {
|
|
|
470
470
|
try {
|
|
471
471
|
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
472
472
|
const rawData = await super.RunViewByNameGeneric(input, provider, userPayload, pubSub);
|
|
473
|
-
if (rawData === null)
|
|
474
|
-
return null;
|
|
473
|
+
if (rawData === null) return null;
|
|
475
474
|
|
|
476
|
-
const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
|
|
475
|
+
const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
|
|
476
|
+
await super.findBy<UserViewEntityExtended>(provider, 'User Views', { Name: input.ViewName }, userPayload.userRecord)
|
|
477
|
+
);
|
|
477
478
|
const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
|
|
478
479
|
const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
|
|
479
480
|
return {
|
|
@@ -498,10 +499,11 @@ export class RunViewResolver extends ResolverBase {
|
|
|
498
499
|
try {
|
|
499
500
|
const provider = GetReadOnlyProvider(providers, { allowFallbackToReadWrite: true });
|
|
500
501
|
const rawData = await super.RunViewByIDGeneric(input, provider, userPayload, pubSub);
|
|
501
|
-
if (rawData === null)
|
|
502
|
-
return null;
|
|
502
|
+
if (rawData === null) return null;
|
|
503
503
|
|
|
504
|
-
const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
|
|
504
|
+
const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
|
|
505
|
+
await super.findBy<UserViewEntityExtended>(provider, 'User Views', { ID: input.ViewID }, userPayload.userRecord)
|
|
506
|
+
);
|
|
505
507
|
const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
|
|
506
508
|
const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
|
|
507
509
|
return {
|
|
@@ -595,7 +597,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
595
597
|
ErrorMessage: `Failed to execute view: ${input.ViewName}`,
|
|
596
598
|
RowCount: 0,
|
|
597
599
|
TotalRowCount: 0,
|
|
598
|
-
ExecutionTime: 0
|
|
600
|
+
ExecutionTime: 0,
|
|
599
601
|
};
|
|
600
602
|
}
|
|
601
603
|
|
|
@@ -620,7 +622,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
620
622
|
ErrorMessage: errorMessage,
|
|
621
623
|
RowCount: 0,
|
|
622
624
|
TotalRowCount: 0,
|
|
623
|
-
ExecutionTime: 0
|
|
625
|
+
ExecutionTime: 0,
|
|
624
626
|
};
|
|
625
627
|
}
|
|
626
628
|
}
|
|
@@ -642,11 +644,13 @@ export class RunViewResolver extends ResolverBase {
|
|
|
642
644
|
ErrorMessage: `Failed to execute view with ID: ${input.ViewID}`,
|
|
643
645
|
RowCount: 0,
|
|
644
646
|
TotalRowCount: 0,
|
|
645
|
-
ExecutionTime: 0
|
|
647
|
+
ExecutionTime: 0,
|
|
646
648
|
};
|
|
647
649
|
}
|
|
648
650
|
|
|
649
|
-
const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
|
|
651
|
+
const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(
|
|
652
|
+
await super.findBy<UserViewEntityExtended>(provider, 'User Views', { ID: input.ViewID }, userPayload.userRecord)
|
|
653
|
+
);
|
|
650
654
|
const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
|
|
651
655
|
const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
|
|
652
656
|
return {
|
|
@@ -667,7 +671,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
667
671
|
ErrorMessage: errorMessage,
|
|
668
672
|
RowCount: 0,
|
|
669
673
|
TotalRowCount: 0,
|
|
670
|
-
ExecutionTime: 0
|
|
674
|
+
ExecutionTime: 0,
|
|
671
675
|
};
|
|
672
676
|
}
|
|
673
677
|
}
|
|
@@ -689,7 +693,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
689
693
|
ErrorMessage: 'Failed to execute dynamic view',
|
|
690
694
|
RowCount: 0,
|
|
691
695
|
TotalRowCount: 0,
|
|
692
|
-
ExecutionTime: 0
|
|
696
|
+
ExecutionTime: 0,
|
|
693
697
|
};
|
|
694
698
|
}
|
|
695
699
|
|
|
@@ -703,7 +707,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
703
707
|
ErrorMessage: errorMsg,
|
|
704
708
|
RowCount: 0,
|
|
705
709
|
TotalRowCount: 0,
|
|
706
|
-
ExecutionTime: 0
|
|
710
|
+
ExecutionTime: 0,
|
|
707
711
|
};
|
|
708
712
|
}
|
|
709
713
|
const returnData = this.processRawData(rawData.Results, entity.ID, entity);
|
|
@@ -725,7 +729,7 @@ export class RunViewResolver extends ResolverBase {
|
|
|
725
729
|
ErrorMessage: errorMessage,
|
|
726
730
|
RowCount: 0,
|
|
727
731
|
TotalRowCount: 0,
|
|
728
|
-
ExecutionTime: 0
|
|
732
|
+
ExecutionTime: 0,
|
|
729
733
|
};
|
|
730
734
|
}
|
|
731
735
|
}
|
|
@@ -775,13 +779,13 @@ export class RunViewResolver extends ResolverBase {
|
|
|
775
779
|
const returnResult = [];
|
|
776
780
|
for (let i = 0; i < rawData.length; i++) {
|
|
777
781
|
const row = rawData[i];
|
|
778
|
-
|
|
782
|
+
|
|
779
783
|
// Build the primary key array from the entity's primary key fields
|
|
780
|
-
const primaryKey: KeyValuePairOutputType[] = entityInfo.PrimaryKeys.map(pk => ({
|
|
784
|
+
const primaryKey: KeyValuePairOutputType[] = entityInfo.PrimaryKeys.map((pk) => ({
|
|
781
785
|
FieldName: pk.Name,
|
|
782
|
-
Value: row[pk.Name]?.toString() || ''
|
|
786
|
+
Value: row[pk.Name]?.toString() || '',
|
|
783
787
|
}));
|
|
784
|
-
|
|
788
|
+
|
|
785
789
|
returnResult.push({
|
|
786
790
|
PrimaryKey: primaryKey,
|
|
787
791
|
EntityID: entityId,
|