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