@memberjunction/server 2.112.0 → 2.113.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/skip-agent.d.ts +4 -4
- package/dist/agents/skip-agent.d.ts.map +1 -1
- package/dist/agents/skip-agent.js +951 -808
- package/dist/agents/skip-agent.js.map +1 -1
- package/dist/agents/skip-sdk.d.ts +1 -1
- package/dist/agents/skip-sdk.d.ts.map +1 -1
- package/dist/agents/skip-sdk.js +43 -53
- package/dist/agents/skip-sdk.js.map +1 -1
- package/dist/apolloServer/index.js +1 -1
- package/dist/auth/AuthProviderFactory.d.ts +1 -1
- package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
- package/dist/auth/AuthProviderFactory.js +3 -1
- package/dist/auth/AuthProviderFactory.js.map +1 -1
- package/dist/auth/BaseAuthProvider.d.ts +1 -1
- package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
- package/dist/auth/BaseAuthProvider.js +2 -3
- package/dist/auth/BaseAuthProvider.js.map +1 -1
- package/dist/auth/IAuthProvider.d.ts +1 -1
- package/dist/auth/IAuthProvider.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.js +1 -1
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +6 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.js +1 -1
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/newUsers.d.ts +1 -1
- package/dist/auth/newUsers.d.ts.map +1 -1
- package/dist/auth/newUsers.js +7 -7
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
- package/dist/auth/providers/Auth0Provider.js +1 -1
- package/dist/auth/providers/Auth0Provider.js.map +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
- package/dist/auth/providers/CognitoProvider.js +6 -3
- package/dist/auth/providers/CognitoProvider.js.map +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
- package/dist/auth/providers/GoogleProvider.js +1 -1
- package/dist/auth/providers/GoogleProvider.js.map +1 -1
- package/dist/auth/providers/MSALProvider.d.ts +1 -1
- package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
- package/dist/auth/providers/MSALProvider.js +1 -1
- package/dist/auth/providers/MSALProvider.js.map +1 -1
- package/dist/auth/providers/OktaProvider.d.ts +1 -1
- package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
- package/dist/auth/providers/OktaProvider.js +1 -1
- package/dist/auth/providers/OktaProvider.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +10 -22
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +7 -9
- package/dist/context.js.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
- package/dist/generated/generated.d.ts +788 -658
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2050 -3054
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts +1 -1
- package/dist/generic/KeyInputOutputTypes.d.ts.map +1 -1
- package/dist/generic/KeyInputOutputTypes.js +1 -1
- package/dist/generic/KeyInputOutputTypes.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +1 -1
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +10 -15
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +1 -1
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +15 -15
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -18
- package/dist/index.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +2 -2
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +30 -28
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/AskSkipResolver.d.ts +2 -2
- package/dist/resolvers/AskSkipResolver.d.ts.map +1 -1
- package/dist/resolvers/AskSkipResolver.js +50 -60
- package/dist/resolvers/AskSkipResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +38 -36
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +40 -43
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +1 -1
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/EntityResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityResolver.js +1 -1
- package/dist/resolvers/EntityResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +1 -1
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.js +1 -1
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +5 -5
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +6 -8
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts +3 -3
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +3 -3
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +11 -11
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/ReportResolver.js +1 -1
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +28 -27
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +31 -31
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +9 -9
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +10 -10
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +14 -15
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +44 -48
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/TaskResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskResolver.js +7 -7
- package/dist/resolvers/TaskResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts +1 -1
- package/dist/resolvers/TransactionGroupResolver.d.ts.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +12 -12
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts +1 -1
- package/dist/resolvers/UserFavoriteResolver.d.ts.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +1 -1
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.d.ts.map +1 -1
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts +1 -1
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +16 -14
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +25 -23
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +21 -17
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.d.ts.map +1 -1
- package/dist/scheduler/LearningCycleScheduler.js.map +1 -1
- package/dist/services/ScheduledJobsService.d.ts.map +1 -1
- package/dist/services/ScheduledJobsService.js +6 -4
- package/dist/services/ScheduledJobsService.js.map +1 -1
- package/dist/services/TaskOrchestrator.d.ts +1 -1
- package/dist/services/TaskOrchestrator.d.ts.map +1 -1
- package/dist/services/TaskOrchestrator.js +30 -30
- package/dist/services/TaskOrchestrator.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +1 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +2 -2
- package/dist/util.js.map +1 -1
- package/package.json +39 -36
- package/src/agents/skip-agent.ts +1200 -1067
- package/src/agents/skip-sdk.ts +851 -877
- package/src/apolloServer/index.ts +2 -2
- package/src/auth/AuthProviderFactory.ts +14 -8
- package/src/auth/BaseAuthProvider.ts +4 -5
- package/src/auth/IAuthProvider.ts +2 -2
- package/src/auth/exampleNewUserSubClass.ts +2 -9
- package/src/auth/index.ts +26 -31
- package/src/auth/initializeProviders.ts +3 -3
- package/src/auth/newUsers.ts +134 -166
- package/src/auth/providers/Auth0Provider.ts +5 -5
- package/src/auth/providers/CognitoProvider.ts +10 -7
- package/src/auth/providers/GoogleProvider.ts +5 -4
- package/src/auth/providers/MSALProvider.ts +5 -5
- package/src/auth/providers/OktaProvider.ts +7 -6
- package/src/config.ts +54 -63
- package/src/context.ts +30 -42
- package/src/entitySubclasses/entityPermissions.server.ts +3 -3
- package/src/generated/generated.ts +40442 -48106
- package/src/generic/KeyInputOutputTypes.ts +6 -3
- package/src/generic/ResolverBase.ts +78 -119
- package/src/generic/RunViewResolver.ts +23 -27
- package/src/index.ts +48 -66
- package/src/resolvers/ActionResolver.ts +57 -46
- package/src/resolvers/AskSkipResolver.ts +533 -607
- package/src/resolvers/ComponentRegistryResolver.ts +562 -547
- package/src/resolvers/CreateQueryResolver.ts +655 -683
- package/src/resolvers/DatasetResolver.ts +6 -5
- package/src/resolvers/EntityCommunicationsResolver.ts +1 -1
- package/src/resolvers/EntityRecordNameResolver.ts +5 -9
- package/src/resolvers/EntityResolver.ts +7 -9
- package/src/resolvers/FileCategoryResolver.ts +2 -2
- package/src/resolvers/FileResolver.ts +4 -4
- package/src/resolvers/GetDataContextDataResolver.ts +118 -106
- package/src/resolvers/GetDataResolver.ts +205 -194
- package/src/resolvers/MergeRecordsResolver.ts +5 -5
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +1 -1
- package/src/resolvers/QueryResolver.ts +78 -95
- package/src/resolvers/ReportResolver.ts +2 -2
- package/src/resolvers/RunAIAgentResolver.ts +828 -818
- package/src/resolvers/RunAIPromptResolver.ts +709 -693
- package/src/resolvers/RunTemplateResolver.ts +103 -105
- package/src/resolvers/SqlLoggingConfigResolver.ts +72 -69
- package/src/resolvers/SyncDataResolver.ts +352 -386
- package/src/resolvers/SyncRolesUsersResolver.ts +350 -387
- package/src/resolvers/TaskResolver.ts +115 -110
- package/src/resolvers/TransactionGroupResolver.ts +138 -143
- package/src/resolvers/UserFavoriteResolver.ts +8 -17
- package/src/resolvers/UserViewResolver.ts +12 -17
- package/src/rest/EntityCRUDHandler.ts +268 -291
- package/src/rest/RESTEndpointHandler.ts +776 -782
- package/src/rest/ViewOperationsHandler.ts +195 -191
- package/src/scheduler/LearningCycleScheduler.ts +52 -8
- package/src/services/ScheduledJobsService.ts +132 -129
- package/src/services/TaskOrchestrator.ts +776 -792
- package/src/types.ts +9 -15
- package/src/util.ts +109 -112
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import { EntitySaveOptions, Metadata } from '@memberjunction/
|
|
2
|
+
import { EntitySaveOptions, Metadata } from '@memberjunction/core';
|
|
3
3
|
import { AppContext, Arg, Ctx, Int, Query, Resolver, UserPayload } from '@memberjunction/server';
|
|
4
4
|
import { MJUserView_, MJUserViewResolverBase } from '../generated/generated.js';
|
|
5
5
|
import { UserResolver } from './UserResolver.js';
|
|
@@ -10,7 +10,7 @@ import { GetReadOnlyProvider } from '../util.js';
|
|
|
10
10
|
export class UserViewResolver extends MJUserViewResolverBase {
|
|
11
11
|
@Query(() => [MJUserView_])
|
|
12
12
|
async UserViewsByUserID(@Arg('UserID', () => Int) UserID: number, @Ctx() { providers, userPayload }: AppContext) {
|
|
13
|
-
const provider = GetReadOnlyProvider(providers, {
|
|
13
|
+
const provider = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true})
|
|
14
14
|
return await this.findBy(provider, 'User Views', { UserID }, userPayload.userRecord);
|
|
15
15
|
}
|
|
16
16
|
|
|
@@ -20,23 +20,18 @@ export class UserViewResolver extends MJUserViewResolverBase {
|
|
|
20
20
|
@Arg('EntityID', () => Int) EntityID: number,
|
|
21
21
|
@Ctx() { providers, userPayload }: AppContext
|
|
22
22
|
) {
|
|
23
|
-
const provider = GetReadOnlyProvider(providers, {
|
|
23
|
+
const provider = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true})
|
|
24
24
|
return await this.findBy(provider, 'User Views', { UserID, EntityID, IsDefault: true }, userPayload.userRecord);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
@Query(() => [MJUserView_])
|
|
28
28
|
async CurrentUserDefaultViewByEntityID(@Arg('EntityID', () => Int) EntityID: number, @Ctx() context: AppContext) {
|
|
29
|
-
const provider = GetReadOnlyProvider(context.providers, {
|
|
30
|
-
return await this.findBy(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
EntityID,
|
|
36
|
-
IsDefault: true,
|
|
37
|
-
},
|
|
38
|
-
context.userPayload.userRecord
|
|
39
|
-
);
|
|
29
|
+
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true})
|
|
30
|
+
return await this.findBy(provider, 'User Views', {
|
|
31
|
+
UserID: await this.getCurrentUserID(context),
|
|
32
|
+
EntityID,
|
|
33
|
+
IsDefault: true,
|
|
34
|
+
}, context.userPayload.userRecord);
|
|
40
35
|
}
|
|
41
36
|
|
|
42
37
|
protected async getCurrentUserID(context: AppContext): Promise<number> {
|
|
@@ -47,8 +42,8 @@ export class UserViewResolver extends MJUserViewResolverBase {
|
|
|
47
42
|
|
|
48
43
|
@Query(() => [MJUserView_])
|
|
49
44
|
async CurrentUserUserViewsByEntityID(@Arg('EntityID', () => Int) EntityID: number, @Ctx() context: AppContext) {
|
|
50
|
-
const provider = GetReadOnlyProvider(context.providers, {
|
|
51
|
-
return this.findBy(provider, 'User Views', { UserID: await this.getCurrentUserID(context), EntityID
|
|
45
|
+
const provider = GetReadOnlyProvider(context.providers, {allowFallbackToReadWrite: true})
|
|
46
|
+
return this.findBy(provider, 'User Views', { UserID: await this.getCurrentUserID(context), EntityID}, context.userPayload.userRecord);
|
|
52
47
|
}
|
|
53
48
|
|
|
54
49
|
@Query(() => [MJUserView_])
|
|
@@ -57,7 +52,7 @@ export class UserViewResolver extends MJUserViewResolverBase {
|
|
|
57
52
|
// this should normally not be a factor but we have this exposed in the GraphQL API so that
|
|
58
53
|
// a dev can force the update if desired from the client. The normal path is just to update
|
|
59
54
|
// filter state which in turn will be used to update the where clause in the entity sub-class.
|
|
60
|
-
const p = GetReadOnlyProvider(providers, {
|
|
55
|
+
const p = GetReadOnlyProvider(providers, {allowFallbackToReadWrite: true});
|
|
61
56
|
const u = this.GetUserFromPayload(userPayload);
|
|
62
57
|
const viewEntity = <UserViewEntityExtended>await p.GetEntityObject('User Views', u);
|
|
63
58
|
await viewEntity.Load(ID);
|
|
@@ -1,302 +1,279 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
EntityPermissionType,
|
|
6
|
-
EntitySaveOptions,
|
|
7
|
-
LogError,
|
|
8
|
-
Metadata,
|
|
9
|
-
UserInfo,
|
|
10
|
-
} from '@memberjunction/global';
|
|
1
|
+
import {
|
|
2
|
+
BaseEntity, CompositeKey, EntityDeleteOptions, EntityPermissionType,
|
|
3
|
+
EntitySaveOptions, LogError, Metadata, UserInfo
|
|
4
|
+
} from '@memberjunction/core';
|
|
11
5
|
|
|
12
6
|
/**
|
|
13
7
|
* Entity CRUD Implementation Functions for REST endpoints
|
|
14
8
|
* These functions contain the detailed implementation for entity operations
|
|
15
9
|
*/
|
|
16
10
|
export class EntityCRUDHandler {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
} catch (error: any) {
|
|
86
|
-
LogError(error);
|
|
87
|
-
return { success: false, error: error?.message || 'Unknown error' };
|
|
11
|
+
/**
|
|
12
|
+
* Create a new entity
|
|
13
|
+
*/
|
|
14
|
+
static async createEntity(entityName: string, data: any, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string, details?: any, validationErrors?: any[] }> {
|
|
15
|
+
try {
|
|
16
|
+
// Get entity object
|
|
17
|
+
const md = new Metadata();
|
|
18
|
+
const entity = await md.GetEntityObject(entityName, user);
|
|
19
|
+
|
|
20
|
+
// Check permissions
|
|
21
|
+
if (!entity.CheckPermissions(EntityPermissionType.Create, false)) {
|
|
22
|
+
return {
|
|
23
|
+
success: false,
|
|
24
|
+
error: `User ${user.Name} does not have permission to create ${entityName} records`
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Create new record
|
|
29
|
+
entity.NewRecord();
|
|
30
|
+
|
|
31
|
+
// Extract save options if provided
|
|
32
|
+
const options = new EntitySaveOptions();
|
|
33
|
+
if (data.options) {
|
|
34
|
+
const { IgnoreDirtyState, SkipEntityAIActions, SkipEntityActions, ReplayOnly, SkipOldValuesCheck } = data.options;
|
|
35
|
+
if (IgnoreDirtyState !== undefined) options.IgnoreDirtyState = !!IgnoreDirtyState;
|
|
36
|
+
if (SkipEntityAIActions !== undefined) options.SkipEntityAIActions = !!SkipEntityAIActions;
|
|
37
|
+
if (SkipEntityActions !== undefined) options.SkipEntityActions = !!SkipEntityActions;
|
|
38
|
+
if (ReplayOnly !== undefined) options.ReplayOnly = !!ReplayOnly;
|
|
39
|
+
if (SkipOldValuesCheck !== undefined) options.SkipOldValuesCheck = !!SkipOldValuesCheck;
|
|
40
|
+
|
|
41
|
+
// Remove options from data
|
|
42
|
+
delete data.options;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Set values on the entity
|
|
46
|
+
for (const key in data) {
|
|
47
|
+
entity.Set(key, data[key]);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Validate entity
|
|
51
|
+
const validationResult = entity.Validate();
|
|
52
|
+
if (!validationResult.Success) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
error: 'Validation failed',
|
|
56
|
+
validationErrors: validationResult.Errors
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Save entity
|
|
61
|
+
const saveSuccess = await entity.Save(options);
|
|
62
|
+
|
|
63
|
+
if (!saveSuccess) {
|
|
64
|
+
const latestResult = entity.LatestResult;
|
|
65
|
+
return {
|
|
66
|
+
success: false,
|
|
67
|
+
error: latestResult?.Message || 'Failed to create entity',
|
|
68
|
+
details: latestResult
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Get entity data for response
|
|
73
|
+
const entityData = await entity.GetDataObject();
|
|
74
|
+
return { success: true, entity: entityData };
|
|
75
|
+
} catch (error: any) {
|
|
76
|
+
LogError(error);
|
|
77
|
+
return { success: false, error: error?.message || 'Unknown error' };
|
|
78
|
+
}
|
|
88
79
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
const entityData = await entity.GetDataObject();
|
|
128
|
-
return { success: true, entity: entityData };
|
|
129
|
-
} catch (error: any) {
|
|
130
|
-
LogError(error);
|
|
131
|
-
return { success: false, error: error?.message || 'Unknown error' };
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Read an entity by ID
|
|
83
|
+
*/
|
|
84
|
+
static async getEntity(entityName: string, id: string | number, relatedEntities: string[] = null, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string }> {
|
|
85
|
+
try {
|
|
86
|
+
// Get entity object
|
|
87
|
+
const md = new Metadata();
|
|
88
|
+
const entity = await md.GetEntityObject(entityName, user);
|
|
89
|
+
|
|
90
|
+
// Check permissions
|
|
91
|
+
if (!entity.CheckPermissions(EntityPermissionType.Read, false)) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: `User ${user.Name} does not have permission to read ${entityName} records`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Create composite key
|
|
99
|
+
const compositeKey = this.createCompositeKeyFromId(entity, id);
|
|
100
|
+
|
|
101
|
+
// Load entity
|
|
102
|
+
const loadSuccess = await entity.InnerLoad(compositeKey, relatedEntities);
|
|
103
|
+
|
|
104
|
+
if (!loadSuccess) {
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
error: `${entityName} with ID ${id} not found`
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Get entity data for response
|
|
112
|
+
const entityData = await entity.GetDataObject();
|
|
113
|
+
return { success: true, entity: entityData };
|
|
114
|
+
} catch (error: any) {
|
|
115
|
+
LogError(error);
|
|
116
|
+
return { success: false, error: error?.message || 'Unknown error' };
|
|
117
|
+
}
|
|
132
118
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
const entityData = await entity.GetDataObject();
|
|
220
|
-
return { success: true, entity: entityData };
|
|
221
|
-
} catch (error: any) {
|
|
222
|
-
LogError(error);
|
|
223
|
-
return { success: false, error: error?.message || 'Unknown error' };
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Update an existing entity
|
|
122
|
+
*/
|
|
123
|
+
static async updateEntity(entityName: string, id: string | number, data: any, user: UserInfo): Promise<{ success: boolean, entity?: any, error?: string, details?: any, validationErrors?: any[] }> {
|
|
124
|
+
try {
|
|
125
|
+
// Get entity object
|
|
126
|
+
const md = new Metadata();
|
|
127
|
+
const entity = await md.GetEntityObject(entityName, user);
|
|
128
|
+
|
|
129
|
+
// Check permissions
|
|
130
|
+
if (!entity.CheckPermissions(EntityPermissionType.Update, false)) {
|
|
131
|
+
return {
|
|
132
|
+
success: false,
|
|
133
|
+
error: `User ${user.Name} does not have permission to update ${entityName} records`
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Create composite key
|
|
138
|
+
const compositeKey = this.createCompositeKeyFromId(entity, id);
|
|
139
|
+
|
|
140
|
+
// Load entity
|
|
141
|
+
const loadSuccess = await entity.InnerLoad(compositeKey);
|
|
142
|
+
|
|
143
|
+
if (!loadSuccess) {
|
|
144
|
+
return {
|
|
145
|
+
success: false,
|
|
146
|
+
error: `${entityName} with ID ${id} not found`
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// Extract save options if provided
|
|
151
|
+
const options = new EntitySaveOptions();
|
|
152
|
+
if (data.options) {
|
|
153
|
+
const { IgnoreDirtyState, SkipEntityAIActions, SkipEntityActions, ReplayOnly, SkipOldValuesCheck } = data.options;
|
|
154
|
+
if (IgnoreDirtyState !== undefined) options.IgnoreDirtyState = !!IgnoreDirtyState;
|
|
155
|
+
if (SkipEntityAIActions !== undefined) options.SkipEntityAIActions = !!SkipEntityAIActions;
|
|
156
|
+
if (SkipEntityActions !== undefined) options.SkipEntityActions = !!SkipEntityActions;
|
|
157
|
+
if (ReplayOnly !== undefined) options.ReplayOnly = !!ReplayOnly;
|
|
158
|
+
if (SkipOldValuesCheck !== undefined) options.SkipOldValuesCheck = !!SkipOldValuesCheck;
|
|
159
|
+
|
|
160
|
+
// Remove options from data
|
|
161
|
+
delete data.options;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Update entity with new values
|
|
165
|
+
for (const key in data) {
|
|
166
|
+
entity.Set(key, data[key]);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Check if entity is dirty
|
|
170
|
+
if (!entity.Dirty && !options.IgnoreDirtyState) {
|
|
171
|
+
// Nothing changed, return success
|
|
172
|
+
const entityData = await entity.GetDataObject();
|
|
173
|
+
return { success: true, entity: entityData };
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Validate entity
|
|
177
|
+
const validationResult = entity.Validate();
|
|
178
|
+
if (!validationResult.Success) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
error: 'Validation failed',
|
|
182
|
+
validationErrors: validationResult.Errors
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Save entity
|
|
187
|
+
const saveSuccess = await entity.Save(options);
|
|
188
|
+
|
|
189
|
+
if (!saveSuccess) {
|
|
190
|
+
const latestResult = entity.LatestResult;
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
error: latestResult?.Message || 'Failed to update entity',
|
|
194
|
+
details: latestResult
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Get entity data for response
|
|
199
|
+
const entityData = await entity.GetDataObject();
|
|
200
|
+
return { success: true, entity: entityData };
|
|
201
|
+
} catch (error: any) {
|
|
202
|
+
LogError(error);
|
|
203
|
+
return { success: false, error: error?.message || 'Unknown error' };
|
|
204
|
+
}
|
|
224
205
|
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
return { success: true };
|
|
275
|
-
} catch (error: any) {
|
|
276
|
-
LogError(error);
|
|
277
|
-
return { success: false, error: error?.message || 'Unknown error' };
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Delete an entity
|
|
209
|
+
*/
|
|
210
|
+
static async deleteEntity(entityName: string, id: string | number, options: EntityDeleteOptions, user: UserInfo): Promise<{ success: boolean, error?: string, details?: any }> {
|
|
211
|
+
try {
|
|
212
|
+
// Get entity object
|
|
213
|
+
const md = new Metadata();
|
|
214
|
+
const entity = await md.GetEntityObject(entityName, user);
|
|
215
|
+
|
|
216
|
+
// Check permissions
|
|
217
|
+
if (!entity.CheckPermissions(EntityPermissionType.Delete, false)) {
|
|
218
|
+
return {
|
|
219
|
+
success: false,
|
|
220
|
+
error: `User ${user.Name} does not have permission to delete ${entityName} records`
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Create composite key
|
|
225
|
+
const compositeKey = this.createCompositeKeyFromId(entity, id);
|
|
226
|
+
|
|
227
|
+
// Load entity
|
|
228
|
+
const loadSuccess = await entity.InnerLoad(compositeKey);
|
|
229
|
+
|
|
230
|
+
if (!loadSuccess) {
|
|
231
|
+
return {
|
|
232
|
+
success: false,
|
|
233
|
+
error: `${entityName} with ID ${id} not found`
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Delete the entity
|
|
238
|
+
const deleteSuccess = await entity.Delete(options);
|
|
239
|
+
|
|
240
|
+
if (!deleteSuccess) {
|
|
241
|
+
const latestResult = entity.LatestResult;
|
|
242
|
+
return {
|
|
243
|
+
success: false,
|
|
244
|
+
error: latestResult?.Message || 'Failed to delete entity',
|
|
245
|
+
details: latestResult
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return { success: true };
|
|
250
|
+
} catch (error: any) {
|
|
251
|
+
LogError(error);
|
|
252
|
+
return { success: false, error: error?.message || 'Unknown error' };
|
|
253
|
+
}
|
|
278
254
|
}
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Helper method to create a composite key from an ID
|
|
258
|
+
*/
|
|
259
|
+
private static createCompositeKeyFromId(entity: BaseEntity, id: string | number): CompositeKey {
|
|
260
|
+
if (entity.EntityInfo.PrimaryKeys.length === 1) {
|
|
261
|
+
// Single primary key
|
|
262
|
+
const primaryKeyField = entity.EntityInfo.PrimaryKeys[0].Name;
|
|
263
|
+
const compositeKey = new CompositeKey();
|
|
264
|
+
const strId = id.toString();
|
|
265
|
+
|
|
266
|
+
// Use key-value pairs instead of SetValue
|
|
267
|
+
compositeKey.KeyValuePairs = [
|
|
268
|
+
{ FieldName: primaryKeyField, Value: strId }
|
|
269
|
+
];
|
|
270
|
+
|
|
271
|
+
return compositeKey;
|
|
272
|
+
} else {
|
|
273
|
+
// Composite primary key - this is a simplification
|
|
274
|
+
// In a real implementation, you would need to parse a composite ID string
|
|
275
|
+
// or accept an object with all primary key values
|
|
276
|
+
throw new Error('Composite primary keys are not supported in this simplified implementation');
|
|
277
|
+
}
|
|
300
278
|
}
|
|
301
|
-
|
|
302
|
-
}
|
|
279
|
+
}
|