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