@memberjunction/server 3.3.0 → 4.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/README.md +59 -0
- package/dist/agents/skip-agent.d.ts +65 -0
- package/dist/agents/skip-agent.d.ts.map +1 -1
- package/dist/agents/skip-agent.js +63 -5
- package/dist/agents/skip-agent.js.map +1 -1
- package/dist/agents/skip-sdk.d.ts +163 -0
- package/dist/agents/skip-sdk.d.ts.map +1 -1
- package/dist/agents/skip-sdk.js +143 -12
- package/dist/agents/skip-sdk.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/apolloServer/index.d.ts +0 -1
- package/dist/apolloServer/index.d.ts.map +1 -1
- package/dist/auth/APIKeyScopeAuth.d.ts +82 -0
- package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
- package/dist/auth/APIKeyScopeAuth.js +78 -0
- package/dist/auth/APIKeyScopeAuth.js.map +1 -1
- package/dist/auth/AuthProviderFactory.d.ts +35 -0
- package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
- package/dist/auth/AuthProviderFactory.js +51 -4
- package/dist/auth/AuthProviderFactory.js.map +1 -1
- package/dist/auth/BaseAuthProvider.d.ts +22 -0
- package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
- package/dist/auth/BaseAuthProvider.js +25 -8
- package/dist/auth/BaseAuthProvider.js.map +1 -1
- package/dist/auth/IAuthProvider.d.ts +33 -0
- package/dist/auth/IAuthProvider.d.ts.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 +5 -1
- package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
- package/dist/auth/exampleNewUserSubClass.js +21 -6
- package/dist/auth/exampleNewUserSubClass.js.map +1 -1
- package/dist/auth/index.d.ts +14 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +35 -22
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/initializeProviders.d.ts +3 -0
- package/dist/auth/initializeProviders.d.ts.map +1 -1
- package/dist/auth/initializeProviders.js +6 -0
- package/dist/auth/initializeProviders.js.map +1 -1
- package/dist/auth/newUsers.js +11 -2
- package/dist/auth/newUsers.js.map +1 -1
- package/dist/auth/providers/Auth0Provider.d.ts +9 -0
- package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
- package/dist/auth/providers/Auth0Provider.js +10 -0
- package/dist/auth/providers/Auth0Provider.js.map +1 -1
- package/dist/auth/providers/CognitoProvider.d.ts +9 -0
- package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
- package/dist/auth/providers/CognitoProvider.js +10 -0
- package/dist/auth/providers/CognitoProvider.js.map +1 -1
- package/dist/auth/providers/GoogleProvider.d.ts +9 -0
- package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
- package/dist/auth/providers/GoogleProvider.js +11 -1
- package/dist/auth/providers/GoogleProvider.js.map +1 -1
- package/dist/auth/providers/MSALProvider.d.ts +9 -0
- package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
- package/dist/auth/providers/MSALProvider.js +10 -0
- package/dist/auth/providers/MSALProvider.js.map +1 -1
- package/dist/auth/providers/OktaProvider.d.ts +9 -0
- package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
- package/dist/auth/providers/OktaProvider.js +10 -0
- package/dist/auth/providers/OktaProvider.js.map +1 -1
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +44 -10
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +8 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +26 -4
- package/dist/context.js.map +1 -1
- package/dist/directives/Public.js +2 -0
- package/dist/directives/Public.js.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.d.ts +7 -2
- package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
- package/dist/entitySubclasses/entityPermissions.server.js +26 -8
- package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
- package/dist/generated/generated.d.ts +954 -2
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +12183 -14532
- package/dist/generated/generated.js.map +1 -1
- package/dist/generic/DeleteOptionsInput.d.ts +3 -0
- package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
- package/dist/generic/DeleteOptionsInput.js +3 -2
- package/dist/generic/DeleteOptionsInput.js.map +1 -1
- package/dist/generic/KeyInputOutputTypes.js +0 -6
- package/dist/generic/KeyInputOutputTypes.js.map +1 -1
- package/dist/generic/KeyValuePairInput.d.ts +4 -0
- package/dist/generic/KeyValuePairInput.d.ts.map +1 -1
- package/dist/generic/KeyValuePairInput.js +4 -2
- package/dist/generic/KeyValuePairInput.js.map +1 -1
- package/dist/generic/PushStatusResolver.js +0 -3
- package/dist/generic/PushStatusResolver.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +59 -0
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +233 -18
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +22 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +42 -108
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -39
- package/dist/index.js.map +1 -1
- package/dist/orm.d.ts.map +1 -1
- package/dist/orm.js +2 -1
- package/dist/orm.js.map +1 -1
- package/dist/resolvers/APIKeyResolver.d.ts +76 -1
- package/dist/resolvers/APIKeyResolver.d.ts.map +1 -1
- package/dist/resolvers/APIKeyResolver.js +53 -11
- package/dist/resolvers/APIKeyResolver.js.map +1 -1
- package/dist/resolvers/ActionResolver.d.ts +191 -1
- package/dist/resolvers/ActionResolver.d.ts.map +1 -1
- package/dist/resolvers/ActionResolver.js +156 -22
- package/dist/resolvers/ActionResolver.js.map +1 -1
- package/dist/resolvers/ColorResolver.js +0 -5
- package/dist/resolvers/ColorResolver.js.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.d.ts +65 -0
- package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
- package/dist/resolvers/ComponentRegistryResolver.js +118 -40
- package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
- package/dist/resolvers/CreateQueryResolver.d.ts +47 -0
- package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/CreateQueryResolver.js +92 -116
- package/dist/resolvers/CreateQueryResolver.js.map +1 -1
- package/dist/resolvers/DatasetResolver.d.ts +5 -4
- package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
- package/dist/resolvers/DatasetResolver.js +9 -18
- package/dist/resolvers/DatasetResolver.js.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts +42 -1
- package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityCommunicationsResolver.js +5 -37
- package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +0 -7
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/FileCategoryResolver.js +13 -1
- package/dist/resolvers/FileCategoryResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts +16 -0
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +59 -74
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.d.ts +20 -2
- package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataContextDataResolver.js +27 -12
- package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts +19 -0
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +35 -35
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/InfoResolver.d.ts.map +1 -1
- package/dist/resolvers/InfoResolver.js +4 -7
- package/dist/resolvers/InfoResolver.js.map +1 -1
- package/dist/resolvers/MCPResolver.d.ts +361 -0
- package/dist/resolvers/MCPResolver.d.ts.map +1 -0
- package/dist/resolvers/MCPResolver.js +1270 -0
- package/dist/resolvers/MCPResolver.js.map +1 -0
- package/dist/resolvers/MergeRecordsResolver.d.ts +2 -1
- package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
- package/dist/resolvers/MergeRecordsResolver.js +6 -30
- package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
- package/dist/resolvers/PotentialDuplicateRecordResolver.js +0 -3
- package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
- package/dist/resolvers/QueryResolver.d.ts +22 -1
- package/dist/resolvers/QueryResolver.d.ts.map +1 -1
- package/dist/resolvers/QueryResolver.js +50 -37
- package/dist/resolvers/QueryResolver.js.map +1 -1
- package/dist/resolvers/ReportResolver.d.ts +5 -1
- package/dist/resolvers/ReportResolver.d.ts.map +1 -1
- package/dist/resolvers/ReportResolver.js +13 -11
- package/dist/resolvers/ReportResolver.js.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts +54 -0
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +118 -40
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.d.ts +42 -0
- package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIPromptResolver.js +98 -22
- package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
- package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTemplateResolver.js +10 -6
- package/dist/resolvers/RunTemplateResolver.js.map +1 -1
- package/dist/resolvers/RunTestResolver.d.ts +12 -0
- package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
- package/dist/resolvers/RunTestResolver.js +35 -21
- package/dist/resolvers/RunTestResolver.js.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts +312 -0
- package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
- package/dist/resolvers/SqlLoggingConfigResolver.js +295 -45
- package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
- package/dist/resolvers/SyncDataResolver.d.ts +21 -0
- package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncDataResolver.js +36 -22
- package/dist/resolvers/SyncDataResolver.js.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.d.ts +14 -0
- package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
- package/dist/resolvers/SyncRolesUsersResolver.js +54 -21
- package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
- package/dist/resolvers/TaskResolver.d.ts +13 -0
- package/dist/resolvers/TaskResolver.d.ts.map +1 -1
- package/dist/resolvers/TaskResolver.js +23 -7
- package/dist/resolvers/TaskResolver.js.map +1 -1
- package/dist/resolvers/TelemetryResolver.d.ts +22 -0
- package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
- package/dist/resolvers/TelemetryResolver.js +45 -79
- package/dist/resolvers/TelemetryResolver.js.map +1 -1
- package/dist/resolvers/TransactionGroupResolver.js +11 -13
- package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
- package/dist/resolvers/UserFavoriteResolver.js +3 -12
- package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
- package/dist/resolvers/UserResolver.d.ts.map +1 -1
- package/dist/resolvers/UserResolver.js +14 -0
- package/dist/resolvers/UserResolver.js.map +1 -1
- package/dist/resolvers/UserViewResolver.js +4 -0
- package/dist/resolvers/UserViewResolver.js.map +1 -1
- package/dist/resolvers/VersionHistoryResolver.d.ts +39 -0
- package/dist/resolvers/VersionHistoryResolver.d.ts.map +1 -0
- package/dist/resolvers/VersionHistoryResolver.js +208 -0
- package/dist/resolvers/VersionHistoryResolver.js.map +1 -0
- package/dist/rest/EntityCRUDHandler.d.ts +19 -0
- package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
- package/dist/rest/EntityCRUDHandler.js +55 -0
- package/dist/rest/EntityCRUDHandler.js.map +1 -1
- package/dist/rest/OAuthCallbackHandler.d.ts +143 -0
- package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -0
- package/dist/rest/OAuthCallbackHandler.js +634 -0
- package/dist/rest/OAuthCallbackHandler.js.map +1 -0
- package/dist/rest/RESTEndpointHandler.d.ts +120 -0
- package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
- package/dist/rest/RESTEndpointHandler.js +213 -24
- package/dist/rest/RESTEndpointHandler.js.map +1 -1
- package/dist/rest/ViewOperationsHandler.d.ts +19 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +39 -0
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/rest/index.d.ts +1 -0
- package/dist/rest/index.d.ts.map +1 -1
- package/dist/rest/index.js +1 -0
- package/dist/rest/index.js.map +1 -1
- package/dist/rest/setupRESTEndpoints.d.ts +35 -0
- package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
- package/dist/rest/setupRESTEndpoints.js +15 -1
- package/dist/rest/setupRESTEndpoints.js.map +1 -1
- package/dist/services/ScheduledJobsService.d.ts +31 -0
- package/dist/services/ScheduledJobsService.d.ts.map +1 -1
- package/dist/services/ScheduledJobsService.js +38 -4
- package/dist/services/ScheduledJobsService.js.map +1 -1
- package/dist/services/TaskOrchestrator.d.ts +73 -0
- package/dist/services/TaskOrchestrator.d.ts.map +1 -1
- package/dist/services/TaskOrchestrator.js +137 -15
- package/dist/services/TaskOrchestrator.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -13
- package/dist/types.js.map +1 -1
- package/dist/util.d.ts +37 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +55 -8
- package/dist/util.js.map +1 -1
- package/package.json +79 -77
- package/src/auth/BaseAuthProvider.ts +3 -0
- package/src/auth/IAuthProvider.ts +5 -0
- package/src/auth/exampleNewUserSubClass.ts +1 -5
- package/src/config.ts +2 -2
- package/src/entitySubclasses/entityPermissions.server.ts +1 -3
- package/src/generated/generated.ts +6245 -2558
- package/src/generic/ResolverBase.ts +89 -3
- package/src/index.ts +71 -64
- package/src/resolvers/APIKeyResolver.ts +8 -1
- package/src/resolvers/ActionResolver.ts +8 -1
- package/src/resolvers/DatasetResolver.ts +11 -4
- package/src/resolvers/EntityCommunicationsResolver.ts +5 -1
- package/src/resolvers/GetDataContextDataResolver.ts +14 -6
- package/src/resolvers/InfoResolver.ts +5 -1
- package/src/resolvers/MCPResolver.ts +1380 -0
- package/src/resolvers/MergeRecordsResolver.ts +5 -1
- package/src/resolvers/PotentialDuplicateRecordResolver.ts +0 -4
- package/src/resolvers/QueryResolver.ts +17 -3
- package/src/resolvers/ReportResolver.ts +8 -1
- package/src/resolvers/RunAIAgentResolver.ts +6 -0
- package/src/resolvers/RunAIPromptResolver.ts +10 -1
- package/src/resolvers/RunTemplateResolver.ts +4 -1
- package/src/resolvers/TaskResolver.ts +3 -0
- package/src/resolvers/UserResolver.ts +15 -3
- package/src/resolvers/VersionHistoryResolver.ts +177 -0
- package/src/rest/OAuthCallbackHandler.ts +766 -0
- package/src/rest/RESTEndpointHandler.ts +58 -35
- package/src/rest/index.ts +2 -1
- package/src/rest/setupRESTEndpoints.ts +13 -12
- package/src/resolvers/AskSkipResolver.ts +0 -3446
- package/src/scheduler/LearningCycleScheduler.ts +0 -320
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
import { CompositeKey, EntityPermissionType, EntitySaveOptions, LogError, Metadata } from '@memberjunction/core';
|
|
2
|
+
/**
|
|
3
|
+
* Entity CRUD Implementation Functions for REST endpoints
|
|
4
|
+
* These functions contain the detailed implementation for entity operations
|
|
5
|
+
*/
|
|
2
6
|
export class EntityCRUDHandler {
|
|
7
|
+
/**
|
|
8
|
+
* Create a new entity
|
|
9
|
+
*/
|
|
3
10
|
static async createEntity(entityName, data, user) {
|
|
4
11
|
try {
|
|
12
|
+
// Get entity object
|
|
5
13
|
const md = new Metadata();
|
|
6
14
|
const entity = await md.GetEntityObject(entityName, user);
|
|
15
|
+
// Check permissions
|
|
7
16
|
if (!entity.CheckPermissions(EntityPermissionType.Create, false)) {
|
|
8
17
|
return {
|
|
9
18
|
success: false,
|
|
10
19
|
error: `User ${user.Name} does not have permission to create ${entityName} records`
|
|
11
20
|
};
|
|
12
21
|
}
|
|
22
|
+
// Create new record
|
|
13
23
|
entity.NewRecord();
|
|
24
|
+
// Extract save options if provided
|
|
14
25
|
const options = new EntitySaveOptions();
|
|
15
26
|
if (data.options) {
|
|
16
27
|
const { IgnoreDirtyState, SkipEntityAIActions, SkipEntityActions, ReplayOnly, SkipOldValuesCheck } = data.options;
|
|
@@ -24,11 +35,14 @@ export class EntityCRUDHandler {
|
|
|
24
35
|
options.ReplayOnly = !!ReplayOnly;
|
|
25
36
|
if (SkipOldValuesCheck !== undefined)
|
|
26
37
|
options.SkipOldValuesCheck = !!SkipOldValuesCheck;
|
|
38
|
+
// Remove options from data
|
|
27
39
|
delete data.options;
|
|
28
40
|
}
|
|
41
|
+
// Set values on the entity
|
|
29
42
|
for (const key in data) {
|
|
30
43
|
entity.Set(key, data[key]);
|
|
31
44
|
}
|
|
45
|
+
// Validate entity
|
|
32
46
|
const validationResult = entity.Validate();
|
|
33
47
|
if (!validationResult.Success) {
|
|
34
48
|
return {
|
|
@@ -37,6 +51,7 @@ export class EntityCRUDHandler {
|
|
|
37
51
|
validationErrors: validationResult.Errors
|
|
38
52
|
};
|
|
39
53
|
}
|
|
54
|
+
// Save entity
|
|
40
55
|
const saveSuccess = await entity.Save(options);
|
|
41
56
|
if (!saveSuccess) {
|
|
42
57
|
const latestResult = entity.LatestResult;
|
|
@@ -46,6 +61,7 @@ export class EntityCRUDHandler {
|
|
|
46
61
|
details: latestResult
|
|
47
62
|
};
|
|
48
63
|
}
|
|
64
|
+
// Get entity data for response
|
|
49
65
|
const entityData = await entity.GetDataObject();
|
|
50
66
|
return { success: true, entity: entityData };
|
|
51
67
|
}
|
|
@@ -54,17 +70,24 @@ export class EntityCRUDHandler {
|
|
|
54
70
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
55
71
|
}
|
|
56
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* Read an entity by ID
|
|
75
|
+
*/
|
|
57
76
|
static async getEntity(entityName, id, relatedEntities = null, user) {
|
|
58
77
|
try {
|
|
78
|
+
// Get entity object
|
|
59
79
|
const md = new Metadata();
|
|
60
80
|
const entity = await md.GetEntityObject(entityName, user);
|
|
81
|
+
// Check permissions
|
|
61
82
|
if (!entity.CheckPermissions(EntityPermissionType.Read, false)) {
|
|
62
83
|
return {
|
|
63
84
|
success: false,
|
|
64
85
|
error: `User ${user.Name} does not have permission to read ${entityName} records`
|
|
65
86
|
};
|
|
66
87
|
}
|
|
88
|
+
// Create composite key
|
|
67
89
|
const compositeKey = this.createCompositeKeyFromId(entity, id);
|
|
90
|
+
// Load entity
|
|
68
91
|
const loadSuccess = await entity.InnerLoad(compositeKey, relatedEntities);
|
|
69
92
|
if (!loadSuccess) {
|
|
70
93
|
return {
|
|
@@ -72,6 +95,7 @@ export class EntityCRUDHandler {
|
|
|
72
95
|
error: `${entityName} with ID ${id} not found`
|
|
73
96
|
};
|
|
74
97
|
}
|
|
98
|
+
// Get entity data for response
|
|
75
99
|
const entityData = await entity.GetDataObject();
|
|
76
100
|
return { success: true, entity: entityData };
|
|
77
101
|
}
|
|
@@ -80,17 +104,24 @@ export class EntityCRUDHandler {
|
|
|
80
104
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
81
105
|
}
|
|
82
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Update an existing entity
|
|
109
|
+
*/
|
|
83
110
|
static async updateEntity(entityName, id, data, user) {
|
|
84
111
|
try {
|
|
112
|
+
// Get entity object
|
|
85
113
|
const md = new Metadata();
|
|
86
114
|
const entity = await md.GetEntityObject(entityName, user);
|
|
115
|
+
// Check permissions
|
|
87
116
|
if (!entity.CheckPermissions(EntityPermissionType.Update, false)) {
|
|
88
117
|
return {
|
|
89
118
|
success: false,
|
|
90
119
|
error: `User ${user.Name} does not have permission to update ${entityName} records`
|
|
91
120
|
};
|
|
92
121
|
}
|
|
122
|
+
// Create composite key
|
|
93
123
|
const compositeKey = this.createCompositeKeyFromId(entity, id);
|
|
124
|
+
// Load entity
|
|
94
125
|
const loadSuccess = await entity.InnerLoad(compositeKey);
|
|
95
126
|
if (!loadSuccess) {
|
|
96
127
|
return {
|
|
@@ -98,6 +129,7 @@ export class EntityCRUDHandler {
|
|
|
98
129
|
error: `${entityName} with ID ${id} not found`
|
|
99
130
|
};
|
|
100
131
|
}
|
|
132
|
+
// Extract save options if provided
|
|
101
133
|
const options = new EntitySaveOptions();
|
|
102
134
|
if (data.options) {
|
|
103
135
|
const { IgnoreDirtyState, SkipEntityAIActions, SkipEntityActions, ReplayOnly, SkipOldValuesCheck } = data.options;
|
|
@@ -111,15 +143,20 @@ export class EntityCRUDHandler {
|
|
|
111
143
|
options.ReplayOnly = !!ReplayOnly;
|
|
112
144
|
if (SkipOldValuesCheck !== undefined)
|
|
113
145
|
options.SkipOldValuesCheck = !!SkipOldValuesCheck;
|
|
146
|
+
// Remove options from data
|
|
114
147
|
delete data.options;
|
|
115
148
|
}
|
|
149
|
+
// Update entity with new values
|
|
116
150
|
for (const key in data) {
|
|
117
151
|
entity.Set(key, data[key]);
|
|
118
152
|
}
|
|
153
|
+
// Check if entity is dirty
|
|
119
154
|
if (!entity.Dirty && !options.IgnoreDirtyState) {
|
|
155
|
+
// Nothing changed, return success
|
|
120
156
|
const entityData = await entity.GetDataObject();
|
|
121
157
|
return { success: true, entity: entityData };
|
|
122
158
|
}
|
|
159
|
+
// Validate entity
|
|
123
160
|
const validationResult = entity.Validate();
|
|
124
161
|
if (!validationResult.Success) {
|
|
125
162
|
return {
|
|
@@ -128,6 +165,7 @@ export class EntityCRUDHandler {
|
|
|
128
165
|
validationErrors: validationResult.Errors
|
|
129
166
|
};
|
|
130
167
|
}
|
|
168
|
+
// Save entity
|
|
131
169
|
const saveSuccess = await entity.Save(options);
|
|
132
170
|
if (!saveSuccess) {
|
|
133
171
|
const latestResult = entity.LatestResult;
|
|
@@ -137,6 +175,7 @@ export class EntityCRUDHandler {
|
|
|
137
175
|
details: latestResult
|
|
138
176
|
};
|
|
139
177
|
}
|
|
178
|
+
// Get entity data for response
|
|
140
179
|
const entityData = await entity.GetDataObject();
|
|
141
180
|
return { success: true, entity: entityData };
|
|
142
181
|
}
|
|
@@ -145,17 +184,24 @@ export class EntityCRUDHandler {
|
|
|
145
184
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
146
185
|
}
|
|
147
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Delete an entity
|
|
189
|
+
*/
|
|
148
190
|
static async deleteEntity(entityName, id, options, user) {
|
|
149
191
|
try {
|
|
192
|
+
// Get entity object
|
|
150
193
|
const md = new Metadata();
|
|
151
194
|
const entity = await md.GetEntityObject(entityName, user);
|
|
195
|
+
// Check permissions
|
|
152
196
|
if (!entity.CheckPermissions(EntityPermissionType.Delete, false)) {
|
|
153
197
|
return {
|
|
154
198
|
success: false,
|
|
155
199
|
error: `User ${user.Name} does not have permission to delete ${entityName} records`
|
|
156
200
|
};
|
|
157
201
|
}
|
|
202
|
+
// Create composite key
|
|
158
203
|
const compositeKey = this.createCompositeKeyFromId(entity, id);
|
|
204
|
+
// Load entity
|
|
159
205
|
const loadSuccess = await entity.InnerLoad(compositeKey);
|
|
160
206
|
if (!loadSuccess) {
|
|
161
207
|
return {
|
|
@@ -163,6 +209,7 @@ export class EntityCRUDHandler {
|
|
|
163
209
|
error: `${entityName} with ID ${id} not found`
|
|
164
210
|
};
|
|
165
211
|
}
|
|
212
|
+
// Delete the entity
|
|
166
213
|
const deleteSuccess = await entity.Delete(options);
|
|
167
214
|
if (!deleteSuccess) {
|
|
168
215
|
const latestResult = entity.LatestResult;
|
|
@@ -179,17 +226,25 @@ export class EntityCRUDHandler {
|
|
|
179
226
|
return { success: false, error: error?.message || 'Unknown error' };
|
|
180
227
|
}
|
|
181
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* Helper method to create a composite key from an ID
|
|
231
|
+
*/
|
|
182
232
|
static createCompositeKeyFromId(entity, id) {
|
|
183
233
|
if (entity.EntityInfo.PrimaryKeys.length === 1) {
|
|
234
|
+
// Single primary key
|
|
184
235
|
const primaryKeyField = entity.EntityInfo.PrimaryKeys[0].Name;
|
|
185
236
|
const compositeKey = new CompositeKey();
|
|
186
237
|
const strId = id.toString();
|
|
238
|
+
// Use key-value pairs instead of SetValue
|
|
187
239
|
compositeKey.KeyValuePairs = [
|
|
188
240
|
{ FieldName: primaryKeyField, Value: strId }
|
|
189
241
|
];
|
|
190
242
|
return compositeKey;
|
|
191
243
|
}
|
|
192
244
|
else {
|
|
245
|
+
// Composite primary key - this is a simplification
|
|
246
|
+
// In a real implementation, you would need to parse a composite ID string
|
|
247
|
+
// or accept an object with all primary key values
|
|
193
248
|
throw new Error('Composite primary keys are not supported in this simplified implementation');
|
|
194
249
|
}
|
|
195
250
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityCRUDHandler.js","sourceRoot":"","sources":["../../src/rest/EntityCRUDHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EACS,YAAY,EAAuB,oBAAoB,EACnE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EACxC,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"EntityCRUDHandler.js","sourceRoot":"","sources":["../../src/rest/EntityCRUDHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview OAuth Callback Handler for MCP OAuth flows
|
|
3
|
+
*
|
|
4
|
+
* Handles OAuth authorization callbacks from external authorization servers.
|
|
5
|
+
* This endpoint is unauthenticated since it's called by the auth server after user consent.
|
|
6
|
+
*
|
|
7
|
+
* Endpoints:
|
|
8
|
+
* - GET /api/v1/oauth/callback - Authorization callback
|
|
9
|
+
* - GET /api/v1/oauth/status/:stateParameter - Poll for authorization status (authenticated)
|
|
10
|
+
* - POST /api/v1/oauth/initiate - Initiate OAuth flow (authenticated)
|
|
11
|
+
*
|
|
12
|
+
* @module @memberjunction/server/rest/OAuthCallbackHandler
|
|
13
|
+
*/
|
|
14
|
+
import express from 'express';
|
|
15
|
+
/**
|
|
16
|
+
* Configuration for OAuth callback handler
|
|
17
|
+
*/
|
|
18
|
+
export interface OAuthCallbackHandlerOptions {
|
|
19
|
+
/** Base URL for this MJAPI instance (for redirects) */
|
|
20
|
+
publicUrl: string;
|
|
21
|
+
/** URL to redirect to after successful authorization */
|
|
22
|
+
successRedirectUrl?: string;
|
|
23
|
+
/** URL to redirect to after failed authorization */
|
|
24
|
+
errorRedirectUrl?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Handles OAuth callbacks and related endpoints for MCP server authentication.
|
|
28
|
+
*
|
|
29
|
+
* The callback endpoint is unauthenticated because it's called by external auth servers.
|
|
30
|
+
* It uses the state parameter to look up the authorization context and validate the flow.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const oauthHandler = new OAuthCallbackHandler({
|
|
35
|
+
* publicUrl: 'https://api.example.com'
|
|
36
|
+
* });
|
|
37
|
+
*
|
|
38
|
+
* // Mount unauthenticated callback route
|
|
39
|
+
* app.use('/api/v1/oauth', oauthHandler.getCallbackRouter());
|
|
40
|
+
*
|
|
41
|
+
* // Mount authenticated routes
|
|
42
|
+
* app.use('/api/v1/oauth', authMiddleware, oauthHandler.getAuthenticatedRouter());
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare class OAuthCallbackHandler {
|
|
46
|
+
private readonly options;
|
|
47
|
+
private readonly oauthManager;
|
|
48
|
+
private readonly callbackRouter;
|
|
49
|
+
private readonly authenticatedRouter;
|
|
50
|
+
constructor(options: OAuthCallbackHandlerOptions);
|
|
51
|
+
/**
|
|
52
|
+
* Sets up all routes for OAuth handling.
|
|
53
|
+
*/
|
|
54
|
+
private setupRoutes;
|
|
55
|
+
/**
|
|
56
|
+
* Renders a success page after OAuth authorization completes.
|
|
57
|
+
*/
|
|
58
|
+
private handleSuccessPage;
|
|
59
|
+
/**
|
|
60
|
+
* Renders an error page when OAuth authorization fails.
|
|
61
|
+
*/
|
|
62
|
+
private handleErrorPage;
|
|
63
|
+
/**
|
|
64
|
+
* Handles the OAuth authorization callback.
|
|
65
|
+
*
|
|
66
|
+
* This endpoint is unauthenticated - the auth server redirects here after user consent.
|
|
67
|
+
* We validate the state parameter and exchange the code for tokens.
|
|
68
|
+
*
|
|
69
|
+
* @param req - Express request
|
|
70
|
+
* @param res - Express response
|
|
71
|
+
*/
|
|
72
|
+
private handleCallback;
|
|
73
|
+
/**
|
|
74
|
+
* Gets the status of an OAuth authorization flow.
|
|
75
|
+
*
|
|
76
|
+
* Authenticated endpoint for polling authorization status.
|
|
77
|
+
*
|
|
78
|
+
* @param req - Express request
|
|
79
|
+
* @param res - Express response
|
|
80
|
+
*/
|
|
81
|
+
private getStatus;
|
|
82
|
+
/**
|
|
83
|
+
* Initiates a new OAuth authorization flow.
|
|
84
|
+
*
|
|
85
|
+
* Authenticated endpoint for starting OAuth authorization.
|
|
86
|
+
*
|
|
87
|
+
* @param req - Express request
|
|
88
|
+
* @param res - Express response
|
|
89
|
+
*/
|
|
90
|
+
private initiateFlow;
|
|
91
|
+
/**
|
|
92
|
+
* Exchanges an authorization code for tokens.
|
|
93
|
+
*
|
|
94
|
+
* This endpoint is used when the frontend handles the OAuth callback.
|
|
95
|
+
* The frontend receives the code and state from the OAuth provider redirect,
|
|
96
|
+
* then calls this authenticated endpoint to complete the token exchange.
|
|
97
|
+
*
|
|
98
|
+
* @param req - Express request with { code, state } in body
|
|
99
|
+
* @param res - Express response
|
|
100
|
+
*/
|
|
101
|
+
private handleExchange;
|
|
102
|
+
/**
|
|
103
|
+
* Gets the system user from cache.
|
|
104
|
+
*/
|
|
105
|
+
private getSystemUser;
|
|
106
|
+
/**
|
|
107
|
+
* Loads authorization state from database.
|
|
108
|
+
*/
|
|
109
|
+
private loadAuthorizationState;
|
|
110
|
+
/**
|
|
111
|
+
* Loads connection and server OAuth configuration.
|
|
112
|
+
*/
|
|
113
|
+
private loadConnectionConfig;
|
|
114
|
+
/**
|
|
115
|
+
* Redirects to success page with state info.
|
|
116
|
+
* If a frontend return URL is provided, redirects there instead of the default success page.
|
|
117
|
+
*/
|
|
118
|
+
private redirectToSuccess;
|
|
119
|
+
/**
|
|
120
|
+
* Redirects to error page with error info.
|
|
121
|
+
* If a frontend return URL is provided, redirects there instead of the default error page.
|
|
122
|
+
*/
|
|
123
|
+
private redirectToError;
|
|
124
|
+
/**
|
|
125
|
+
* Gets the router for unauthenticated callback endpoint.
|
|
126
|
+
*/
|
|
127
|
+
getCallbackRouter(): express.Router;
|
|
128
|
+
/**
|
|
129
|
+
* Gets the router for authenticated OAuth endpoints.
|
|
130
|
+
*/
|
|
131
|
+
getAuthenticatedRouter(): express.Router;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Creates and configures the OAuth callback handler.
|
|
135
|
+
*
|
|
136
|
+
* @param options - Handler configuration
|
|
137
|
+
* @returns Object with callback and authenticated routers
|
|
138
|
+
*/
|
|
139
|
+
export declare function createOAuthCallbackHandler(options: OAuthCallbackHandlerOptions): {
|
|
140
|
+
callbackRouter: express.Router;
|
|
141
|
+
authenticatedRouter: express.Router;
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=OAuthCallbackHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OAuthCallbackHandler.d.ts","sourceRoot":"","sources":["../../src/rest/OAuthCallbackHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,OAAO,MAAM,SAAS,CAAC;AAe9B;;GAEG;AACH,MAAM,WAAW,2BAA2B;IACxC,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAiB;gBAEzC,OAAO,EAAE,2BAA2B;IAYhD;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAmCvB;;;;;;;;OAQG;YACW,cAAc;IAkF5B;;;;;;;OAOG;YACW,SAAS;IA0EvB;;;;;;;OAOG;YACW,YAAY;IA2F1B;;;;;;;;;OASG;YACW,cAAc;IA+F5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;YACW,sBAAsB;IAoDpC;;OAEG;YACW,oBAAoB;IAmElC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAwBzB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAwBvB;;OAEG;IACI,iBAAiB,IAAI,OAAO,CAAC,MAAM;IAI1C;;OAEG;IACI,sBAAsB,IAAI,OAAO,CAAC,MAAM;CAGlD;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,2BAA2B,GAAG;IAC9E,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC;IAC/B,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC;CACvC,CAMA"}
|