@memberjunction/server 4.4.0 → 5.0.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.
Files changed (115) hide show
  1. package/dist/agents/skip-agent.js +9 -9
  2. package/dist/agents/skip-agent.js.map +1 -1
  3. package/dist/apolloServer/TransactionPlugin.d.ts +4 -0
  4. package/dist/apolloServer/TransactionPlugin.d.ts.map +1 -0
  5. package/dist/apolloServer/TransactionPlugin.js +46 -0
  6. package/dist/apolloServer/TransactionPlugin.js.map +1 -0
  7. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  8. package/dist/auth/__tests__/backward-compatibility.test.d.ts +2 -0
  9. package/dist/auth/__tests__/backward-compatibility.test.d.ts.map +1 -0
  10. package/dist/auth/__tests__/backward-compatibility.test.js +135 -0
  11. package/dist/auth/__tests__/backward-compatibility.test.js.map +1 -0
  12. package/dist/auth/exampleNewUserSubClass.d.ts +2 -2
  13. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  14. package/dist/auth/index.js.map +1 -1
  15. package/dist/auth/newUsers.d.ts +2 -2
  16. package/dist/auth/newUsers.d.ts.map +1 -1
  17. package/dist/auth/newUsers.js +6 -6
  18. package/dist/auth/newUsers.js.map +1 -1
  19. package/dist/entitySubclasses/entityPermissions.server.d.ts +2 -2
  20. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  21. package/dist/entitySubclasses/entityPermissions.server.js +3 -3
  22. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  23. package/dist/generated/generated.d.ts +10724 -10721
  24. package/dist/generated/generated.d.ts.map +1 -1
  25. package/dist/generated/generated.js +48710 -48698
  26. package/dist/generated/generated.js.map +1 -1
  27. package/dist/generic/DeleteOptionsInput.d.ts +12 -2
  28. package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
  29. package/dist/generic/DeleteOptionsInput.js +12 -2
  30. package/dist/generic/DeleteOptionsInput.js.map +1 -1
  31. package/dist/generic/ResolverBase.d.ts.map +1 -1
  32. package/dist/generic/ResolverBase.js +6 -6
  33. package/dist/generic/ResolverBase.js.map +1 -1
  34. package/dist/generic/RunViewResolver.js +3 -3
  35. package/dist/generic/RunViewResolver.js.map +1 -1
  36. package/dist/resolvers/AskSkipResolver.d.ts +123 -0
  37. package/dist/resolvers/AskSkipResolver.d.ts.map +1 -0
  38. package/dist/resolvers/AskSkipResolver.js +1788 -0
  39. package/dist/resolvers/AskSkipResolver.js.map +1 -0
  40. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  41. package/dist/resolvers/CreateQueryResolver.d.ts +3 -3
  42. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  43. package/dist/resolvers/CreateQueryResolver.js +19 -19
  44. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  45. package/dist/resolvers/EntityResolver.js +1 -1
  46. package/dist/resolvers/EntityResolver.js.map +1 -1
  47. package/dist/resolvers/FileCategoryResolver.js +4 -4
  48. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  49. package/dist/resolvers/FileResolver.js +20 -20
  50. package/dist/resolvers/FileResolver.js.map +1 -1
  51. package/dist/resolvers/GetDataContextDataResolver.js +1 -1
  52. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  53. package/dist/resolvers/ISAEntityResolver.d.ts +22 -1
  54. package/dist/resolvers/ISAEntityResolver.d.ts.map +1 -1
  55. package/dist/resolvers/ISAEntityResolver.js +77 -1
  56. package/dist/resolvers/ISAEntityResolver.js.map +1 -1
  57. package/dist/resolvers/ReportResolver.js +3 -3
  58. package/dist/resolvers/ReportResolver.js.map +1 -1
  59. package/dist/resolvers/RunAIAgentResolver.js +3 -3
  60. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  61. package/dist/resolvers/RunAIPromptResolver.js +1 -1
  62. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  63. package/dist/resolvers/RunTemplateResolver.js +2 -2
  64. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  65. package/dist/resolvers/SyncDataResolver.js +1 -1
  66. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  67. package/dist/resolvers/SyncRolesUsersResolver.d.ts +9 -9
  68. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  69. package/dist/resolvers/SyncRolesUsersResolver.js +10 -10
  70. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  71. package/dist/resolvers/UserFavoriteResolver.js +2 -2
  72. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  73. package/dist/resolvers/UserResolver.js +8 -8
  74. package/dist/resolvers/UserResolver.js.map +1 -1
  75. package/dist/resolvers/UserViewResolver.js +5 -5
  76. package/dist/resolvers/UserViewResolver.js.map +1 -1
  77. package/dist/rest/ViewOperationsHandler.js +1 -1
  78. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  79. package/dist/scheduler/LearningCycleScheduler.d.ts +4 -0
  80. package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -0
  81. package/dist/scheduler/LearningCycleScheduler.js +4 -0
  82. package/dist/scheduler/LearningCycleScheduler.js.map +1 -0
  83. package/dist/services/TaskOrchestrator.d.ts +1 -1
  84. package/dist/services/TaskOrchestrator.js +5 -5
  85. package/dist/services/TaskOrchestrator.js.map +1 -1
  86. package/package.json +52 -52
  87. package/src/agents/skip-agent.ts +9 -9
  88. package/src/auth/APIKeyScopeAuth.ts +5 -5
  89. package/src/auth/exampleNewUserSubClass.ts +2 -2
  90. package/src/auth/index.ts +3 -3
  91. package/src/auth/newUsers.ts +9 -9
  92. package/src/entitySubclasses/entityPermissions.server.ts +3 -3
  93. package/src/generated/generated.ts +31186 -31177
  94. package/src/generic/DeleteOptionsInput.ts +12 -2
  95. package/src/generic/ResolverBase.ts +7 -7
  96. package/src/generic/RunViewResolver.ts +3 -3
  97. package/src/resolvers/APIKeyResolver.ts +2 -2
  98. package/src/resolvers/ComponentRegistryResolver.ts +9 -9
  99. package/src/resolvers/CreateQueryResolver.ts +18 -18
  100. package/src/resolvers/EntityResolver.ts +1 -1
  101. package/src/resolvers/FileCategoryResolver.ts +5 -5
  102. package/src/resolvers/FileResolver.ts +27 -27
  103. package/src/resolvers/GetDataContextDataResolver.ts +2 -2
  104. package/src/resolvers/ISAEntityResolver.ts +77 -1
  105. package/src/resolvers/ReportResolver.ts +4 -4
  106. package/src/resolvers/RunAIAgentResolver.ts +7 -7
  107. package/src/resolvers/RunAIPromptResolver.ts +1 -1
  108. package/src/resolvers/RunTemplateResolver.ts +4 -4
  109. package/src/resolvers/SyncDataResolver.ts +3 -3
  110. package/src/resolvers/SyncRolesUsersResolver.ts +26 -26
  111. package/src/resolvers/UserFavoriteResolver.ts +2 -2
  112. package/src/resolvers/UserResolver.ts +8 -8
  113. package/src/resolvers/UserViewResolver.ts +6 -6
  114. package/src/rest/ViewOperationsHandler.ts +1 -1
  115. package/src/services/TaskOrchestrator.ts +31 -31
@@ -1,8 +1,18 @@
1
1
  import { Field, InputType } from "type-graphql";
2
2
 
3
3
  /**
4
- * GraphQL InputType for the DeleteOptions.
5
- * Must be kept in sync with EntityDeleteOptions in @memberjunction/core.
4
+ * GraphQL InputType for entity delete operations.
5
+ *
6
+ * SYNC REQUIREMENTS - Changes here require updates to:
7
+ * 1. @memberjunction/core - EntityDeleteOptions class in interfaces.ts
8
+ * 2. @memberjunction/graphql-dataprovider - Delete method default options in graphQLDataProvider.ts
9
+ * 3. @memberjunction/graphql-dataprovider - DeleteQueryOptionsInput interface in graphQLSystemUserClient.ts
10
+ *
11
+ * TESTING: Schema sync tests in GraphQLDataProvider will fail if these files drift out of sync.
12
+ * Run: cd packages/GraphQLDataProvider && npm run test
13
+ *
14
+ * @see packages/MJCore/src/generic/interfaces.ts - EntityDeleteOptions class
15
+ * @see packages/GraphQLDataProvider/src/__tests__/schema-sync.test.ts - Automated sync verification
6
16
  */
7
17
  @InputType()
8
18
  export class DeleteOptionsInput {
@@ -17,7 +17,7 @@ import {
17
17
  RunViewResult,
18
18
  UserInfo,
19
19
  } from '@memberjunction/core';
20
- import { AuditLogEntity, ErrorLogEntity, UserViewEntityExtended } from '@memberjunction/core-entities';
20
+ import { MJAuditLogEntity, MJErrorLogEntity, UserViewEntityExtended } from '@memberjunction/core-entities';
21
21
  import { SQLServerDataProvider, UserCache } from '@memberjunction/sqlserver-dataprovider';
22
22
  import { PubSubEngine, AuthorizationError } from 'type-graphql';
23
23
  import { GraphQLError } from 'graphql';
@@ -275,7 +275,7 @@ export class ResolverBase {
275
275
 
276
276
  const rv = provider as any as IRunViewProvider;
277
277
  const result = await rv.RunView<UserViewEntityExtended>({
278
- EntityName: 'User Views',
278
+ EntityName: 'MJ: User Views',
279
279
  ExtraFilter: "Name='" + viewInput.ViewName + "'",
280
280
  }, userPayload.userRecord);
281
281
  if (result && result.Success && result.Results.length > 0) {
@@ -319,7 +319,7 @@ export class ResolverBase {
319
319
  }
320
320
 
321
321
  const contextUser = this.GetUserFromPayload(userPayload);
322
- const viewInfo = await provider.GetEntityObject<UserViewEntityExtended>('User Views', contextUser);
322
+ const viewInfo = await provider.GetEntityObject<UserViewEntityExtended>('MJ: User Views', contextUser);
323
323
  await viewInfo.Load(viewInput.ViewID);
324
324
  return this.RunViewGenericInternal(
325
325
  provider,
@@ -404,9 +404,9 @@ export class ResolverBase {
404
404
  let viewInfo: UserViewEntityExtended | null = null;
405
405
 
406
406
  if (viewInput.ViewName) {
407
- viewInfo = this.safeFirstArrayElement(await this.findBy(provider, 'User Views', { Name: viewInput.ViewName }, userPayload.userRecord));
407
+ viewInfo = this.safeFirstArrayElement(await this.findBy(provider, 'MJ: User Views', { Name: viewInput.ViewName }, userPayload.userRecord));
408
408
  } else if (viewInput.ViewID) {
409
- viewInfo = await provider.GetEntityObject<UserViewEntityExtended>('User Views', contextUser);
409
+ viewInfo = await provider.GetEntityObject<UserViewEntityExtended>('MJ: User Views', contextUser);
410
410
  await viewInfo.Load(viewInput.ViewID);
411
411
  } else if (viewInput.EntityName) {
412
412
  const entity = md.Entities.find((e) => e.Name === viewInput.EntityName);
@@ -879,7 +879,7 @@ export class ResolverBase {
879
879
  if (!userInfo) throw new Error(`User ${userPayload?.email} not found in metadata`);
880
880
  if (!auditLogType) throw new Error(`Audit Log Type ${auditLogTypeName} not found in metadata`);
881
881
 
882
- const auditLog = await md.GetEntityObject<AuditLogEntity>('Audit Logs', userInfo); // must pass user context on back end as we're not authenticated the same way as the front end
882
+ const auditLog = await md.GetEntityObject<MJAuditLogEntity>('MJ: Audit Logs', userInfo); // must pass user context on back end as we're not authenticated the same way as the front end
883
883
  auditLog.NewRecord();
884
884
  auditLog.UserID = userInfo.ID;
885
885
  auditLog.AuditLogTypeID = auditLogType.ID;
@@ -1255,7 +1255,7 @@ export class ResolverBase {
1255
1255
  // Create ErrorLog record in the database
1256
1256
  try {
1257
1257
  const md = new Metadata();
1258
- const errorLogEntity = await md.GetEntityObject<ErrorLogEntity>('Error Logs', contextUser);
1258
+ const errorLogEntity = await md.GetEntityObject<MJErrorLogEntity>('MJ: Error Logs', contextUser);
1259
1259
  errorLogEntity.Code = 'ENTITY_SAVE_INCONSISTENCY';
1260
1260
  errorLogEntity.Message = `Entity save inconsistency detected for ${entityObject.EntityInfo.Name}: ${JSON.stringify(msg)}`;
1261
1261
  errorLogEntity.Status = 'Warning';
@@ -652,7 +652,7 @@ export class RunViewResolver extends ResolverBase {
652
652
  if (rawData === null)
653
653
  return null;
654
654
 
655
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { Name: input.ViewName }, userPayload.userRecord));
655
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "MJ: User Views", { Name: input.ViewName }, userPayload.userRecord));
656
656
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
657
657
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
658
658
  return {
@@ -683,7 +683,7 @@ export class RunViewResolver extends ResolverBase {
683
683
  if (rawData === null)
684
684
  return null;
685
685
 
686
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
686
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "MJ: User Views", { ID: input.ViewID }, userPayload.userRecord));
687
687
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
688
688
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
689
689
  return {
@@ -837,7 +837,7 @@ export class RunViewResolver extends ResolverBase {
837
837
  };
838
838
  }
839
839
 
840
- const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "User Views", { ID: input.ViewID }, userPayload.userRecord));
840
+ const viewInfo = super.safeFirstArrayElement<UserViewEntityExtended>(await super.findBy<UserViewEntityExtended>(provider, "MJ: User Views", { ID: input.ViewID }, userPayload.userRecord));
841
841
  const entity = provider.Entities.find((e) => e.ID === viewInfo.EntityID);
842
842
  const returnData = this.processRawData(rawData.Results, viewInfo.EntityID, entity);
843
843
  return {
@@ -1,7 +1,7 @@
1
1
  import { Resolver, Mutation, Arg, Ctx } from "type-graphql";
2
2
  import { Field, InputType, ObjectType } from "type-graphql";
3
3
  import { LogError, Metadata } from "@memberjunction/core";
4
- import { APIKeyScopeEntity } from "@memberjunction/core-entities";
4
+ import { MJAPIKeyScopeEntity } from "@memberjunction/core-entities";
5
5
  import { GetAPIKeyEngine } from "@memberjunction/api-keys";
6
6
  import { AppContext } from "../types.js";
7
7
  import { ResolverBase } from "../generic/ResolverBase.js";
@@ -225,7 +225,7 @@ export class APIKeyResolver extends ResolverBase {
225
225
 
226
226
  for (const scopeId of scopeIds) {
227
227
  try {
228
- const keyScope = await md.GetEntityObject<APIKeyScopeEntity>(
228
+ const keyScope = await md.GetEntityObject<MJAPIKeyScopeEntity>(
229
229
  'MJ: API Key Scopes',
230
230
  user
231
231
  );
@@ -1,7 +1,7 @@
1
1
  import { Arg, Ctx, Field, InputType, ObjectType, Query, Mutation, Resolver } from 'type-graphql';
2
2
  import { UserInfo, Metadata, LogError, LogStatus } from '@memberjunction/core';
3
3
  import { UserCache } from '@memberjunction/sqlserver-dataprovider';
4
- import { ComponentEntity, ComponentRegistryEntity, ComponentMetadataEngine } from '@memberjunction/core-entities';
4
+ import { MJComponentEntity, MJComponentRegistryEntity, ComponentMetadataEngine } from '@memberjunction/core-entities';
5
5
  import { ComponentSpec } from '@memberjunction/interactive-component-types';
6
6
  import {
7
7
  ComponentRegistryClient,
@@ -393,7 +393,7 @@ export class ComponentRegistryExtendedResolver {
393
393
  /**
394
394
  * Get registry entity from database by ID
395
395
  */
396
- private async getRegistry(registryId: string, userInfo: UserInfo): Promise<ComponentRegistryEntity | null> {
396
+ private async getRegistry(registryId: string, userInfo: UserInfo): Promise<MJComponentRegistryEntity | null> {
397
397
  try {
398
398
  await this.componentEngine.Config(false, userInfo);
399
399
 
@@ -411,7 +411,7 @@ export class ComponentRegistryExtendedResolver {
411
411
  /**
412
412
  * Get registry entity from database by Name
413
413
  */
414
- private async getRegistryByName(registryName: string, userInfo: UserInfo): Promise<ComponentRegistryEntity | null> {
414
+ private async getRegistryByName(registryName: string, userInfo: UserInfo): Promise<MJComponentRegistryEntity | null> {
415
415
  try {
416
416
  await this.componentEngine.Config(false, userInfo);
417
417
 
@@ -431,7 +431,7 @@ export class ComponentRegistryExtendedResolver {
431
431
  * Environment variable format: REGISTRY_URI_OVERRIDE_<REGISTRY_NAME>
432
432
  * Example: REGISTRY_URI_OVERRIDE_MJ_CENTRAL=http://localhost:8080
433
433
  */
434
- private getRegistryUri(registry: ComponentRegistryEntity): string {
434
+ private getRegistryUri(registry: MJComponentRegistryEntity): string {
435
435
  if (!registry.Name) {
436
436
  return registry.URI || '';
437
437
  }
@@ -455,7 +455,7 @@ export class ComponentRegistryExtendedResolver {
455
455
  * Create a client for a registry on-demand
456
456
  * Checks configuration first, then falls back to default settings
457
457
  */
458
- private createClientForRegistry(registry: ComponentRegistryEntity): ComponentRegistryClient {
458
+ private createClientForRegistry(registry: MJComponentRegistryEntity): ComponentRegistryClient {
459
459
  // Check if there's a configuration for this registry
460
460
  const config = configInfo.componentRegistries?.find(r =>
461
461
  r.id === registry.ID || r.name === registry.Name
@@ -490,7 +490,7 @@ export class ComponentRegistryExtendedResolver {
490
490
  /**
491
491
  * Check if component should be cached
492
492
  */
493
- private shouldCache(registry: ComponentRegistryEntity): boolean {
493
+ private shouldCache(registry: MJComponentRegistryEntity): boolean {
494
494
  // Check config for caching settings
495
495
  const config = configInfo.componentRegistries?.find(r =>
496
496
  r.id === registry.ID || r.name === registry.Name
@@ -509,7 +509,7 @@ export class ComponentRegistryExtendedResolver {
509
509
  try {
510
510
  // Find or create component entity
511
511
  const md = new Metadata();
512
- const componentEntity = await md.GetEntityObject<ComponentEntity>('MJ: Components', userInfo);
512
+ const componentEntity = await md.GetEntityObject<MJComponentEntity>('MJ: Components', userInfo);
513
513
 
514
514
  // Check if component already exists
515
515
  const existingComponent = this.componentEngine.Components?.find(
@@ -562,8 +562,8 @@ export class ComponentRegistryExtendedResolver {
562
562
  /**
563
563
  * Map component type string to entity enum
564
564
  */
565
- private mapComponentType(type: string): ComponentEntity['Type'] {
566
- const typeMap: Record<string, ComponentEntity['Type']> = {
565
+ private mapComponentType(type: string): MJComponentEntity['Type'] {
566
+ const typeMap: Record<string, MJComponentEntity['Type']> = {
567
567
  'report': 'Report',
568
568
  'dashboard': 'Dashboard',
569
569
  'form': 'Form',
@@ -2,7 +2,7 @@ import { Arg, Ctx, Field, InputType, Mutation, ObjectType, registerEnumType, Res
2
2
  import { AppContext } from '../types.js';
3
3
  import { LogError, RunView, UserInfo, CompositeKey, DatabaseProviderBase, LogStatus } from '@memberjunction/core';
4
4
  import { RequireSystemUser } from '../directives/RequireSystemUser.js';
5
- import { QueryCategoryEntity, QueryPermissionEntity } from '@memberjunction/core-entities';
5
+ import { MJQueryCategoryEntity, MJQueryPermissionEntity } from '@memberjunction/core-entities';
6
6
  import { MJQueryResolver } from '../generated/generated.js';
7
7
  import { GetReadOnlyProvider, GetReadWriteProvider } from '../util.js';
8
8
  import { DeleteOptionsInput } from '../generic/DeleteOptionsInput.js';
@@ -222,7 +222,7 @@ export class QueryParameterType {
222
222
  }
223
223
 
224
224
  @ObjectType()
225
- export class QueryEntityType {
225
+ export class MJQueryEntityType {
226
226
  @Field(() => String)
227
227
  ID!: string;
228
228
 
@@ -300,8 +300,8 @@ export class CreateQueryResultType {
300
300
  @Field(() => [QueryParameterType], { nullable: true })
301
301
  Parameters?: QueryParameterType[];
302
302
 
303
- @Field(() => [QueryEntityType], { nullable: true })
304
- Entities?: QueryEntityType[];
303
+ @Field(() => [MJQueryEntityType], { nullable: true })
304
+ Entities?: MJQueryEntityType[];
305
305
 
306
306
  @Field(() => [QueryPermissionType], { nullable: true })
307
307
  Permissions?: QueryPermissionType[];
@@ -356,8 +356,8 @@ export class UpdateQueryResultType {
356
356
  @Field(() => [QueryParameterType], { nullable: true })
357
357
  Parameters?: QueryParameterType[];
358
358
 
359
- @Field(() => [QueryEntityType], { nullable: true })
360
- Entities?: QueryEntityType[];
359
+ @Field(() => [MJQueryEntityType], { nullable: true })
360
+ Entities?: MJQueryEntityType[];
361
361
 
362
362
  @Field(() => [QueryPermissionType], { nullable: true })
363
363
  Permissions?: QueryPermissionType[];
@@ -426,7 +426,7 @@ export class MJQueryResolverExtended extends MJQueryResolver {
426
426
  }
427
427
 
428
428
  // Use QueryEntityExtended which handles AI processing
429
- const record = await provider.GetEntityObject<QueryEntityExtended>("Queries", context.userPayload.userRecord);
429
+ const record = await provider.GetEntityObject<QueryEntityExtended>("MJ: Queries", context.userPayload.userRecord);
430
430
 
431
431
  // Set the fields from input, handling CategoryPath resolution
432
432
  const fieldsToSet = {
@@ -604,7 +604,7 @@ export class MJQueryResolverExtended extends MJQueryResolver {
604
604
  const createdPermissions: QueryPermissionType[] = [];
605
605
  if (permissions && permissions.length > 0) {
606
606
  for (const perm of permissions) {
607
- const permissionEntity = await p.GetEntityObject<QueryPermissionEntity>('Query Permissions', contextUser);
607
+ const permissionEntity = await p.GetEntityObject<MJQueryPermissionEntity>('MJ: Query Permissions', contextUser);
608
608
  if (permissionEntity) {
609
609
  permissionEntity.QueryID = queryID;
610
610
  permissionEntity.RoleID = perm.RoleID;
@@ -640,7 +640,7 @@ export class MJQueryResolverExtended extends MJQueryResolver {
640
640
  try {
641
641
  // Load the existing query using QueryEntityExtended
642
642
  const provider = GetReadWriteProvider(context.providers);
643
- const queryEntity = await provider.GetEntityObject<QueryEntityExtended>('Queries', context.userPayload.userRecord);
643
+ const queryEntity = await provider.GetEntityObject<QueryEntityExtended>('MJ: Queries', context.userPayload.userRecord);
644
644
  if (!queryEntity || !await queryEntity.Load(input.ID)) {
645
645
  return {
646
646
  Success: false,
@@ -656,7 +656,7 @@ export class MJQueryResolverExtended extends MJQueryResolver {
656
656
 
657
657
  // now make sure there is NO existing query by the same name in the specified category
658
658
  const existingQueryResult = await provider.RunView({
659
- EntityName: 'Queries',
659
+ EntityName: 'MJ: Queries',
660
660
  ExtraFilter: `Name='${input.Name}' AND CategoryID='${finalCategoryID}'`
661
661
  }, context.userPayload.userRecord);
662
662
  if (existingQueryResult.Success && existingQueryResult.Results?.length > 0) {
@@ -704,8 +704,8 @@ export class MJQueryResolverExtended extends MJQueryResolver {
704
704
  if (input.Permissions !== undefined) {
705
705
  // Delete existing permissions
706
706
  const rv = new RunView();
707
- const existingPermissions = await rv.RunView<QueryPermissionEntity>({
708
- EntityName: 'Query Permissions',
707
+ const existingPermissions = await rv.RunView<MJQueryPermissionEntity>({
708
+ EntityName: 'MJ: Query Permissions',
709
709
  ExtraFilter: `QueryID='${queryID}'`,
710
710
  ResultType: 'entity_object'
711
711
  }, context.userPayload.userRecord);
@@ -822,7 +822,7 @@ export class MJQueryResolverExtended extends MJQueryResolver {
822
822
  };
823
823
 
824
824
  // Use inherited DeleteRecord method from ResolverBase
825
- const deletedQuery = await this.DeleteRecord('Queries', key, deleteOptions, provider, context.userPayload, pubSub);
825
+ const deletedQuery = await this.DeleteRecord('MJ: Queries', key, deleteOptions, provider, context.userPayload, pubSub);
826
826
 
827
827
  if (deletedQuery) {
828
828
  return {
@@ -883,7 +883,7 @@ export class MJQueryResolverExtended extends MJQueryResolver {
883
883
  } else {
884
884
  try {
885
885
  // Create new category
886
- const newCategory = await p.GetEntityObject<QueryCategoryEntity>("Query Categories", contextUser);
886
+ const newCategory = await p.GetEntityObject<MJQueryCategoryEntity>("MJ: Query Categories", contextUser);
887
887
  if (!newCategory) {
888
888
  throw new Error(`Failed to create entity object for Query Categories`);
889
889
  }
@@ -954,7 +954,7 @@ export class MJQueryResolverExtended extends MJQueryResolver {
954
954
  const nameFilter = `LOWER(Name) = LOWER('${queryName.replace(/'/g, "''")}')`;
955
955
 
956
956
  const result = await provider.RunView({
957
- EntityName: 'Queries',
957
+ EntityName: 'MJ: Queries',
958
958
  ExtraFilter: `${nameFilter} AND ${categoryFilter}`
959
959
  }, contextUser);
960
960
 
@@ -977,14 +977,14 @@ export class MJQueryResolverExtended extends MJQueryResolver {
977
977
  * @param contextUser - User context for database operations
978
978
  * @returns The matching category entity or null if not found
979
979
  */
980
- private async findCategoryByNameAndParent(provider: DatabaseProviderBase, categoryName: string, parentID: string | null, contextUser: UserInfo): Promise<QueryCategoryEntity | null> {
980
+ private async findCategoryByNameAndParent(provider: DatabaseProviderBase, categoryName: string, parentID: string | null, contextUser: UserInfo): Promise<MJQueryCategoryEntity | null> {
981
981
  try {
982
982
  // Query database directly to avoid cache staleness issues
983
983
  const parentFilter = parentID ? `ParentID='${parentID}'` : 'ParentID IS NULL';
984
984
  const nameFilter = `LOWER(Name) = LOWER('${categoryName.replace(/'/g, "''")}')`; // Escape single quotes
985
985
 
986
- const result = await provider.RunView<QueryCategoryEntity>({
987
- EntityName: 'Query Categories',
986
+ const result = await provider.RunView<MJQueryCategoryEntity>({
987
+ EntityName: 'MJ: Query Categories',
988
988
  ExtraFilter: `${nameFilter} AND ${parentFilter}`,
989
989
  ResultType: 'entity_object'
990
990
  }, contextUser);
@@ -34,7 +34,7 @@ export class EntityResolver extends MJEntityResolverBase {
34
34
  }
35
35
  const rv = provider as any as IRunViewProvider;
36
36
  const result = await rv.RunView({
37
- EntityName: 'Entities',
37
+ EntityName: 'MJ: Entities',
38
38
  ExtraFilter: totalWhere,
39
39
  }, userPayload.userRecord);
40
40
  if (result && result.Success) {
@@ -1,5 +1,5 @@
1
1
  import { CompositeKey, EntityDeleteOptions, EntityPermissionType, EntitySaveOptions, Metadata, RunView } from '@memberjunction/core';
2
- import { FileCategoryEntity, FileEntity } from '@memberjunction/core-entities';
2
+ import { MJFileCategoryEntity, MJFileEntity } from '@memberjunction/core-entities';
3
3
  import { AppContext, Arg, Ctx, DeleteOptionsInput, Int, Mutation } from '@memberjunction/server';
4
4
  import { mj_core_schema } from '../config.js';
5
5
  import { MJFileCategoryResolver as FileCategoryResolverBase, MJFileCategory_ } from '../generated/generated.js';
@@ -23,8 +23,8 @@ export class FileCategoryResolver extends FileCategoryResolverBase {
23
23
  }
24
24
 
25
25
  const user = this.GetUserFromPayload(userPayload);
26
- const fileEntity = await p.GetEntityObject<FileEntity>('Files', user);
27
- const fileCategoryEntity = await p.GetEntityObject<FileCategoryEntity>('File Categories', user);
26
+ const fileEntity = await p.GetEntityObject<MJFileEntity>('MJ: Files', user);
27
+ const fileCategoryEntity = await p.GetEntityObject<MJFileCategoryEntity>('MJ: File Categories', user);
28
28
 
29
29
  fileEntity.CheckPermissions(EntityPermissionType.Update, true);
30
30
  fileCategoryEntity.CheckPermissions(EntityPermissionType.Delete, true);
@@ -49,7 +49,7 @@ export class FileCategoryResolver extends FileCategoryResolverBase {
49
49
  const rv = new RunView();
50
50
  const filesResult = await rv.RunView(
51
51
  {
52
- EntityName: 'Files',
52
+ EntityName: 'MJ: Files',
53
53
  ExtraFilter: `CategoryID='${fileCategoryEntity.ID}'`,
54
54
  ResultType: 'entity_object',
55
55
  },
@@ -59,7 +59,7 @@ export class FileCategoryResolver extends FileCategoryResolverBase {
59
59
  // iterate through each of the files in filesResult.Results
60
60
  // and update the CategoryID to fileCategoryEntity.ParentID
61
61
  for (const file of filesResult.Results) {
62
- const fileEntity = await p.GetEntityObject<FileEntity>('Files', user);
62
+ const fileEntity = await p.GetEntityObject<MJFileEntity>('MJ: Files', user);
63
63
  await fileEntity.Load(file.ID);
64
64
  fileEntity.CategoryID = fileCategoryEntity.ParentID;
65
65
  await fileEntity.Save();
@@ -1,5 +1,5 @@
1
1
  import { EntityPermissionType, Metadata, FieldValueCollection, EntitySaveOptions, RunView } from '@memberjunction/core';
2
- import { FileEntity, FileStorageProviderEntity, FileStorageAccountEntity } from '@memberjunction/core-entities';
2
+ import { MJFileEntity, MJFileStorageProviderEntity, MJFileStorageAccountEntity } from '@memberjunction/core-entities';
3
3
  import {
4
4
  AppContext,
5
5
  Arg,
@@ -330,7 +330,7 @@ export class FileResolver extends FileResolverBase {
330
330
  * Builds ExtendedUserContextOptions that includes the account entity for enterprise model.
331
331
  * This is required for OAuth providers using the Credential Engine to decrypt credentials.
332
332
  */
333
- private buildExtendedUserContext(context: AppContext, accountEntity: FileStorageAccountEntity): ExtendedUserContextOptions {
333
+ private buildExtendedUserContext(context: AppContext, accountEntity: MJFileStorageAccountEntity): ExtendedUserContextOptions {
334
334
  const user = this.GetUserFromPayload(context.userPayload);
335
335
  return {
336
336
  userID: user.ID,
@@ -349,19 +349,19 @@ export class FileResolver extends FileResolverBase {
349
349
  private async loadAccountAndProvider(
350
350
  accountId: string,
351
351
  context: AppContext,
352
- ): Promise<{ account: FileStorageAccountEntity; provider: FileStorageProviderEntity }> {
352
+ ): Promise<{ account: MJFileStorageAccountEntity; provider: MJFileStorageProviderEntity }> {
353
353
  const md = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true });
354
354
  const user = this.GetUserFromPayload(context.userPayload);
355
355
 
356
356
  // Load the account entity
357
- const account = await md.GetEntityObject<FileStorageAccountEntity>('MJ: File Storage Accounts', user);
357
+ const account = await md.GetEntityObject<MJFileStorageAccountEntity>('MJ: File Storage Accounts', user);
358
358
  const loaded = await account.Load(accountId);
359
359
  if (!loaded) {
360
360
  throw new Error(`Storage account with ID ${accountId} not found`);
361
361
  }
362
362
 
363
363
  // Load the provider entity from the account's ProviderID
364
- const provider = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', user);
364
+ const provider = await md.GetEntityObject<MJFileStorageProviderEntity>('MJ: File Storage Providers', user);
365
365
  await provider.Load(account.ProviderID);
366
366
 
367
367
  return { account, provider };
@@ -372,11 +372,11 @@ export class FileResolver extends FileResolverBase {
372
372
  // Check to see if there's already an object with that name
373
373
  const provider = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true });
374
374
  const user = this.GetUserFromPayload(context.userPayload);
375
- const fileEntity = await provider.GetEntityObject<FileEntity>('Files', user);
376
- const providerEntity = await provider.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', user);
375
+ const fileEntity = await provider.GetEntityObject<MJFileEntity>('MJ: Files', user);
376
+ const providerEntity = await provider.GetEntityObject<MJFileStorageProviderEntity>('MJ: File Storage Providers', user);
377
377
  fileEntity.CheckPermissions(EntityPermissionType.Create, true);
378
378
 
379
- const [sameName] = await this.findBy(provider, 'Files', { Name: input.Name, ProviderID: input.ProviderID }, context.userPayload.userRecord);
379
+ const [sameName] = await this.findBy(provider, 'MJ: Files', { Name: input.Name, ProviderID: input.ProviderID }, context.userPayload.userRecord);
380
380
  const NameExists = Boolean(sameName);
381
381
 
382
382
  const success = fileEntity.NewRecord(FieldValueCollection.FromObject({ ...input, Status: 'Pending' }));
@@ -403,10 +403,10 @@ export class FileResolver extends FileResolverBase {
403
403
  async DownloadUrl(@Root() file: MJFile_, @Ctx() context: AppContext) {
404
404
  const md = new Metadata();
405
405
  const user = this.GetUserFromPayload(context.userPayload);
406
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
406
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
407
407
  fileEntity.CheckPermissions(EntityPermissionType.Read, true);
408
408
 
409
- const providerEntity = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', user);
409
+ const providerEntity = await md.GetEntityObject<MJFileStorageProviderEntity>('MJ: File Storage Providers', user);
410
410
  await providerEntity.Load(file.ProviderID);
411
411
 
412
412
  const userContext = this.buildUserContext(context);
@@ -420,13 +420,13 @@ export class FileResolver extends FileResolverBase {
420
420
  // if the name is changing, rename the target object as well
421
421
  const md = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true });
422
422
  const user = this.GetUserFromPayload(context.userPayload);
423
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
423
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
424
424
  fileEntity.CheckPermissions(EntityPermissionType.Update, true);
425
425
 
426
426
  await fileEntity.Load(input.ID);
427
427
 
428
428
  if (fileEntity.Name !== input.Name) {
429
- const providerEntity = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', user);
429
+ const providerEntity = await md.GetEntityObject<MJFileStorageProviderEntity>('MJ: File Storage Providers', user);
430
430
  await providerEntity.Load(fileEntity.ProviderID);
431
431
 
432
432
  const userContext = this.buildUserContext(context);
@@ -450,7 +450,7 @@ export class FileResolver extends FileResolverBase {
450
450
  const md = GetReadOnlyProvider(context.providers, { allowFallbackToReadWrite: true });
451
451
  const userInfo = this.GetUserFromPayload(context.userPayload);
452
452
 
453
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', userInfo);
453
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', userInfo);
454
454
  await fileEntity.Load(ID);
455
455
  if (!fileEntity) {
456
456
  return null;
@@ -459,7 +459,7 @@ export class FileResolver extends FileResolverBase {
459
459
 
460
460
  // Only delete the object from the provider if it's actually been uploaded
461
461
  if (fileEntity.Status === 'Uploaded') {
462
- const providerEntity = await md.GetEntityObject<FileStorageProviderEntity>('File Storage Providers', userInfo);
462
+ const providerEntity = await md.GetEntityObject<MJFileStorageProviderEntity>('MJ: File Storage Providers', userInfo);
463
463
  await providerEntity.Load(fileEntity.ProviderID);
464
464
  const userContext = this.buildUserContext(context);
465
465
  await deleteObject(providerEntity, fileEntity.ProviderKey ?? fileEntity.Name, userContext);
@@ -489,7 +489,7 @@ export class FileResolver extends FileResolverBase {
489
489
  });
490
490
 
491
491
  // Check permissions - user must have read access to Files entity
492
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
492
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
493
493
  fileEntity.CheckPermissions(EntityPermissionType.Read, true);
494
494
 
495
495
  // Call the storage provider to list objects with extended user context (includes account for credential lookup)
@@ -524,7 +524,7 @@ export class FileResolver extends FileResolverBase {
524
524
  const { account, provider: providerEntity } = await this.loadAccountAndProvider(input.AccountID, context);
525
525
 
526
526
  // Check permissions
527
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
527
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
528
528
  fileEntity.CheckPermissions(EntityPermissionType.Read, true);
529
529
 
530
530
  // Create download URL with extended user context (includes account for credential lookup)
@@ -542,7 +542,7 @@ export class FileResolver extends FileResolverBase {
542
542
  const { account, provider: providerEntity } = await this.loadAccountAndProvider(input.AccountID, context);
543
543
 
544
544
  // Check permissions
545
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
545
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
546
546
  fileEntity.CheckPermissions(EntityPermissionType.Create, true);
547
547
 
548
548
  // Create upload URL with extended user context (includes account for credential lookup)
@@ -584,7 +584,7 @@ export class FileResolver extends FileResolverBase {
584
584
  });
585
585
 
586
586
  // Check permissions
587
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
587
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
588
588
  fileEntity.CheckPermissions(EntityPermissionType.Delete, true);
589
589
 
590
590
  console.log('[FileResolver] Permissions checked, calling deleteObject...');
@@ -607,7 +607,7 @@ export class FileResolver extends FileResolverBase {
607
607
  const { account, provider: providerEntity } = await this.loadAccountAndProvider(input.AccountID, context);
608
608
 
609
609
  // Check permissions
610
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
610
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
611
611
  fileEntity.CheckPermissions(EntityPermissionType.Update, true);
612
612
 
613
613
  // Move the object with extended user context (includes account for credential lookup)
@@ -625,7 +625,7 @@ export class FileResolver extends FileResolverBase {
625
625
  const { account, provider: providerEntity } = await this.loadAccountAndProvider(input.AccountID, context);
626
626
 
627
627
  // Check permissions - copying requires both read (source) and create (destination)
628
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
628
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
629
629
  fileEntity.CheckPermissions(EntityPermissionType.Read, true);
630
630
  fileEntity.CheckPermissions(EntityPermissionType.Create, true);
631
631
 
@@ -644,7 +644,7 @@ export class FileResolver extends FileResolverBase {
644
644
  const { account: accountEntity, provider: providerEntity } = await this.loadAccountAndProvider(input.AccountID, context);
645
645
 
646
646
  // Check permissions
647
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
647
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
648
648
  fileEntity.CheckPermissions(EntityPermissionType.Create, true);
649
649
 
650
650
  // Initialize driver with account-based credentials from Credential Engine
@@ -674,7 +674,7 @@ export class FileResolver extends FileResolverBase {
674
674
  const user = this.GetUserFromPayload(context.userPayload);
675
675
 
676
676
  // Check permissions - copying requires both read (source) and create (destination)
677
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
677
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
678
678
  fileEntity.CheckPermissions(EntityPermissionType.Read, true);
679
679
  fileEntity.CheckPermissions(EntityPermissionType.Create, true);
680
680
 
@@ -722,13 +722,13 @@ export class FileResolver extends FileResolverBase {
722
722
  const user = this.GetUserFromPayload(context.userPayload);
723
723
 
724
724
  // Check permissions - searching requires read access
725
- const fileEntity = await md.GetEntityObject<FileEntity>('Files', user);
725
+ const fileEntity = await md.GetEntityObject<MJFileEntity>('MJ: Files', user);
726
726
  fileEntity.CheckPermissions(EntityPermissionType.Read, true);
727
727
 
728
728
  // Load all requested account entities in a single query
729
729
  const rv = new RunView();
730
730
  const quotedIDs = input.AccountIDs.map((id) => `'${id}'`).join(', ');
731
- const accountResult = await rv.RunView<FileStorageAccountEntity>(
731
+ const accountResult = await rv.RunView<MJFileStorageAccountEntity>(
732
732
  {
733
733
  EntityName: 'MJ: File Storage Accounts',
734
734
  ExtraFilter: `ID IN (${quotedIDs})`,
@@ -756,9 +756,9 @@ export class FileResolver extends FileResolverBase {
756
756
  // Load providers for all accounts
757
757
  const providerIDs = [...new Set(accountEntities.map((a) => a.ProviderID))];
758
758
  const quotedProviderIDs = providerIDs.map((id) => `'${id}'`).join(', ');
759
- const providerResult = await rv.RunView<FileStorageProviderEntity>(
759
+ const providerResult = await rv.RunView<MJFileStorageProviderEntity>(
760
760
  {
761
- EntityName: 'File Storage Providers',
761
+ EntityName: 'MJ: File Storage Providers',
762
762
  ExtraFilter: `ID IN (${quotedProviderIDs})`,
763
763
  ResultType: 'entity_object',
764
764
  },
@@ -769,7 +769,7 @@ export class FileResolver extends FileResolverBase {
769
769
  throw new Error(`Failed to load storage providers: ${providerResult.ErrorMessage}`);
770
770
  }
771
771
 
772
- const providerMap = new Map<string, FileStorageProviderEntity>();
772
+ const providerMap = new Map<string, MJFileStorageProviderEntity>();
773
773
  for (const provider of providerResult.Results) {
774
774
  providerMap.set(provider.ID, provider);
775
775
  }
@@ -3,7 +3,7 @@ import { AppContext } from "../types.js";
3
3
  import { DataContext } from "@memberjunction/data-context";
4
4
  import { GetReadOnlyDataSource, GetReadOnlyProvider } from "../util.js";
5
5
  import { Metadata } from "@memberjunction/core";
6
- import { DataContextItemEntity } from "@memberjunction/core-entities";
6
+ import { MJDataContextItemEntity } from "@memberjunction/core-entities";
7
7
  import { ResolverBase } from "../generic/ResolverBase.js";
8
8
 
9
9
  @ObjectType()
@@ -59,7 +59,7 @@ export class GetDataContextDataResolver extends ResolverBase {
59
59
  allowFallbackToReadWrite: true,
60
60
  })
61
61
  const md = GetReadOnlyProvider(appCtx.providers, {allowFallbackToReadWrite: true});
62
- const dciData = await md.GetEntityObject<DataContextItemEntity>("Data Context Items", appCtx.userPayload.userRecord);
62
+ const dciData = await md.GetEntityObject<MJDataContextItemEntity>("MJ: Data Context Items", appCtx.userPayload.userRecord);
63
63
  if (await dciData.Load(DataContextItemID)) {
64
64
  const dci = DataContext.CreateDataContextItem(); // use class factory to get whatever lowest level sub-class is registered
65
65
  await dci.LoadMetadataFromEntityRecord(dciData, Metadata.Provider, appCtx.userPayload.userRecord);