@memberjunction/server 4.3.1 → 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.
- package/dist/agents/skip-agent.js +9 -9
- package/dist/agents/skip-agent.js.map +1 -1
- package/dist/apolloServer/TransactionPlugin.d.ts +4 -0
- package/dist/apolloServer/TransactionPlugin.d.ts.map +1 -0
- package/dist/apolloServer/TransactionPlugin.js +46 -0
- package/dist/apolloServer/TransactionPlugin.js.map +1 -0
- package/dist/auth/APIKeyScopeAuth.js.map +1 -1
- package/dist/auth/__tests__/backward-compatibility.test.d.ts +2 -0
- package/dist/auth/__tests__/backward-compatibility.test.d.ts.map +1 -0
- package/dist/auth/__tests__/backward-compatibility.test.js +135 -0
- package/dist/auth/__tests__/backward-compatibility.test.js.map +1 -0
- package/dist/auth/exampleNewUserSubClass.d.ts +2 -2
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/newUsers.d.ts +2 -2
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +6 -6
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts +2 -2
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js +3 -3
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
- package/dist/generated/generated.d.ts +10724 -10721
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +48710 -48698
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/DeleteOptionsInput.d.ts +12 -2
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
- package/dist/generic/DeleteOptionsInput.js +12 -2
- package/dist/generic/DeleteOptionsInput.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +6 -6
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.js +3 -3
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.d.ts +123 -0
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -0
- package/dist/resolvers/AskSkipResolver.js +1788 -0
- package/dist/resolvers/AskSkipResolver.js.map +1 -0
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +3 -3
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +19 -19
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/EntityResolver.js +1 -1
- package/dist/resolvers/EntityResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +4 -4
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +20 -20
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/ISAEntityResolver.d.ts +22 -1
- package/dist/resolvers/ISAEntityResolver.d.ts.map +1 -1
- package/dist/resolvers/ISAEntityResolver.js +77 -1
- package/dist/resolvers/ISAEntityResolver.js.map +1 -1
- package/dist/resolvers/ReportResolver.js +3 -3
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +3 -3
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +1 -1
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +2 -2
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +1 -1
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +9 -9
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +10 -10
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +2 -2
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserResolver.js +8 -8
- package/dist/resolvers/UserResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.js +5 -5
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +1 -1
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.d.ts +4 -0
- package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -0
- package/dist/scheduler/LearningCycleScheduler.js +4 -0
- package/dist/scheduler/LearningCycleScheduler.js.map +1 -0
- package/dist/services/TaskOrchestrator.d.ts +1 -1
- package/dist/services/TaskOrchestrator.js +5 -5
- package/dist/services/TaskOrchestrator.js.map +1 -1
- package/package.json +52 -52
- package/src/agents/skip-agent.ts +9 -9
- package/src/auth/APIKeyScopeAuth.ts +5 -5
- package/src/auth/exampleNewUserSubClass.ts +2 -2
- package/src/auth/index.ts +3 -3
- package/src/auth/newUsers.ts +9 -9
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +31186 -31177
- package/src/generic/DeleteOptionsInput.ts +12 -2
- package/src/generic/ResolverBase.ts +7 -7
- package/src/generic/RunViewResolver.ts +3 -3
- package/src/resolvers/APIKeyResolver.ts +2 -2
- package/src/resolvers/ComponentRegistryResolver.ts +9 -9
- package/src/resolvers/CreateQueryResolver.ts +18 -18
- package/src/resolvers/EntityResolver.ts +1 -1
- package/src/resolvers/FileCategoryResolver.ts +5 -5
- package/src/resolvers/FileResolver.ts +27 -27
- package/src/resolvers/GetDataContextDataResolver.ts +2 -2
- package/src/resolvers/ISAEntityResolver.ts +77 -1
- package/src/resolvers/ReportResolver.ts +4 -4
- package/src/resolvers/RunAIAgentResolver.ts +7 -7
- package/src/resolvers/RunAIPromptResolver.ts +1 -1
- package/src/resolvers/RunTemplateResolver.ts +4 -4
- package/src/resolvers/SyncDataResolver.ts +3 -3
- package/src/resolvers/SyncRolesUsersResolver.ts +26 -26
- package/src/resolvers/UserFavoriteResolver.ts +2 -2
- package/src/resolvers/UserResolver.ts +8 -8
- package/src/resolvers/UserViewResolver.ts +6 -6
- package/src/rest/ViewOperationsHandler.ts +1 -1
- 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
|
|
5
|
-
*
|
|
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 {
|
|
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<
|
|
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<
|
|
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 {
|
|
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<
|
|
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 {
|
|
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<
|
|
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<
|
|
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:
|
|
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:
|
|
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:
|
|
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<
|
|
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):
|
|
566
|
-
const typeMap: Record<string,
|
|
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 {
|
|
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
|
|
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(() => [
|
|
304
|
-
Entities?:
|
|
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(() => [
|
|
360
|
-
Entities?:
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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 {
|
|
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<
|
|
27
|
-
const fileCategoryEntity = await p.GetEntityObject<
|
|
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<
|
|
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 {
|
|
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:
|
|
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:
|
|
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<
|
|
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<
|
|
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<
|
|
376
|
-
const providerEntity = await provider.GetEntityObject<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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,
|
|
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 {
|
|
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<
|
|
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);
|