@memberjunction/server 2.97.0 → 2.99.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.
@@ -1,10 +1,11 @@
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 } from '@memberjunction/core';
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';
8
+ import { KeyValuePairOutputType } from './KeyInputOutputTypes.js';
8
9
 
9
10
  /********************************************************************************
10
11
  * The PURPOSE of this resolver is to provide a generic way to run a view and return the results.
@@ -384,8 +385,10 @@ export class RunViewGenericInput {
384
385
 
385
386
  @ObjectType()
386
387
  export class RunViewResultRow {
387
- @Field(() => String)
388
- ID: string;
388
+ @Field(() => [KeyValuePairOutputType], {
389
+ description: 'Primary key values for the record'
390
+ })
391
+ PrimaryKey: KeyValuePairOutputType[];
389
392
 
390
393
  @Field(() => String)
391
394
  EntityID: string;
@@ -396,8 +399,10 @@ export class RunViewResultRow {
396
399
 
397
400
  @ObjectType()
398
401
  export class RunViewGenericResultRow {
399
- @Field(() => String)
400
- ID: string;
402
+ @Field(() => [KeyValuePairOutputType], {
403
+ description: 'Primary key values for the record'
404
+ })
405
+ PrimaryKey: KeyValuePairOutputType[];
401
406
 
402
407
  @Field(() => String)
403
408
  EntityID: string;
@@ -469,7 +474,8 @@ export class RunViewResolver extends ResolverBase {
469
474
  return null;
470
475
 
471
476
  const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { Name: input.ViewName }, userPayload.userRecord));
472
- const returnData = this.processRawData(rawData.Results, viewInfo.EntityID);
477
+ const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
478
+ const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
473
479
  return {
474
480
  Results: returnData,
475
481
  UserViewRunID: rawData?.UserViewRunID,
@@ -496,7 +502,8 @@ export class RunViewResolver extends ResolverBase {
496
502
  return null;
497
503
 
498
504
  const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
499
- const returnData = this.processRawData(rawData.Results, viewInfo.EntityID);
505
+ const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
506
+ const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
500
507
  return {
501
508
  Results: returnData,
502
509
  UserViewRunID: rawData?.UserViewRunID,
@@ -522,7 +529,7 @@ export class RunViewResolver extends ResolverBase {
522
529
  if (rawData === null) return null;
523
530
 
524
531
  const entity = provider.Entities.find((e) => e.Name === input.EntityName);
525
- const returnData = this.processRawData(rawData.Results, entity.ID);
532
+ const returnData = this.processRawData(rawData.Results, entity.ID, entity);
526
533
  return {
527
534
  Results: returnData,
528
535
  UserViewRunID: rawData?.UserViewRunID,
@@ -552,7 +559,7 @@ export class RunViewResolver extends ResolverBase {
552
559
  let results: RunViewGenericResult[] = [];
553
560
  for (const [index, data] of rawData.entries()) {
554
561
  const entity = provider.Entities.find((e) => e.Name === input[index].EntityName);
555
- const returnData: any[] = this.processRawData(data.Results, entity.ID);
562
+ const returnData: any[] = this.processRawData(data.Results, entity.ID, entity);
556
563
 
557
564
  results.push({
558
565
  Results: returnData,
@@ -594,7 +601,7 @@ export class RunViewResolver extends ResolverBase {
594
601
 
595
602
  const entity = provider.Entities.find((e) => e.Name === input.ViewName);
596
603
  const entityId = entity ? entity.ID : null;
597
- const returnData = this.processRawData(rawData.Results, entityId);
604
+ const returnData = this.processRawData(rawData.Results, entityId, entity);
598
605
  return {
599
606
  Results: returnData,
600
607
  UserViewRunID: rawData?.UserViewRunID,
@@ -640,7 +647,8 @@ export class RunViewResolver extends ResolverBase {
640
647
  }
641
648
 
642
649
  const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
643
- const returnData = this.processRawData(rawData.Results, viewInfo.EntityID);
650
+ const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
651
+ const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
644
652
  return {
645
653
  Results: returnData,
646
654
  UserViewRunID: rawData?.UserViewRunID,
@@ -698,7 +706,7 @@ export class RunViewResolver extends ResolverBase {
698
706
  ExecutionTime: 0
699
707
  };
700
708
  }
701
- const returnData = this.processRawData(rawData.Results, entity.ID);
709
+ const returnData = this.processRawData(rawData.Results, entity.ID, entity);
702
710
  return {
703
711
  Results: returnData,
704
712
  UserViewRunID: rawData?.UserViewRunID,
@@ -743,7 +751,7 @@ export class RunViewResolver extends ResolverBase {
743
751
  LogError(new Error(`Entity with name ${input[index].EntityName} not found`));
744
752
  continue;
745
753
  }
746
- const returnData: any[] = this.processRawData(data.Results, entity.ID);
754
+ const returnData: any[] = this.processRawData(data.Results, entity.ID, entity);
747
755
 
748
756
  results.push({
749
757
  Results: returnData,
@@ -763,12 +771,19 @@ export class RunViewResolver extends ResolverBase {
763
771
  }
764
772
  }
765
773
 
766
- protected processRawData(rawData: any[], entityId: string): RunViewResultRow[] {
774
+ protected processRawData(rawData: any[], entityId: string, entityInfo: EntityInfo): RunViewResultRow[] {
767
775
  const returnResult = [];
768
776
  for (let i = 0; i < rawData.length; i++) {
769
777
  const row = rawData[i];
778
+
779
+ // Build the primary key array from the entity's primary key fields
780
+ const primaryKey: KeyValuePairOutputType[] = entityInfo.PrimaryKeys.map(pk => ({
781
+ FieldName: pk.Name,
782
+ Value: row[pk.Name]?.toString() || ''
783
+ }));
784
+
770
785
  returnResult.push({
771
- ID: row.ID.toString(),
786
+ PrimaryKey: primaryKey,
772
787
  EntityID: entityId,
773
788
  Data: JSON.stringify(row),
774
789
  });
@@ -445,7 +445,9 @@ type BaseSkipRequest = {
445
445
  /** API key for the calling server */
446
446
  callingServerAPIKey: string,
447
447
  /** Access token for the calling server */
448
- callingServerAccessToken: string
448
+ callingServerAccessToken: string,
449
+ /** Email of the user making the request */
450
+ userEmail: string
449
451
  }
450
452
  /**
451
453
  * Resolver for Skip AI interactions
@@ -1054,6 +1056,7 @@ cycle.`);
1054
1056
  queries,
1055
1057
  notes,
1056
1058
  noteTypes,
1059
+ userEmail: contextUser.Email,
1057
1060
  requests,
1058
1061
  accessToken,
1059
1062
  organizationID: skipConfigInfo.orgID,
@@ -107,7 +107,7 @@ export class FileResolver extends FileResolverBase {
107
107
  @PubSub() pubSub: PubSubEngine
108
108
  ) {
109
109
  // if the name is changing, rename the target object as well
110
- const md = GetReadOnlyProvider(context.providers);
110
+ const md = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true});
111
111
  const user = this.GetUserFromPayload(context.userPayload);
112
112
  const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
113
113
  fileEntity.CheckPermissions(EntityPermissionType.Update, true);
@@ -135,7 +135,7 @@ export class FileResolver extends FileResolverBase {
135
135
  @Ctx() context: AppContext,
136
136
  @PubSub() pubSub: PubSubEngine
137
137
  ) {
138
- const md = GetReadOnlyProvider(context.providers);
138
+ const md = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true});
139
139
  const userInfo = this.GetUserFromPayload(context.userPayload);
140
140
 
141
141
  const fileEntity = await md.GetEntityObject<FileEntity>('Files', userInfo);