@memberjunction/server 2.80.1 → 2.82.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/generated/generated.d.ts +45 -6
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +215 -19
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +4 -2
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +8 -0
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +67 -14
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts +6 -4
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +51 -17
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/package.json +35 -35
- package/src/generated/generated.ts +137 -19
- package/src/generic/ResolverBase.ts +4 -2
- package/src/resolvers/CreateQueryResolver.ts +49 -14
- package/src/resolvers/QueryResolver.ts +43 -14
|
@@ -154,7 +154,8 @@ export class ResolverBase {
|
|
|
154
154
|
|
|
155
155
|
async RunViewByIDGeneric(viewInput: RunViewByIDInput, provider: DatabaseProviderBase, userPayload: UserPayload, pubSub: PubSubEngine) {
|
|
156
156
|
try {
|
|
157
|
-
const
|
|
157
|
+
const contextUser = this.GetUserFromPayload(userPayload);
|
|
158
|
+
const viewInfo = await provider.GetEntityObject<UserViewEntity>('User Views', contextUser);
|
|
158
159
|
await viewInfo.Load(viewInput.ViewID);
|
|
159
160
|
return this.RunViewGenericInternal(
|
|
160
161
|
provider,
|
|
@@ -223,6 +224,7 @@ export class ResolverBase {
|
|
|
223
224
|
userPayload: UserPayload
|
|
224
225
|
) {
|
|
225
226
|
const md = provider;
|
|
227
|
+
const contextUser = this.GetUserFromPayload(userPayload);
|
|
226
228
|
let params: RunViewGenericParams[] = [];
|
|
227
229
|
for (const viewInput of viewInputs) {
|
|
228
230
|
try {
|
|
@@ -231,7 +233,7 @@ export class ResolverBase {
|
|
|
231
233
|
if (viewInput.ViewName) {
|
|
232
234
|
viewInfo = this.safeFirstArrayElement(await this.findBy(provider, 'User Views', { Name: viewInput.ViewName }, userPayload.userRecord));
|
|
233
235
|
} else if (viewInput.ViewID) {
|
|
234
|
-
viewInfo = await provider.GetEntityObject<UserViewEntity>('User Views');
|
|
236
|
+
viewInfo = await provider.GetEntityObject<UserViewEntity>('User Views', contextUser);
|
|
235
237
|
await viewInfo.Load(viewInput.ViewID);
|
|
236
238
|
} else if (viewInput.EntityName) {
|
|
237
239
|
const entity = md.Entities.find((e) => e.Name === viewInput.EntityName);
|
|
@@ -70,6 +70,18 @@ export class CreateQuerySystemUserInput {
|
|
|
70
70
|
@Field(() => Boolean, { nullable: true })
|
|
71
71
|
UsesTemplate?: boolean;
|
|
72
72
|
|
|
73
|
+
@Field(() => Boolean, { nullable: true })
|
|
74
|
+
AuditQueryRuns?: boolean;
|
|
75
|
+
|
|
76
|
+
@Field(() => Boolean, { nullable: true })
|
|
77
|
+
CacheEnabled?: boolean;
|
|
78
|
+
|
|
79
|
+
@Field(() => Number, { nullable: true })
|
|
80
|
+
CacheTTLMinutes?: number;
|
|
81
|
+
|
|
82
|
+
@Field(() => Number, { nullable: true })
|
|
83
|
+
CacheMaxSize?: number;
|
|
84
|
+
|
|
73
85
|
@Field(() => [QueryPermissionInputType], { nullable: true })
|
|
74
86
|
Permissions?: QueryPermissionInputType[];
|
|
75
87
|
}
|
|
@@ -118,6 +130,18 @@ export class UpdateQuerySystemUserInput {
|
|
|
118
130
|
@Field(() => Boolean, { nullable: true })
|
|
119
131
|
UsesTemplate?: boolean;
|
|
120
132
|
|
|
133
|
+
@Field(() => Boolean, { nullable: true })
|
|
134
|
+
AuditQueryRuns?: boolean;
|
|
135
|
+
|
|
136
|
+
@Field(() => Boolean, { nullable: true })
|
|
137
|
+
CacheEnabled?: boolean;
|
|
138
|
+
|
|
139
|
+
@Field(() => Number, { nullable: true })
|
|
140
|
+
CacheTTLMinutes?: number;
|
|
141
|
+
|
|
142
|
+
@Field(() => Number, { nullable: true })
|
|
143
|
+
CacheMaxSize?: number;
|
|
144
|
+
|
|
121
145
|
@Field(() => [QueryPermissionInputType], { nullable: true })
|
|
122
146
|
Permissions?: QueryPermissionInputType[];
|
|
123
147
|
}
|
|
@@ -305,7 +329,11 @@ export class QueryResolverExtended extends QueryResolver {
|
|
|
305
329
|
CategoryID: finalCategoryID || input.CategoryID,
|
|
306
330
|
Status: input.Status || 'Approved',
|
|
307
331
|
QualityRank: input.QualityRank || 0,
|
|
308
|
-
UsesTemplate: input.UsesTemplate || false
|
|
332
|
+
UsesTemplate: input.UsesTemplate || false,
|
|
333
|
+
AuditQueryRuns: input.AuditQueryRuns || false,
|
|
334
|
+
CacheEnabled: input.CacheEnabled || false,
|
|
335
|
+
CacheTTLMinutes: input.CacheTTLMinutes || null,
|
|
336
|
+
CacheMaxSize: input.CacheMaxSize || null
|
|
309
337
|
};
|
|
310
338
|
// Remove Permissions from the fields to set since we handle them separately
|
|
311
339
|
delete (fieldsToSet as any).Permissions;
|
|
@@ -407,18 +435,26 @@ export class QueryResolverExtended extends QueryResolver {
|
|
|
407
435
|
}
|
|
408
436
|
|
|
409
437
|
// Update fields that were provided
|
|
410
|
-
|
|
411
|
-
if (
|
|
412
|
-
if (
|
|
413
|
-
if (input.
|
|
414
|
-
if (input.
|
|
415
|
-
if (input.
|
|
416
|
-
if (input.
|
|
417
|
-
if (input.
|
|
418
|
-
if (input.
|
|
419
|
-
if (input.
|
|
420
|
-
if (input.
|
|
421
|
-
if (input.
|
|
438
|
+
const updateFields: Record<string, any> = {};
|
|
439
|
+
if (input.Name !== undefined) updateFields.Name = input.Name;
|
|
440
|
+
if (finalCategoryID !== undefined) updateFields.CategoryID = finalCategoryID;
|
|
441
|
+
if (input.UserQuestion !== undefined) updateFields.UserQuestion = input.UserQuestion;
|
|
442
|
+
if (input.Description !== undefined) updateFields.Description = input.Description;
|
|
443
|
+
if (input.SQL !== undefined) updateFields.SQL = input.SQL;
|
|
444
|
+
if (input.TechnicalDescription !== undefined) updateFields.TechnicalDescription = input.TechnicalDescription;
|
|
445
|
+
if (input.OriginalSQL !== undefined) updateFields.OriginalSQL = input.OriginalSQL;
|
|
446
|
+
if (input.Feedback !== undefined) updateFields.Feedback = input.Feedback;
|
|
447
|
+
if (input.Status !== undefined) updateFields.Status = input.Status;
|
|
448
|
+
if (input.QualityRank !== undefined) updateFields.QualityRank = input.QualityRank;
|
|
449
|
+
if (input.ExecutionCostRank !== undefined) updateFields.ExecutionCostRank = input.ExecutionCostRank;
|
|
450
|
+
if (input.UsesTemplate !== undefined) updateFields.UsesTemplate = input.UsesTemplate;
|
|
451
|
+
if (input.AuditQueryRuns !== undefined) updateFields.AuditQueryRuns = input.AuditQueryRuns;
|
|
452
|
+
if (input.CacheEnabled !== undefined) updateFields.CacheEnabled = input.CacheEnabled;
|
|
453
|
+
if (input.CacheTTLMinutes !== undefined) updateFields.CacheTTLMinutes = input.CacheTTLMinutes;
|
|
454
|
+
if (input.CacheMaxSize !== undefined) updateFields.CacheMaxSize = input.CacheMaxSize;
|
|
455
|
+
|
|
456
|
+
// Use SetMany to update all fields at once
|
|
457
|
+
queryEntity.SetMany(updateFields);
|
|
422
458
|
|
|
423
459
|
// Save the updated query
|
|
424
460
|
const saveResult = await queryEntity.Save();
|
|
@@ -465,7 +501,6 @@ export class QueryResolverExtended extends QueryResolver {
|
|
|
465
501
|
SQLBaseType: f.SQLBaseType || undefined,
|
|
466
502
|
SQLFullType: f.SQLFullType || undefined,
|
|
467
503
|
IsComputed: f.IsComputed,
|
|
468
|
-
ComputationEnabled: true, // Default to true as it's not in QueryFieldInfo
|
|
469
504
|
ComputationDescription: f.ComputationDescription || undefined
|
|
470
505
|
}));
|
|
471
506
|
|
|
@@ -3,7 +3,6 @@ import { RunQuery, QueryInfo } from '@memberjunction/core';
|
|
|
3
3
|
import { AppContext } from '../types.js';
|
|
4
4
|
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
5
5
|
import { GraphQLJSONObject } from 'graphql-type-json';
|
|
6
|
-
import { QueryEntity } from '@memberjunction/core-entities';
|
|
7
6
|
import { Metadata } from '@memberjunction/core';
|
|
8
7
|
|
|
9
8
|
@ObjectType()
|
|
@@ -34,6 +33,12 @@ export class RunQueryResultType {
|
|
|
34
33
|
|
|
35
34
|
@Field(() => String, { nullable: true })
|
|
36
35
|
AppliedParameters?: string;
|
|
36
|
+
|
|
37
|
+
@Field(() => Boolean, { nullable: true })
|
|
38
|
+
CacheHit?: boolean;
|
|
39
|
+
|
|
40
|
+
@Field(() => Int, { nullable: true })
|
|
41
|
+
CacheTTLRemaining?: number;
|
|
37
42
|
}
|
|
38
43
|
|
|
39
44
|
@Resolver()
|
|
@@ -79,9 +84,11 @@ export class RunQueryResolver {
|
|
|
79
84
|
@Arg('CategoryPath', () => String, {nullable: true}) CategoryPath?: string,
|
|
80
85
|
@Arg('Parameters', () => GraphQLJSONObject, {nullable: true}) Parameters?: Record<string, any>,
|
|
81
86
|
@Arg('MaxRows', () => Int, {nullable: true}) MaxRows?: number,
|
|
82
|
-
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number
|
|
87
|
+
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number,
|
|
88
|
+
@Arg('ForceAuditLog', () => Boolean, {nullable: true}) ForceAuditLog?: boolean,
|
|
89
|
+
@Arg('AuditLogDescription', () => String, {nullable: true}) AuditLogDescription?: string): Promise<RunQueryResultType> {
|
|
83
90
|
const runQuery = new RunQuery();
|
|
84
|
-
console.log('GetQueryData called with:', { QueryID, Parameters, MaxRows, StartRow });
|
|
91
|
+
console.log('GetQueryData called with:', { QueryID, Parameters, MaxRows, StartRow, ForceAuditLog, AuditLogDescription });
|
|
85
92
|
const result = await runQuery.RunQuery(
|
|
86
93
|
{
|
|
87
94
|
QueryID: QueryID,
|
|
@@ -89,7 +96,9 @@ export class RunQueryResolver {
|
|
|
89
96
|
CategoryPath: CategoryPath,
|
|
90
97
|
Parameters: Parameters,
|
|
91
98
|
MaxRows: MaxRows,
|
|
92
|
-
StartRow: StartRow
|
|
99
|
+
StartRow: StartRow,
|
|
100
|
+
ForceAuditLog: ForceAuditLog,
|
|
101
|
+
AuditLogDescription: AuditLogDescription
|
|
93
102
|
},
|
|
94
103
|
context.userPayload.userRecord);
|
|
95
104
|
console.log('RunQuery result:', {
|
|
@@ -120,7 +129,9 @@ export class RunQueryResolver {
|
|
|
120
129
|
TotalRowCount: result.TotalRowCount ?? 0,
|
|
121
130
|
ExecutionTime: result.ExecutionTime ?? 0,
|
|
122
131
|
ErrorMessage: result.ErrorMessage || '',
|
|
123
|
-
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined
|
|
132
|
+
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined,
|
|
133
|
+
CacheHit: (result as any).CacheHit,
|
|
134
|
+
CacheTTLRemaining: (result as any).CacheTTLRemaining
|
|
124
135
|
};
|
|
125
136
|
}
|
|
126
137
|
|
|
@@ -131,7 +142,9 @@ export class RunQueryResolver {
|
|
|
131
142
|
@Arg('CategoryPath', () => String, {nullable: true}) CategoryPath?: string,
|
|
132
143
|
@Arg('Parameters', () => GraphQLJSONObject, {nullable: true}) Parameters?: Record<string, any>,
|
|
133
144
|
@Arg('MaxRows', () => Int, {nullable: true}) MaxRows?: number,
|
|
134
|
-
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number
|
|
145
|
+
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number,
|
|
146
|
+
@Arg('ForceAuditLog', () => Boolean, {nullable: true}) ForceAuditLog?: boolean,
|
|
147
|
+
@Arg('AuditLogDescription', () => String, {nullable: true}) AuditLogDescription?: string): Promise<RunQueryResultType> {
|
|
135
148
|
const runQuery = new RunQuery();
|
|
136
149
|
const result = await runQuery.RunQuery(
|
|
137
150
|
{
|
|
@@ -140,7 +153,9 @@ export class RunQueryResolver {
|
|
|
140
153
|
CategoryPath: CategoryPath,
|
|
141
154
|
Parameters: Parameters,
|
|
142
155
|
MaxRows: MaxRows,
|
|
143
|
-
StartRow: StartRow
|
|
156
|
+
StartRow: StartRow,
|
|
157
|
+
ForceAuditLog: ForceAuditLog,
|
|
158
|
+
AuditLogDescription: AuditLogDescription
|
|
144
159
|
},
|
|
145
160
|
context.userPayload.userRecord);
|
|
146
161
|
|
|
@@ -153,7 +168,9 @@ export class RunQueryResolver {
|
|
|
153
168
|
TotalRowCount: result.TotalRowCount ?? 0,
|
|
154
169
|
ExecutionTime: result.ExecutionTime ?? 0,
|
|
155
170
|
ErrorMessage: result.ErrorMessage || '',
|
|
156
|
-
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined
|
|
171
|
+
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined,
|
|
172
|
+
CacheHit: (result as any).CacheHit,
|
|
173
|
+
CacheTTLRemaining: (result as any).CacheTTLRemaining
|
|
157
174
|
};
|
|
158
175
|
}
|
|
159
176
|
|
|
@@ -165,7 +182,9 @@ export class RunQueryResolver {
|
|
|
165
182
|
@Arg('CategoryPath', () => String, {nullable: true}) CategoryPath?: string,
|
|
166
183
|
@Arg('Parameters', () => GraphQLJSONObject, {nullable: true}) Parameters?: Record<string, any>,
|
|
167
184
|
@Arg('MaxRows', () => Int, {nullable: true}) MaxRows?: number,
|
|
168
|
-
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number
|
|
185
|
+
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number,
|
|
186
|
+
@Arg('ForceAuditLog', () => Boolean, {nullable: true}) ForceAuditLog?: boolean,
|
|
187
|
+
@Arg('AuditLogDescription', () => String, {nullable: true}) AuditLogDescription?: string): Promise<RunQueryResultType> {
|
|
169
188
|
const runQuery = new RunQuery();
|
|
170
189
|
const result = await runQuery.RunQuery(
|
|
171
190
|
{
|
|
@@ -174,7 +193,9 @@ export class RunQueryResolver {
|
|
|
174
193
|
CategoryPath: CategoryPath,
|
|
175
194
|
Parameters: Parameters,
|
|
176
195
|
MaxRows: MaxRows,
|
|
177
|
-
StartRow: StartRow
|
|
196
|
+
StartRow: StartRow,
|
|
197
|
+
ForceAuditLog: ForceAuditLog,
|
|
198
|
+
AuditLogDescription: AuditLogDescription
|
|
178
199
|
},
|
|
179
200
|
context.userPayload.userRecord);
|
|
180
201
|
|
|
@@ -200,7 +221,9 @@ export class RunQueryResolver {
|
|
|
200
221
|
TotalRowCount: result.TotalRowCount ?? 0,
|
|
201
222
|
ExecutionTime: result.ExecutionTime ?? 0,
|
|
202
223
|
ErrorMessage: result.ErrorMessage || '',
|
|
203
|
-
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined
|
|
224
|
+
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined,
|
|
225
|
+
CacheHit: (result as any).CacheHit,
|
|
226
|
+
CacheTTLRemaining: (result as any).CacheTTLRemaining
|
|
204
227
|
};
|
|
205
228
|
}
|
|
206
229
|
|
|
@@ -212,7 +235,9 @@ export class RunQueryResolver {
|
|
|
212
235
|
@Arg('CategoryPath', () => String, {nullable: true}) CategoryPath?: string,
|
|
213
236
|
@Arg('Parameters', () => GraphQLJSONObject, {nullable: true}) Parameters?: Record<string, any>,
|
|
214
237
|
@Arg('MaxRows', () => Int, {nullable: true}) MaxRows?: number,
|
|
215
|
-
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number
|
|
238
|
+
@Arg('StartRow', () => Int, {nullable: true}) StartRow?: number,
|
|
239
|
+
@Arg('ForceAuditLog', () => Boolean, {nullable: true}) ForceAuditLog?: boolean,
|
|
240
|
+
@Arg('AuditLogDescription', () => String, {nullable: true}) AuditLogDescription?: string): Promise<RunQueryResultType> {
|
|
216
241
|
const runQuery = new RunQuery();
|
|
217
242
|
const result = await runQuery.RunQuery(
|
|
218
243
|
{
|
|
@@ -221,7 +246,9 @@ export class RunQueryResolver {
|
|
|
221
246
|
CategoryPath: CategoryPath,
|
|
222
247
|
Parameters: Parameters,
|
|
223
248
|
MaxRows: MaxRows,
|
|
224
|
-
StartRow: StartRow
|
|
249
|
+
StartRow: StartRow,
|
|
250
|
+
ForceAuditLog: ForceAuditLog,
|
|
251
|
+
AuditLogDescription: AuditLogDescription
|
|
225
252
|
},
|
|
226
253
|
context.userPayload.userRecord);
|
|
227
254
|
|
|
@@ -234,7 +261,9 @@ export class RunQueryResolver {
|
|
|
234
261
|
TotalRowCount: result.TotalRowCount ?? 0,
|
|
235
262
|
ExecutionTime: result.ExecutionTime ?? 0,
|
|
236
263
|
ErrorMessage: result.ErrorMessage || '',
|
|
237
|
-
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined
|
|
264
|
+
AppliedParameters: result.AppliedParameters ? JSON.stringify(result.AppliedParameters) : undefined,
|
|
265
|
+
CacheHit: (result as any).CacheHit,
|
|
266
|
+
CacheTTLRemaining: (result as any).CacheTTLRemaining
|
|
238
267
|
};
|
|
239
268
|
}
|
|
240
269
|
}
|