snow-flow 8.41.23 → 8.42.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/CLAUDE.md +9 -6
- package/dist/api/health-api.d.ts +1 -1
- package/dist/api/health-api.d.ts.map +1 -1
- package/dist/api/simple-health-api.d.ts +1 -1
- package/dist/api/simple-health-api.d.ts.map +1 -1
- package/dist/mcp/servicenow-automation-mcp.js +8 -8
- package/dist/mcp/servicenow-automation-mcp.js.map +1 -1
- package/dist/mcp/servicenow-mcp-server.js +4 -4
- package/dist/mcp/servicenow-mcp-server.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/index.d.ts +1 -2
- package/dist/mcp/servicenow-mcp-unified/tools/automation/index.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/index.js +6 -8
- package/dist/mcp/servicenow-mcp-unified/tools/automation/index.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_confirm_script_execution.d.ts +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_confirm_script_execution.js +2 -2
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_confirm_script_execution.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_schedule_script_job.d.ts +26 -0
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_schedule_script_job.d.ts.map +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/automation/{snow_execute_script.js → snow_schedule_script_job.js} +19 -13
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_schedule_script_job.js.map +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.d.ts +12 -4
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.js +69 -67
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_trace_execution.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_artifact.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_artifact.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_artifact.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_requirements.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_requirements.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_analyze_requirements.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_artifact.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_artifact.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_artifact.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_by_sysid.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_by_sysid.js +5 -2
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_edit_by_sysid.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_find_artifact.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_find_artifact.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_find_artifact.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_get_by_sysid.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_get_by_sysid.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_get_by_sysid.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_memory_search.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_memory_search.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_memory_search.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_orchestrate_development.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_orchestrate_development.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_orchestrate_development.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_sync_data_consistency.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_sync_data_consistency.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_sync_data_consistency.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_validate_live_connection.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_validate_live_connection.js +2 -1
- package/dist/mcp/servicenow-mcp-unified/tools/development/snow_validate_live_connection.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/integration/index.d.ts +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/integration/index.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/integration/index.js +4 -1
- package/dist/mcp/servicenow-mcp-unified/tools/integration/index.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.d.ts +26 -0
- package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.d.ts.map +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.js +1280 -0
- package/dist/mcp/servicenow-mcp-unified/tools/integration/snow_rest_message_manage.js.map +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/index.d.ts +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/index.js +4 -4
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.d.ts +19 -0
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.d.ts.map +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.js +142 -0
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_trigger_scheduled_job.js.map +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.d.ts +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.d.ts.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.js +4 -4
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/index.js.map +1 -1
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.d.ts +15 -0
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.d.ts.map +1 -0
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.js +136 -0
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_start_workflow.js.map +1 -0
- package/dist/templates/agents-md-template.d.ts +1 -1
- package/dist/templates/agents-md-template.d.ts.map +1 -1
- package/dist/templates/agents-md-template.js +5 -5
- package/dist/templates/claude-md-template.d.ts +1 -1
- package/dist/templates/claude-md-template.d.ts.map +1 -1
- package/dist/templates/claude-md-template.js +11 -9
- package/dist/templates/claude-md-template.js.map +1 -1
- package/dist/utils/auto-update-snow-code.d.ts +7 -0
- package/dist/utils/auto-update-snow-code.d.ts.map +1 -1
- package/dist/utils/auto-update-snow-code.js +62 -13
- package/dist/utils/auto-update-snow-code.js.map +1 -1
- package/package.json +1 -1
- package/.snow-code/opencode.json +0 -49
- package/dist/cli/enterprise-docs-generator.d.ts +0 -14
- package/dist/cli/enterprise-docs-generator.d.ts.map +0 -1
- package/dist/cli/enterprise-docs-generator.js +0 -875
- package/dist/cli/enterprise-docs-generator.js.map +0 -1
- package/dist/config/snowcode-config.d.ts +0 -76
- package/dist/config/snowcode-config.d.ts.map +0 -1
- package/dist/config/snowcode-config.js +0 -225
- package/dist/config/snowcode-config.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_execute_script.d.ts +0 -20
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_execute_script.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_execute_script.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.d.ts +0 -11
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.js +0 -142
- package/dist/mcp/servicenow-mcp-unified/tools/automation/snow_test_rest_connection.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/index.d.ts +0 -8
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/index.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/index.js +0 -24
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/index.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_execute_flow.d.ts +0 -8
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_execute_flow.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_execute_flow.js +0 -44
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_execute_flow.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_connectivity_test.d.ts +0 -8
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_connectivity_test.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_connectivity_test.js +0 -67
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_connectivity_test.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_discover.d.ts +0 -15
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_discover.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_discover.js +0 -273
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_discover.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_query.d.ts +0 -14
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_query.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_query.js +0 -205
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_flow_query.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_import_flow_from_xml.d.ts +0 -8
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_import_flow_from_xml.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_import_flow_from_xml.js +0 -68
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_import_flow_from_xml.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_manage_flow.d.ts +0 -143
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_manage_flow.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_manage_flow.js +0 -2293
- package/dist/mcp/servicenow-mcp-unified/tools/flow-designer/snow_manage_flow.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.d.ts +0 -9
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.js +0 -57
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_create_rest_method.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.d.ts +0 -9
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.js +0 -58
- package/dist/mcp/servicenow-mcp-unified/tools/rest-api/snow_test_rest_message.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.d.ts +0 -9
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.js +0 -59
- package/dist/mcp/servicenow-mcp-unified/tools/scheduled-jobs/snow_execute_scheduled_job.js.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.d.ts +0 -9
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.d.ts.map +0 -1
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.js +0 -55
- package/dist/mcp/servicenow-mcp-unified/tools/workflow/snow_execute_workflow.js.map +0 -1
- package/dist/sdk/claude-agent-sdk-integration.d.ts +0 -103
- package/dist/sdk/claude-agent-sdk-integration.d.ts.map +0 -1
- package/dist/sdk/claude-agent-sdk-integration.js +0 -414
- package/dist/sdk/claude-agent-sdk-integration.js.map +0 -1
|
@@ -0,0 +1,1280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* snow_rest_message_manage - Universal REST Message Management Tool
|
|
4
|
+
*
|
|
5
|
+
* Complete CRUD operations for REST Messages, HTTP Methods, Headers, and Parameters.
|
|
6
|
+
*
|
|
7
|
+
* Tables used:
|
|
8
|
+
* - sys_rest_message: REST Message definitions
|
|
9
|
+
* - sys_rest_message_headers: Headers for REST Message (apply to ALL methods)
|
|
10
|
+
* - sys_rest_message_fn: HTTP Methods (functions) for REST Messages
|
|
11
|
+
* - sys_rest_message_fn_headers: Headers for specific HTTP Methods
|
|
12
|
+
* - sys_rest_message_fn_parameters: Query parameters for HTTP Methods
|
|
13
|
+
*
|
|
14
|
+
* Header Levels:
|
|
15
|
+
* - Message headers (sys_rest_message_headers): Apply to ALL methods in the REST message
|
|
16
|
+
* - Method headers (sys_rest_message_fn_headers): Apply only to specific method
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.changelog = exports.author = exports.version = exports.toolDefinition = void 0;
|
|
20
|
+
exports.execute = execute;
|
|
21
|
+
const auth_js_1 = require("../../shared/auth.js");
|
|
22
|
+
const error_handler_js_1 = require("../../shared/error-handler.js");
|
|
23
|
+
exports.toolDefinition = {
|
|
24
|
+
name: 'snow_rest_message_manage',
|
|
25
|
+
description: `Universal REST Message management tool. CRUD operations for:
|
|
26
|
+
• REST Messages (list, get, create, update, delete)
|
|
27
|
+
• HTTP Methods (list_methods, get_method, create_method, update_method, delete_method)
|
|
28
|
+
• Message-level Headers - apply to ALL methods (list_message_headers, create_message_header, delete_message_header)
|
|
29
|
+
• Method-level Headers - apply to specific method (list_method_headers, create_method_header, delete_method_header)
|
|
30
|
+
• Query Parameters (list_parameters, create_parameter, delete_parameter)
|
|
31
|
+
• Testing (test) - generates ES5-compatible test script for snow_schedule_script_job`,
|
|
32
|
+
// Metadata for tool discovery (not sent to LLM)
|
|
33
|
+
category: 'integration',
|
|
34
|
+
subcategory: 'rest',
|
|
35
|
+
use_cases: ['integration', 'rest', 'api', 'crud', 'headers', 'parameters', 'testing'],
|
|
36
|
+
complexity: 'intermediate',
|
|
37
|
+
frequency: 'high',
|
|
38
|
+
// Permission enforcement
|
|
39
|
+
permission: 'write',
|
|
40
|
+
allowedRoles: ['developer', 'admin'],
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: 'object',
|
|
43
|
+
properties: {
|
|
44
|
+
action: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
enum: [
|
|
47
|
+
// REST Message operations
|
|
48
|
+
'list', // List all REST messages
|
|
49
|
+
'get', // Get a specific REST message with its methods
|
|
50
|
+
'create', // Create a new REST message
|
|
51
|
+
'update', // Update an existing REST message
|
|
52
|
+
'delete', // Delete a REST message
|
|
53
|
+
// Method operations
|
|
54
|
+
'list_methods', // List methods for a REST message
|
|
55
|
+
'get_method', // Get a specific method
|
|
56
|
+
'create_method', // Create a method for a REST message
|
|
57
|
+
'update_method', // Update a method
|
|
58
|
+
'delete_method', // Delete a method
|
|
59
|
+
// Message-level headers (apply to ALL methods)
|
|
60
|
+
'list_message_headers', // List headers at REST message level
|
|
61
|
+
'create_message_header', // Create header at REST message level
|
|
62
|
+
'delete_message_header', // Delete header at REST message level
|
|
63
|
+
// Method-level headers (apply to specific method only)
|
|
64
|
+
'list_method_headers', // List headers for a specific method
|
|
65
|
+
'create_method_header', // Create header for a specific method
|
|
66
|
+
'delete_method_header', // Delete header from a method
|
|
67
|
+
// Query parameters (for methods)
|
|
68
|
+
'list_parameters', // List query parameters for a method
|
|
69
|
+
'create_parameter', // Create query parameter for a method
|
|
70
|
+
'delete_parameter', // Delete query parameter from a method
|
|
71
|
+
// Testing
|
|
72
|
+
'test' // Test a REST message/method
|
|
73
|
+
],
|
|
74
|
+
description: 'Action to perform'
|
|
75
|
+
},
|
|
76
|
+
// For list action
|
|
77
|
+
filter: {
|
|
78
|
+
type: 'string',
|
|
79
|
+
description: 'Filter for list action (e.g., "nameLIKEopenai" or "active=true")'
|
|
80
|
+
},
|
|
81
|
+
limit: {
|
|
82
|
+
type: 'number',
|
|
83
|
+
description: 'Maximum results to return',
|
|
84
|
+
default: 50
|
|
85
|
+
},
|
|
86
|
+
// For get/update/delete actions
|
|
87
|
+
sys_id: {
|
|
88
|
+
type: 'string',
|
|
89
|
+
description: 'sys_id of REST message or method'
|
|
90
|
+
},
|
|
91
|
+
name: {
|
|
92
|
+
type: 'string',
|
|
93
|
+
description: 'Name of REST message (alternative to sys_id for lookup)'
|
|
94
|
+
},
|
|
95
|
+
// For create/update REST message
|
|
96
|
+
endpoint: {
|
|
97
|
+
type: 'string',
|
|
98
|
+
description: 'Base URL endpoint for REST message'
|
|
99
|
+
},
|
|
100
|
+
description: {
|
|
101
|
+
type: 'string',
|
|
102
|
+
description: 'Description of the REST message'
|
|
103
|
+
},
|
|
104
|
+
authentication_type: {
|
|
105
|
+
type: 'string',
|
|
106
|
+
enum: ['no_authentication', 'basic', 'oauth2', 'api_key', 'mutual_auth'],
|
|
107
|
+
description: 'Authentication type',
|
|
108
|
+
default: 'no_authentication'
|
|
109
|
+
},
|
|
110
|
+
basic_auth_profile: {
|
|
111
|
+
type: 'string',
|
|
112
|
+
description: 'Basic auth profile sys_id (if authentication_type is basic)'
|
|
113
|
+
},
|
|
114
|
+
oauth_profile: {
|
|
115
|
+
type: 'string',
|
|
116
|
+
description: 'OAuth profile sys_id (if authentication_type is oauth2)'
|
|
117
|
+
},
|
|
118
|
+
use_mid_server: {
|
|
119
|
+
type: 'boolean',
|
|
120
|
+
description: 'Route through MID Server',
|
|
121
|
+
default: false
|
|
122
|
+
},
|
|
123
|
+
mid_server: {
|
|
124
|
+
type: 'string',
|
|
125
|
+
description: 'MID Server name or sys_id'
|
|
126
|
+
},
|
|
127
|
+
// For method operations
|
|
128
|
+
rest_message_sys_id: {
|
|
129
|
+
type: 'string',
|
|
130
|
+
description: 'Parent REST message sys_id (for method operations)'
|
|
131
|
+
},
|
|
132
|
+
method_sys_id: {
|
|
133
|
+
type: 'string',
|
|
134
|
+
description: 'Method sys_id (for method update/delete)'
|
|
135
|
+
},
|
|
136
|
+
http_method: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
enum: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
|
|
139
|
+
description: 'HTTP method type',
|
|
140
|
+
default: 'GET'
|
|
141
|
+
},
|
|
142
|
+
relative_path: {
|
|
143
|
+
type: 'string',
|
|
144
|
+
description: 'Relative endpoint path for method (e.g., "/v1/completions")'
|
|
145
|
+
},
|
|
146
|
+
request_body: {
|
|
147
|
+
type: 'string',
|
|
148
|
+
description: 'Request body template (for POST/PUT/PATCH)'
|
|
149
|
+
},
|
|
150
|
+
// For headers
|
|
151
|
+
header_name: {
|
|
152
|
+
type: 'string',
|
|
153
|
+
description: 'Header name'
|
|
154
|
+
},
|
|
155
|
+
header_value: {
|
|
156
|
+
type: 'string',
|
|
157
|
+
description: 'Header value'
|
|
158
|
+
},
|
|
159
|
+
header_sys_id: {
|
|
160
|
+
type: 'string',
|
|
161
|
+
description: 'Header sys_id (for delete operations)'
|
|
162
|
+
},
|
|
163
|
+
headers: {
|
|
164
|
+
type: 'object',
|
|
165
|
+
description: 'Multiple headers as key-value pairs'
|
|
166
|
+
},
|
|
167
|
+
// For query parameters
|
|
168
|
+
parameter_name: {
|
|
169
|
+
type: 'string',
|
|
170
|
+
description: 'Query parameter name'
|
|
171
|
+
},
|
|
172
|
+
parameter_value: {
|
|
173
|
+
type: 'string',
|
|
174
|
+
description: 'Query parameter value'
|
|
175
|
+
},
|
|
176
|
+
parameter_sys_id: {
|
|
177
|
+
type: 'string',
|
|
178
|
+
description: 'Parameter sys_id (for delete operations)'
|
|
179
|
+
},
|
|
180
|
+
parameters: {
|
|
181
|
+
type: 'object',
|
|
182
|
+
description: 'Multiple query parameters as key-value pairs'
|
|
183
|
+
},
|
|
184
|
+
// For test action
|
|
185
|
+
test_params: {
|
|
186
|
+
type: 'object',
|
|
187
|
+
description: 'Parameters for testing the REST message'
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
required: ['action']
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
async function execute(args, context) {
|
|
194
|
+
const { action } = args;
|
|
195
|
+
try {
|
|
196
|
+
const client = await (0, auth_js_1.getAuthenticatedClient)(context);
|
|
197
|
+
switch (action) {
|
|
198
|
+
// REST Message operations
|
|
199
|
+
case 'list':
|
|
200
|
+
return await listRestMessages(client, args);
|
|
201
|
+
case 'get':
|
|
202
|
+
return await getRestMessage(client, args);
|
|
203
|
+
case 'create':
|
|
204
|
+
return await createRestMessage(client, args);
|
|
205
|
+
case 'update':
|
|
206
|
+
return await updateRestMessage(client, args);
|
|
207
|
+
case 'delete':
|
|
208
|
+
return await deleteRestMessage(client, args);
|
|
209
|
+
// Method operations
|
|
210
|
+
case 'list_methods':
|
|
211
|
+
return await listMethods(client, args);
|
|
212
|
+
case 'get_method':
|
|
213
|
+
return await getMethod(client, args);
|
|
214
|
+
case 'create_method':
|
|
215
|
+
return await createMethod(client, args);
|
|
216
|
+
case 'update_method':
|
|
217
|
+
return await updateMethod(client, args);
|
|
218
|
+
case 'delete_method':
|
|
219
|
+
return await deleteMethod(client, args);
|
|
220
|
+
// Message-level headers (apply to ALL methods)
|
|
221
|
+
case 'list_message_headers':
|
|
222
|
+
return await listMessageHeaders(client, args);
|
|
223
|
+
case 'create_message_header':
|
|
224
|
+
return await createMessageHeader(client, args);
|
|
225
|
+
case 'delete_message_header':
|
|
226
|
+
return await deleteMessageHeader(client, args);
|
|
227
|
+
// Method-level headers (apply to specific method only)
|
|
228
|
+
case 'list_method_headers':
|
|
229
|
+
return await listMethodHeaders(client, args);
|
|
230
|
+
case 'create_method_header':
|
|
231
|
+
return await createMethodHeader(client, args);
|
|
232
|
+
case 'delete_method_header':
|
|
233
|
+
return await deleteMethodHeader(client, args);
|
|
234
|
+
// Query parameters
|
|
235
|
+
case 'list_parameters':
|
|
236
|
+
return await listParameters(client, args);
|
|
237
|
+
case 'create_parameter':
|
|
238
|
+
return await createParameter(client, args);
|
|
239
|
+
case 'delete_parameter':
|
|
240
|
+
return await deleteParameter(client, args);
|
|
241
|
+
// Testing
|
|
242
|
+
case 'test':
|
|
243
|
+
return await testRestMessage(client, args);
|
|
244
|
+
default:
|
|
245
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, `Unknown action: ${action}. See tool description for valid actions.`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
if (error.response?.status === 403) {
|
|
250
|
+
return (0, error_handler_js_1.createErrorResult)(`Permission denied (403): Your ServiceNow user lacks permissions for REST message operations. ` +
|
|
251
|
+
`Required roles: 'rest_service' or 'admin'. ` +
|
|
252
|
+
`Please contact your ServiceNow administrator to grant the necessary permissions.`);
|
|
253
|
+
}
|
|
254
|
+
return (0, error_handler_js_1.createErrorResult)(error instanceof error_handler_js_1.SnowFlowError
|
|
255
|
+
? error
|
|
256
|
+
: new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.UNKNOWN_ERROR, error.message, { originalError: error }));
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// ============================================================================
|
|
260
|
+
// REST MESSAGE OPERATIONS
|
|
261
|
+
// ============================================================================
|
|
262
|
+
async function listRestMessages(client, args) {
|
|
263
|
+
const { filter, limit = 50 } = args;
|
|
264
|
+
const params = {
|
|
265
|
+
sysparm_fields: 'sys_id,name,rest_endpoint,description,authentication_type,use_mid_server,active,sys_updated_on',
|
|
266
|
+
sysparm_limit: limit
|
|
267
|
+
};
|
|
268
|
+
if (filter) {
|
|
269
|
+
params.sysparm_query = filter;
|
|
270
|
+
}
|
|
271
|
+
const response = await client.get('/api/now/table/sys_rest_message', { params });
|
|
272
|
+
const messages = response.data?.result || [];
|
|
273
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
274
|
+
action: 'list',
|
|
275
|
+
count: messages.length,
|
|
276
|
+
rest_messages: messages.map((m) => ({
|
|
277
|
+
sys_id: m.sys_id,
|
|
278
|
+
name: m.name,
|
|
279
|
+
endpoint: m.rest_endpoint,
|
|
280
|
+
description: m.description,
|
|
281
|
+
authentication_type: m.authentication_type,
|
|
282
|
+
use_mid_server: m.use_mid_server === 'true',
|
|
283
|
+
active: m.active === 'true',
|
|
284
|
+
updated: m.sys_updated_on
|
|
285
|
+
}))
|
|
286
|
+
}, { operation: 'list_rest_messages' });
|
|
287
|
+
}
|
|
288
|
+
async function getRestMessage(client, args) {
|
|
289
|
+
const { sys_id, name } = args;
|
|
290
|
+
if (!sys_id && !name) {
|
|
291
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either sys_id or name is required for get action');
|
|
292
|
+
}
|
|
293
|
+
let messageSysId = sys_id;
|
|
294
|
+
// Lookup by name if sys_id not provided
|
|
295
|
+
if (!messageSysId && name) {
|
|
296
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
297
|
+
params: {
|
|
298
|
+
sysparm_query: `name=${name}`,
|
|
299
|
+
sysparm_fields: 'sys_id',
|
|
300
|
+
sysparm_limit: 1
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
304
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
305
|
+
}
|
|
306
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
307
|
+
}
|
|
308
|
+
// Get the REST message
|
|
309
|
+
const messageResponse = await client.get(`/api/now/table/sys_rest_message/${messageSysId}`);
|
|
310
|
+
const message = messageResponse.data?.result;
|
|
311
|
+
if (!message) {
|
|
312
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${messageSysId}`);
|
|
313
|
+
}
|
|
314
|
+
// Get associated methods
|
|
315
|
+
const methodsResponse = await client.get('/api/now/table/sys_rest_message_fn', {
|
|
316
|
+
params: {
|
|
317
|
+
sysparm_query: `rest_message=${messageSysId}`,
|
|
318
|
+
sysparm_fields: 'sys_id,name,http_method,rest_endpoint,content,active'
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
const methods = methodsResponse.data?.result || [];
|
|
322
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
323
|
+
action: 'get',
|
|
324
|
+
rest_message: {
|
|
325
|
+
sys_id: message.sys_id,
|
|
326
|
+
name: message.name,
|
|
327
|
+
endpoint: message.rest_endpoint,
|
|
328
|
+
description: message.description,
|
|
329
|
+
authentication_type: message.authentication_type,
|
|
330
|
+
basic_auth_profile: message.basic_auth_profile,
|
|
331
|
+
oauth_profile: message.oauth2_profile,
|
|
332
|
+
use_mid_server: message.use_mid_server === 'true',
|
|
333
|
+
mid_server: message.mid_server,
|
|
334
|
+
active: message.active === 'true',
|
|
335
|
+
created: message.sys_created_on,
|
|
336
|
+
updated: message.sys_updated_on
|
|
337
|
+
},
|
|
338
|
+
methods: methods.map((m) => ({
|
|
339
|
+
sys_id: m.sys_id,
|
|
340
|
+
name: m.name,
|
|
341
|
+
http_method: m.http_method,
|
|
342
|
+
endpoint: m.rest_endpoint,
|
|
343
|
+
has_body: !!m.content,
|
|
344
|
+
active: m.active === 'true'
|
|
345
|
+
})),
|
|
346
|
+
method_count: methods.length
|
|
347
|
+
}, { operation: 'get_rest_message' });
|
|
348
|
+
}
|
|
349
|
+
async function createRestMessage(client, args) {
|
|
350
|
+
const { name, endpoint, description = '', authentication_type = 'no_authentication', basic_auth_profile, oauth_profile, use_mid_server = false, mid_server } = args;
|
|
351
|
+
if (!name || !endpoint) {
|
|
352
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'name and endpoint are required for create action');
|
|
353
|
+
}
|
|
354
|
+
const messageData = {
|
|
355
|
+
name,
|
|
356
|
+
rest_endpoint: endpoint,
|
|
357
|
+
description,
|
|
358
|
+
authentication_type,
|
|
359
|
+
use_mid_server,
|
|
360
|
+
active: true
|
|
361
|
+
};
|
|
362
|
+
if (authentication_type === 'basic' && basic_auth_profile) {
|
|
363
|
+
messageData.basic_auth_profile = basic_auth_profile;
|
|
364
|
+
}
|
|
365
|
+
if (authentication_type === 'oauth2' && oauth_profile) {
|
|
366
|
+
messageData.oauth2_profile = oauth_profile;
|
|
367
|
+
}
|
|
368
|
+
if (use_mid_server && mid_server) {
|
|
369
|
+
messageData.mid_server = mid_server;
|
|
370
|
+
}
|
|
371
|
+
const response = await client.post('/api/now/table/sys_rest_message', messageData);
|
|
372
|
+
const created = response.data?.result;
|
|
373
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
374
|
+
action: 'create',
|
|
375
|
+
created: true,
|
|
376
|
+
rest_message: {
|
|
377
|
+
sys_id: created.sys_id,
|
|
378
|
+
name: created.name,
|
|
379
|
+
endpoint: created.rest_endpoint,
|
|
380
|
+
authentication_type: created.authentication_type
|
|
381
|
+
},
|
|
382
|
+
message: `REST message "${name}" created successfully`,
|
|
383
|
+
next_steps: [
|
|
384
|
+
`Create methods using: action="create_method", rest_message_sys_id="${created.sys_id}"`,
|
|
385
|
+
`Add headers using: action="create_header", method_sys_id="<method_sys_id>"`
|
|
386
|
+
]
|
|
387
|
+
}, { operation: 'create_rest_message' });
|
|
388
|
+
}
|
|
389
|
+
async function updateRestMessage(client, args) {
|
|
390
|
+
const { sys_id, name, endpoint, description, authentication_type, basic_auth_profile, oauth_profile, use_mid_server, mid_server } = args;
|
|
391
|
+
let messageSysId = sys_id;
|
|
392
|
+
// Lookup by name if needed
|
|
393
|
+
if (!messageSysId && name) {
|
|
394
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
395
|
+
params: {
|
|
396
|
+
sysparm_query: `name=${name}`,
|
|
397
|
+
sysparm_fields: 'sys_id',
|
|
398
|
+
sysparm_limit: 1
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
402
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
403
|
+
}
|
|
404
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
405
|
+
}
|
|
406
|
+
if (!messageSysId) {
|
|
407
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'sys_id or name is required for update action');
|
|
408
|
+
}
|
|
409
|
+
const updateData = {};
|
|
410
|
+
if (endpoint !== undefined)
|
|
411
|
+
updateData.rest_endpoint = endpoint;
|
|
412
|
+
if (description !== undefined)
|
|
413
|
+
updateData.description = description;
|
|
414
|
+
if (authentication_type !== undefined)
|
|
415
|
+
updateData.authentication_type = authentication_type;
|
|
416
|
+
if (basic_auth_profile !== undefined)
|
|
417
|
+
updateData.basic_auth_profile = basic_auth_profile;
|
|
418
|
+
if (oauth_profile !== undefined)
|
|
419
|
+
updateData.oauth2_profile = oauth_profile;
|
|
420
|
+
if (use_mid_server !== undefined)
|
|
421
|
+
updateData.use_mid_server = use_mid_server;
|
|
422
|
+
if (mid_server !== undefined)
|
|
423
|
+
updateData.mid_server = mid_server;
|
|
424
|
+
if (Object.keys(updateData).length === 0) {
|
|
425
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'No fields to update. Provide at least one field to change.');
|
|
426
|
+
}
|
|
427
|
+
const response = await client.patch(`/api/now/table/sys_rest_message/${messageSysId}`, updateData);
|
|
428
|
+
const updated = response.data?.result;
|
|
429
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
430
|
+
action: 'update',
|
|
431
|
+
updated: true,
|
|
432
|
+
rest_message: {
|
|
433
|
+
sys_id: updated.sys_id,
|
|
434
|
+
name: updated.name,
|
|
435
|
+
endpoint: updated.rest_endpoint
|
|
436
|
+
},
|
|
437
|
+
fields_updated: Object.keys(updateData)
|
|
438
|
+
}, { operation: 'update_rest_message' });
|
|
439
|
+
}
|
|
440
|
+
async function deleteRestMessage(client, args) {
|
|
441
|
+
const { sys_id, name } = args;
|
|
442
|
+
let messageSysId = sys_id;
|
|
443
|
+
// Lookup by name if needed
|
|
444
|
+
if (!messageSysId && name) {
|
|
445
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
446
|
+
params: {
|
|
447
|
+
sysparm_query: `name=${name}`,
|
|
448
|
+
sysparm_fields: 'sys_id,name',
|
|
449
|
+
sysparm_limit: 1
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
453
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
454
|
+
}
|
|
455
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
456
|
+
}
|
|
457
|
+
if (!messageSysId) {
|
|
458
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'sys_id or name is required for delete action');
|
|
459
|
+
}
|
|
460
|
+
// Delete associated methods first
|
|
461
|
+
const methodsResponse = await client.get('/api/now/table/sys_rest_message_fn', {
|
|
462
|
+
params: {
|
|
463
|
+
sysparm_query: `rest_message=${messageSysId}`,
|
|
464
|
+
sysparm_fields: 'sys_id'
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
const methods = methodsResponse.data?.result || [];
|
|
468
|
+
for (const method of methods) {
|
|
469
|
+
await client.delete(`/api/now/table/sys_rest_message_fn/${method.sys_id}`);
|
|
470
|
+
}
|
|
471
|
+
// Delete the REST message
|
|
472
|
+
await client.delete(`/api/now/table/sys_rest_message/${messageSysId}`);
|
|
473
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
474
|
+
action: 'delete',
|
|
475
|
+
deleted: true,
|
|
476
|
+
sys_id: messageSysId,
|
|
477
|
+
methods_deleted: methods.length,
|
|
478
|
+
message: `REST message and ${methods.length} associated methods deleted`
|
|
479
|
+
}, { operation: 'delete_rest_message' });
|
|
480
|
+
}
|
|
481
|
+
// ============================================================================
|
|
482
|
+
// METHOD OPERATIONS
|
|
483
|
+
// ============================================================================
|
|
484
|
+
async function listMethods(client, args) {
|
|
485
|
+
const { rest_message_sys_id, name, limit = 50 } = args;
|
|
486
|
+
let messageSysId = rest_message_sys_id;
|
|
487
|
+
// Lookup by name if needed
|
|
488
|
+
if (!messageSysId && name) {
|
|
489
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
490
|
+
params: {
|
|
491
|
+
sysparm_query: `name=${name}`,
|
|
492
|
+
sysparm_fields: 'sys_id',
|
|
493
|
+
sysparm_limit: 1
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
497
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
498
|
+
}
|
|
499
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
500
|
+
}
|
|
501
|
+
if (!messageSysId) {
|
|
502
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id or name is required for list_methods action');
|
|
503
|
+
}
|
|
504
|
+
const response = await client.get('/api/now/table/sys_rest_message_fn', {
|
|
505
|
+
params: {
|
|
506
|
+
sysparm_query: `rest_message=${messageSysId}`,
|
|
507
|
+
sysparm_fields: 'sys_id,name,http_method,rest_endpoint,content,active',
|
|
508
|
+
sysparm_limit: limit
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
const methods = response.data?.result || [];
|
|
512
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
513
|
+
action: 'list_methods',
|
|
514
|
+
rest_message_sys_id: messageSysId,
|
|
515
|
+
count: methods.length,
|
|
516
|
+
methods: methods.map((m) => ({
|
|
517
|
+
sys_id: m.sys_id,
|
|
518
|
+
name: m.name,
|
|
519
|
+
http_method: m.http_method,
|
|
520
|
+
endpoint: m.rest_endpoint,
|
|
521
|
+
has_body: !!m.content,
|
|
522
|
+
active: m.active === 'true'
|
|
523
|
+
}))
|
|
524
|
+
}, { operation: 'list_methods' });
|
|
525
|
+
}
|
|
526
|
+
async function getMethod(client, args) {
|
|
527
|
+
const { method_sys_id, sys_id } = args;
|
|
528
|
+
const methodId = method_sys_id || sys_id;
|
|
529
|
+
if (!methodId) {
|
|
530
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for get_method action');
|
|
531
|
+
}
|
|
532
|
+
// Get the method
|
|
533
|
+
const methodResponse = await client.get(`/api/now/table/sys_rest_message_fn/${methodId}`);
|
|
534
|
+
const method = methodResponse.data?.result;
|
|
535
|
+
if (!method) {
|
|
536
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Method not found: ${methodId}`);
|
|
537
|
+
}
|
|
538
|
+
// Get associated headers
|
|
539
|
+
const headersResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
|
|
540
|
+
params: {
|
|
541
|
+
sysparm_query: `rest_message_function=${methodId}`,
|
|
542
|
+
sysparm_fields: 'sys_id,name,value'
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
const headers = headersResponse.data?.result || [];
|
|
546
|
+
// Get associated parameters
|
|
547
|
+
const paramsResponse = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
|
|
548
|
+
params: {
|
|
549
|
+
sysparm_query: `rest_message_function=${methodId}`,
|
|
550
|
+
sysparm_fields: 'sys_id,name,value'
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
const parameters = paramsResponse.data?.result || [];
|
|
554
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
555
|
+
action: 'get_method',
|
|
556
|
+
method: {
|
|
557
|
+
sys_id: method.sys_id,
|
|
558
|
+
name: method.name,
|
|
559
|
+
http_method: method.http_method,
|
|
560
|
+
endpoint: method.rest_endpoint,
|
|
561
|
+
request_body: method.content,
|
|
562
|
+
active: method.active === 'true',
|
|
563
|
+
rest_message: method.rest_message
|
|
564
|
+
},
|
|
565
|
+
headers: headers.map((h) => ({
|
|
566
|
+
sys_id: h.sys_id,
|
|
567
|
+
name: h.name,
|
|
568
|
+
value: h.value
|
|
569
|
+
})),
|
|
570
|
+
parameters: parameters.map((p) => ({
|
|
571
|
+
sys_id: p.sys_id,
|
|
572
|
+
name: p.name,
|
|
573
|
+
value: p.value
|
|
574
|
+
}))
|
|
575
|
+
}, { operation: 'get_method' });
|
|
576
|
+
}
|
|
577
|
+
async function createMethod(client, args) {
|
|
578
|
+
const { rest_message_sys_id, name, http_method = 'GET', relative_path = '', request_body, headers } = args;
|
|
579
|
+
if (!rest_message_sys_id) {
|
|
580
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id is required for create_method action');
|
|
581
|
+
}
|
|
582
|
+
if (!name) {
|
|
583
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'name is required for create_method action');
|
|
584
|
+
}
|
|
585
|
+
// Get the parent REST message to build full endpoint
|
|
586
|
+
const messageResponse = await client.get(`/api/now/table/sys_rest_message/${rest_message_sys_id}`, {
|
|
587
|
+
params: { sysparm_fields: 'rest_endpoint' }
|
|
588
|
+
});
|
|
589
|
+
const baseEndpoint = messageResponse.data?.result?.rest_endpoint || '';
|
|
590
|
+
const methodData = {
|
|
591
|
+
rest_message: rest_message_sys_id,
|
|
592
|
+
name,
|
|
593
|
+
http_method,
|
|
594
|
+
rest_endpoint: baseEndpoint + relative_path,
|
|
595
|
+
active: true
|
|
596
|
+
};
|
|
597
|
+
if (request_body) {
|
|
598
|
+
methodData.content = request_body;
|
|
599
|
+
}
|
|
600
|
+
const response = await client.post('/api/now/table/sys_rest_message_fn', methodData);
|
|
601
|
+
const created = response.data?.result;
|
|
602
|
+
// Create headers if provided
|
|
603
|
+
const createdHeaders = [];
|
|
604
|
+
if (headers && typeof headers === 'object') {
|
|
605
|
+
for (const [headerName, headerValue] of Object.entries(headers)) {
|
|
606
|
+
const headerResponse = await client.post('/api/now/table/sys_rest_message_fn_headers', {
|
|
607
|
+
rest_message_function: created.sys_id,
|
|
608
|
+
name: headerName,
|
|
609
|
+
value: headerValue
|
|
610
|
+
});
|
|
611
|
+
createdHeaders.push({
|
|
612
|
+
sys_id: headerResponse.data?.result?.sys_id,
|
|
613
|
+
name: headerName,
|
|
614
|
+
value: headerValue
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
619
|
+
action: 'create_method',
|
|
620
|
+
created: true,
|
|
621
|
+
method: {
|
|
622
|
+
sys_id: created.sys_id,
|
|
623
|
+
name: created.name,
|
|
624
|
+
http_method: created.http_method,
|
|
625
|
+
endpoint: created.rest_endpoint
|
|
626
|
+
},
|
|
627
|
+
headers_created: createdHeaders.length,
|
|
628
|
+
headers: createdHeaders
|
|
629
|
+
}, { operation: 'create_method' });
|
|
630
|
+
}
|
|
631
|
+
async function updateMethod(client, args) {
|
|
632
|
+
const { method_sys_id, sys_id, name, http_method, relative_path, request_body } = args;
|
|
633
|
+
const methodId = method_sys_id || sys_id;
|
|
634
|
+
if (!methodId) {
|
|
635
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for update_method action');
|
|
636
|
+
}
|
|
637
|
+
const updateData = {};
|
|
638
|
+
if (name !== undefined)
|
|
639
|
+
updateData.name = name;
|
|
640
|
+
if (http_method !== undefined)
|
|
641
|
+
updateData.http_method = http_method;
|
|
642
|
+
if (relative_path !== undefined) {
|
|
643
|
+
// Get parent REST message to build full endpoint
|
|
644
|
+
const methodResponse = await client.get(`/api/now/table/sys_rest_message_fn/${methodId}`, {
|
|
645
|
+
params: { sysparm_fields: 'rest_message' }
|
|
646
|
+
});
|
|
647
|
+
const restMessageId = methodResponse.data?.result?.rest_message?.value;
|
|
648
|
+
if (restMessageId) {
|
|
649
|
+
const messageResponse = await client.get(`/api/now/table/sys_rest_message/${restMessageId}`, {
|
|
650
|
+
params: { sysparm_fields: 'rest_endpoint' }
|
|
651
|
+
});
|
|
652
|
+
const baseEndpoint = messageResponse.data?.result?.rest_endpoint || '';
|
|
653
|
+
updateData.rest_endpoint = baseEndpoint + relative_path;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
if (request_body !== undefined)
|
|
657
|
+
updateData.content = request_body;
|
|
658
|
+
if (Object.keys(updateData).length === 0) {
|
|
659
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'No fields to update');
|
|
660
|
+
}
|
|
661
|
+
const response = await client.patch(`/api/now/table/sys_rest_message_fn/${methodId}`, updateData);
|
|
662
|
+
const updated = response.data?.result;
|
|
663
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
664
|
+
action: 'update_method',
|
|
665
|
+
updated: true,
|
|
666
|
+
method: {
|
|
667
|
+
sys_id: updated.sys_id,
|
|
668
|
+
name: updated.name,
|
|
669
|
+
http_method: updated.http_method,
|
|
670
|
+
endpoint: updated.rest_endpoint
|
|
671
|
+
},
|
|
672
|
+
fields_updated: Object.keys(updateData)
|
|
673
|
+
}, { operation: 'update_method' });
|
|
674
|
+
}
|
|
675
|
+
async function deleteMethod(client, args) {
|
|
676
|
+
const { method_sys_id, sys_id } = args;
|
|
677
|
+
const methodId = method_sys_id || sys_id;
|
|
678
|
+
if (!methodId) {
|
|
679
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for delete_method action');
|
|
680
|
+
}
|
|
681
|
+
// Delete associated headers first
|
|
682
|
+
const headersResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
|
|
683
|
+
params: {
|
|
684
|
+
sysparm_query: `rest_message_function=${methodId}`,
|
|
685
|
+
sysparm_fields: 'sys_id'
|
|
686
|
+
}
|
|
687
|
+
});
|
|
688
|
+
const headers = headersResponse.data?.result || [];
|
|
689
|
+
for (const header of headers) {
|
|
690
|
+
await client.delete(`/api/now/table/sys_rest_message_fn_headers/${header.sys_id}`);
|
|
691
|
+
}
|
|
692
|
+
// Delete the method
|
|
693
|
+
await client.delete(`/api/now/table/sys_rest_message_fn/${methodId}`);
|
|
694
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
695
|
+
action: 'delete_method',
|
|
696
|
+
deleted: true,
|
|
697
|
+
method_sys_id: methodId,
|
|
698
|
+
headers_deleted: headers.length
|
|
699
|
+
}, { operation: 'delete_method' });
|
|
700
|
+
}
|
|
701
|
+
// ============================================================================
|
|
702
|
+
// MESSAGE-LEVEL HEADER OPERATIONS (sys_rest_message_headers)
|
|
703
|
+
// These headers apply to ALL methods in the REST message
|
|
704
|
+
// ============================================================================
|
|
705
|
+
async function listMessageHeaders(client, args) {
|
|
706
|
+
const { rest_message_sys_id, sys_id, name } = args;
|
|
707
|
+
let messageSysId = rest_message_sys_id || sys_id;
|
|
708
|
+
// Lookup by name if needed
|
|
709
|
+
if (!messageSysId && name) {
|
|
710
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
711
|
+
params: {
|
|
712
|
+
sysparm_query: `name=${name}`,
|
|
713
|
+
sysparm_fields: 'sys_id',
|
|
714
|
+
sysparm_limit: 1
|
|
715
|
+
}
|
|
716
|
+
});
|
|
717
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
718
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
719
|
+
}
|
|
720
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
721
|
+
}
|
|
722
|
+
if (!messageSysId) {
|
|
723
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id, sys_id, or name is required for list_message_headers action');
|
|
724
|
+
}
|
|
725
|
+
const response = await client.get('/api/now/table/sys_rest_message_headers', {
|
|
726
|
+
params: {
|
|
727
|
+
sysparm_query: `rest_message=${messageSysId}`,
|
|
728
|
+
sysparm_fields: 'sys_id,name,value'
|
|
729
|
+
}
|
|
730
|
+
});
|
|
731
|
+
const headers = response.data?.result || [];
|
|
732
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
733
|
+
action: 'list_message_headers',
|
|
734
|
+
rest_message_sys_id: messageSysId,
|
|
735
|
+
count: headers.length,
|
|
736
|
+
headers: headers.map((h) => ({
|
|
737
|
+
sys_id: h.sys_id,
|
|
738
|
+
name: h.name,
|
|
739
|
+
value: h.value
|
|
740
|
+
})),
|
|
741
|
+
note: 'These headers apply to ALL methods in this REST message'
|
|
742
|
+
}, { operation: 'list_message_headers' });
|
|
743
|
+
}
|
|
744
|
+
async function createMessageHeader(client, args) {
|
|
745
|
+
const { rest_message_sys_id, sys_id, name, header_name, header_value, headers } = args;
|
|
746
|
+
let messageSysId = rest_message_sys_id || sys_id;
|
|
747
|
+
// Lookup by name if needed
|
|
748
|
+
if (!messageSysId && name) {
|
|
749
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
750
|
+
params: {
|
|
751
|
+
sysparm_query: `name=${name}`,
|
|
752
|
+
sysparm_fields: 'sys_id',
|
|
753
|
+
sysparm_limit: 1
|
|
754
|
+
}
|
|
755
|
+
});
|
|
756
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
757
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
758
|
+
}
|
|
759
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
760
|
+
}
|
|
761
|
+
if (!messageSysId) {
|
|
762
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'rest_message_sys_id, sys_id, or name is required for create_message_header action');
|
|
763
|
+
}
|
|
764
|
+
const createdHeaders = [];
|
|
765
|
+
// Create multiple headers if provided as object
|
|
766
|
+
if (headers && typeof headers === 'object') {
|
|
767
|
+
for (const [hName, hValue] of Object.entries(headers)) {
|
|
768
|
+
const response = await client.post('/api/now/table/sys_rest_message_headers', {
|
|
769
|
+
rest_message: messageSysId,
|
|
770
|
+
name: hName,
|
|
771
|
+
value: hValue
|
|
772
|
+
});
|
|
773
|
+
createdHeaders.push({
|
|
774
|
+
sys_id: response.data?.result?.sys_id,
|
|
775
|
+
name: hName,
|
|
776
|
+
value: hValue
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
else if (header_name && header_value !== undefined) {
|
|
781
|
+
// Create single header
|
|
782
|
+
const response = await client.post('/api/now/table/sys_rest_message_headers', {
|
|
783
|
+
rest_message: messageSysId,
|
|
784
|
+
name: header_name,
|
|
785
|
+
value: header_value
|
|
786
|
+
});
|
|
787
|
+
createdHeaders.push({
|
|
788
|
+
sys_id: response.data?.result?.sys_id,
|
|
789
|
+
name: header_name,
|
|
790
|
+
value: header_value
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
else {
|
|
794
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either headers object or header_name+header_value is required');
|
|
795
|
+
}
|
|
796
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
797
|
+
action: 'create_message_header',
|
|
798
|
+
created: true,
|
|
799
|
+
rest_message_sys_id: messageSysId,
|
|
800
|
+
headers: createdHeaders,
|
|
801
|
+
count: createdHeaders.length,
|
|
802
|
+
note: 'These headers will apply to ALL methods in this REST message'
|
|
803
|
+
}, { operation: 'create_message_header' });
|
|
804
|
+
}
|
|
805
|
+
async function deleteMessageHeader(client, args) {
|
|
806
|
+
const { header_sys_id, sys_id, header_name, rest_message_sys_id, name } = args;
|
|
807
|
+
const headerSysIdToDelete = header_sys_id || sys_id;
|
|
808
|
+
if (headerSysIdToDelete) {
|
|
809
|
+
// Delete by sys_id
|
|
810
|
+
await client.delete(`/api/now/table/sys_rest_message_headers/${headerSysIdToDelete}`);
|
|
811
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
812
|
+
action: 'delete_message_header',
|
|
813
|
+
deleted: true,
|
|
814
|
+
header_sys_id: headerSysIdToDelete
|
|
815
|
+
}, { operation: 'delete_message_header' });
|
|
816
|
+
}
|
|
817
|
+
else if (header_name && (rest_message_sys_id || name)) {
|
|
818
|
+
// Find REST message sys_id if needed
|
|
819
|
+
let messageSysId = rest_message_sys_id;
|
|
820
|
+
if (!messageSysId && name) {
|
|
821
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
822
|
+
params: {
|
|
823
|
+
sysparm_query: `name=${name}`,
|
|
824
|
+
sysparm_fields: 'sys_id',
|
|
825
|
+
sysparm_limit: 1
|
|
826
|
+
}
|
|
827
|
+
});
|
|
828
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
829
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
830
|
+
}
|
|
831
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
832
|
+
}
|
|
833
|
+
// Find and delete by name
|
|
834
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message_headers', {
|
|
835
|
+
params: {
|
|
836
|
+
sysparm_query: `rest_message=${messageSysId}^name=${header_name}`,
|
|
837
|
+
sysparm_fields: 'sys_id',
|
|
838
|
+
sysparm_limit: 1
|
|
839
|
+
}
|
|
840
|
+
});
|
|
841
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
842
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Message header not found: ${header_name}`);
|
|
843
|
+
}
|
|
844
|
+
const foundHeaderSysId = lookupResponse.data.result[0].sys_id;
|
|
845
|
+
await client.delete(`/api/now/table/sys_rest_message_headers/${foundHeaderSysId}`);
|
|
846
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
847
|
+
action: 'delete_message_header',
|
|
848
|
+
deleted: true,
|
|
849
|
+
header_name,
|
|
850
|
+
header_sys_id: foundHeaderSysId
|
|
851
|
+
}, { operation: 'delete_message_header' });
|
|
852
|
+
}
|
|
853
|
+
else {
|
|
854
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either header_sys_id/sys_id OR (header_name + rest_message_sys_id/name) is required');
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
// ============================================================================
|
|
858
|
+
// METHOD-LEVEL HEADER OPERATIONS (sys_rest_message_fn_headers)
|
|
859
|
+
// These headers apply only to a specific method
|
|
860
|
+
// ============================================================================
|
|
861
|
+
async function listMethodHeaders(client, args) {
|
|
862
|
+
const { method_sys_id, sys_id } = args;
|
|
863
|
+
const methodId = method_sys_id || sys_id;
|
|
864
|
+
if (!methodId) {
|
|
865
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for list_method_headers action');
|
|
866
|
+
}
|
|
867
|
+
const response = await client.get('/api/now/table/sys_rest_message_fn_headers', {
|
|
868
|
+
params: {
|
|
869
|
+
sysparm_query: `rest_message_function=${methodId}`,
|
|
870
|
+
sysparm_fields: 'sys_id,name,value'
|
|
871
|
+
}
|
|
872
|
+
});
|
|
873
|
+
const headers = response.data?.result || [];
|
|
874
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
875
|
+
action: 'list_method_headers',
|
|
876
|
+
method_sys_id: methodId,
|
|
877
|
+
count: headers.length,
|
|
878
|
+
headers: headers.map((h) => ({
|
|
879
|
+
sys_id: h.sys_id,
|
|
880
|
+
name: h.name,
|
|
881
|
+
value: h.value
|
|
882
|
+
})),
|
|
883
|
+
note: 'These headers apply only to this specific method'
|
|
884
|
+
}, { operation: 'list_method_headers' });
|
|
885
|
+
}
|
|
886
|
+
async function createMethodHeader(client, args) {
|
|
887
|
+
const { method_sys_id, header_name, header_value, headers } = args;
|
|
888
|
+
if (!method_sys_id) {
|
|
889
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for create_method_header action');
|
|
890
|
+
}
|
|
891
|
+
const createdHeaders = [];
|
|
892
|
+
// Create multiple headers if provided as object
|
|
893
|
+
if (headers && typeof headers === 'object') {
|
|
894
|
+
for (const [hName, hValue] of Object.entries(headers)) {
|
|
895
|
+
const response = await client.post('/api/now/table/sys_rest_message_fn_headers', {
|
|
896
|
+
rest_message_function: method_sys_id,
|
|
897
|
+
name: hName,
|
|
898
|
+
value: hValue
|
|
899
|
+
});
|
|
900
|
+
createdHeaders.push({
|
|
901
|
+
sys_id: response.data?.result?.sys_id,
|
|
902
|
+
name: hName,
|
|
903
|
+
value: hValue
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
}
|
|
907
|
+
else if (header_name && header_value !== undefined) {
|
|
908
|
+
// Create single header
|
|
909
|
+
const response = await client.post('/api/now/table/sys_rest_message_fn_headers', {
|
|
910
|
+
rest_message_function: method_sys_id,
|
|
911
|
+
name: header_name,
|
|
912
|
+
value: header_value
|
|
913
|
+
});
|
|
914
|
+
createdHeaders.push({
|
|
915
|
+
sys_id: response.data?.result?.sys_id,
|
|
916
|
+
name: header_name,
|
|
917
|
+
value: header_value
|
|
918
|
+
});
|
|
919
|
+
}
|
|
920
|
+
else {
|
|
921
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either headers object or header_name+header_value is required');
|
|
922
|
+
}
|
|
923
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
924
|
+
action: 'create_method_header',
|
|
925
|
+
created: true,
|
|
926
|
+
method_sys_id,
|
|
927
|
+
headers: createdHeaders,
|
|
928
|
+
count: createdHeaders.length,
|
|
929
|
+
note: 'These headers apply only to this specific method'
|
|
930
|
+
}, { operation: 'create_method_header' });
|
|
931
|
+
}
|
|
932
|
+
async function deleteMethodHeader(client, args) {
|
|
933
|
+
const { header_sys_id, sys_id, header_name, method_sys_id } = args;
|
|
934
|
+
const headerSysIdToDelete = header_sys_id || sys_id;
|
|
935
|
+
if (headerSysIdToDelete) {
|
|
936
|
+
// Delete by sys_id
|
|
937
|
+
await client.delete(`/api/now/table/sys_rest_message_fn_headers/${headerSysIdToDelete}`);
|
|
938
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
939
|
+
action: 'delete_method_header',
|
|
940
|
+
deleted: true,
|
|
941
|
+
header_sys_id: headerSysIdToDelete
|
|
942
|
+
}, { operation: 'delete_method_header' });
|
|
943
|
+
}
|
|
944
|
+
else if (header_name && method_sys_id) {
|
|
945
|
+
// Find and delete by name
|
|
946
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
|
|
947
|
+
params: {
|
|
948
|
+
sysparm_query: `rest_message_function=${method_sys_id}^name=${header_name}`,
|
|
949
|
+
sysparm_fields: 'sys_id',
|
|
950
|
+
sysparm_limit: 1
|
|
951
|
+
}
|
|
952
|
+
});
|
|
953
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
954
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Method header not found: ${header_name}`);
|
|
955
|
+
}
|
|
956
|
+
const foundHeaderSysId = lookupResponse.data.result[0].sys_id;
|
|
957
|
+
await client.delete(`/api/now/table/sys_rest_message_fn_headers/${foundHeaderSysId}`);
|
|
958
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
959
|
+
action: 'delete_method_header',
|
|
960
|
+
deleted: true,
|
|
961
|
+
header_name,
|
|
962
|
+
header_sys_id: foundHeaderSysId
|
|
963
|
+
}, { operation: 'delete_method_header' });
|
|
964
|
+
}
|
|
965
|
+
else {
|
|
966
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either header_sys_id/sys_id OR (header_name + method_sys_id) is required');
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
// ============================================================================
|
|
970
|
+
// QUERY PARAMETER OPERATIONS (sys_rest_message_fn_parameters)
|
|
971
|
+
// ============================================================================
|
|
972
|
+
async function listParameters(client, args) {
|
|
973
|
+
const { method_sys_id, sys_id } = args;
|
|
974
|
+
const methodId = method_sys_id || sys_id;
|
|
975
|
+
if (!methodId) {
|
|
976
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for list_parameters action');
|
|
977
|
+
}
|
|
978
|
+
const response = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
|
|
979
|
+
params: {
|
|
980
|
+
sysparm_query: `rest_message_function=${methodId}`,
|
|
981
|
+
sysparm_fields: 'sys_id,name,value'
|
|
982
|
+
}
|
|
983
|
+
});
|
|
984
|
+
const parameters = response.data?.result || [];
|
|
985
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
986
|
+
action: 'list_parameters',
|
|
987
|
+
method_sys_id: methodId,
|
|
988
|
+
count: parameters.length,
|
|
989
|
+
parameters: parameters.map((p) => ({
|
|
990
|
+
sys_id: p.sys_id,
|
|
991
|
+
name: p.name,
|
|
992
|
+
value: p.value
|
|
993
|
+
}))
|
|
994
|
+
}, { operation: 'list_parameters' });
|
|
995
|
+
}
|
|
996
|
+
async function createParameter(client, args) {
|
|
997
|
+
const { method_sys_id, parameter_name, parameter_value, parameters } = args;
|
|
998
|
+
if (!method_sys_id) {
|
|
999
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id is required for create_parameter action');
|
|
1000
|
+
}
|
|
1001
|
+
const createdParams = [];
|
|
1002
|
+
// Create multiple parameters if provided as object
|
|
1003
|
+
if (parameters && typeof parameters === 'object') {
|
|
1004
|
+
for (const [pName, pValue] of Object.entries(parameters)) {
|
|
1005
|
+
const response = await client.post('/api/now/table/sys_rest_message_fn_parameters', {
|
|
1006
|
+
rest_message_function: method_sys_id,
|
|
1007
|
+
name: pName,
|
|
1008
|
+
value: pValue
|
|
1009
|
+
});
|
|
1010
|
+
createdParams.push({
|
|
1011
|
+
sys_id: response.data?.result?.sys_id,
|
|
1012
|
+
name: pName,
|
|
1013
|
+
value: pValue
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
else if (parameter_name && parameter_value !== undefined) {
|
|
1018
|
+
// Create single parameter
|
|
1019
|
+
const response = await client.post('/api/now/table/sys_rest_message_fn_parameters', {
|
|
1020
|
+
rest_message_function: method_sys_id,
|
|
1021
|
+
name: parameter_name,
|
|
1022
|
+
value: parameter_value
|
|
1023
|
+
});
|
|
1024
|
+
createdParams.push({
|
|
1025
|
+
sys_id: response.data?.result?.sys_id,
|
|
1026
|
+
name: parameter_name,
|
|
1027
|
+
value: parameter_value
|
|
1028
|
+
});
|
|
1029
|
+
}
|
|
1030
|
+
else {
|
|
1031
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either parameters object or parameter_name+parameter_value is required');
|
|
1032
|
+
}
|
|
1033
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
1034
|
+
action: 'create_parameter',
|
|
1035
|
+
created: true,
|
|
1036
|
+
method_sys_id,
|
|
1037
|
+
parameters: createdParams,
|
|
1038
|
+
count: createdParams.length
|
|
1039
|
+
}, { operation: 'create_parameter' });
|
|
1040
|
+
}
|
|
1041
|
+
async function deleteParameter(client, args) {
|
|
1042
|
+
const { parameter_sys_id, sys_id, parameter_name, method_sys_id } = args;
|
|
1043
|
+
const paramSysIdToDelete = parameter_sys_id || sys_id;
|
|
1044
|
+
if (paramSysIdToDelete) {
|
|
1045
|
+
// Delete by sys_id
|
|
1046
|
+
await client.delete(`/api/now/table/sys_rest_message_fn_parameters/${paramSysIdToDelete}`);
|
|
1047
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
1048
|
+
action: 'delete_parameter',
|
|
1049
|
+
deleted: true,
|
|
1050
|
+
parameter_sys_id: paramSysIdToDelete
|
|
1051
|
+
}, { operation: 'delete_parameter' });
|
|
1052
|
+
}
|
|
1053
|
+
else if (parameter_name && method_sys_id) {
|
|
1054
|
+
// Find and delete by name
|
|
1055
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
|
|
1056
|
+
params: {
|
|
1057
|
+
sysparm_query: `rest_message_function=${method_sys_id}^name=${parameter_name}`,
|
|
1058
|
+
sysparm_fields: 'sys_id',
|
|
1059
|
+
sysparm_limit: 1
|
|
1060
|
+
}
|
|
1061
|
+
});
|
|
1062
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
1063
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Parameter not found: ${parameter_name}`);
|
|
1064
|
+
}
|
|
1065
|
+
const foundParamSysId = lookupResponse.data.result[0].sys_id;
|
|
1066
|
+
await client.delete(`/api/now/table/sys_rest_message_fn_parameters/${foundParamSysId}`);
|
|
1067
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
1068
|
+
action: 'delete_parameter',
|
|
1069
|
+
deleted: true,
|
|
1070
|
+
parameter_name,
|
|
1071
|
+
parameter_sys_id: foundParamSysId
|
|
1072
|
+
}, { operation: 'delete_parameter' });
|
|
1073
|
+
}
|
|
1074
|
+
else {
|
|
1075
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'Either parameter_sys_id/sys_id OR (parameter_name + method_sys_id) is required');
|
|
1076
|
+
}
|
|
1077
|
+
}
|
|
1078
|
+
// ============================================================================
|
|
1079
|
+
// TEST OPERATIONS
|
|
1080
|
+
// ============================================================================
|
|
1081
|
+
async function testRestMessage(client, args) {
|
|
1082
|
+
const { method_sys_id, sys_id, name, rest_message_sys_id, test_params = {} } = args;
|
|
1083
|
+
const methodId = method_sys_id || sys_id;
|
|
1084
|
+
// If we have a method_sys_id, get method details
|
|
1085
|
+
if (methodId) {
|
|
1086
|
+
const methodResponse = await client.get(`/api/now/table/sys_rest_message_fn/${methodId}`, {
|
|
1087
|
+
params: { sysparm_fields: 'name,http_method,rest_endpoint,rest_message,content' }
|
|
1088
|
+
});
|
|
1089
|
+
const method = methodResponse.data?.result;
|
|
1090
|
+
if (!method) {
|
|
1091
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `Method not found: ${methodId}`);
|
|
1092
|
+
}
|
|
1093
|
+
// Get REST message details
|
|
1094
|
+
const restMessageId = method.rest_message?.value;
|
|
1095
|
+
const messageResponse = await client.get(`/api/now/table/sys_rest_message/${restMessageId}`, {
|
|
1096
|
+
params: { sysparm_fields: 'name,rest_endpoint,authentication_type' }
|
|
1097
|
+
});
|
|
1098
|
+
const restMessage = messageResponse.data?.result;
|
|
1099
|
+
const restMessageName = restMessage?.name;
|
|
1100
|
+
// Get method headers
|
|
1101
|
+
const headersResponse = await client.get('/api/now/table/sys_rest_message_fn_headers', {
|
|
1102
|
+
params: {
|
|
1103
|
+
sysparm_query: `rest_message_function=${methodId}`,
|
|
1104
|
+
sysparm_fields: 'name,value'
|
|
1105
|
+
}
|
|
1106
|
+
});
|
|
1107
|
+
const methodHeaders = headersResponse.data?.result || [];
|
|
1108
|
+
// Get message-level headers
|
|
1109
|
+
const msgHeadersResponse = await client.get('/api/now/table/sys_rest_message_headers', {
|
|
1110
|
+
params: {
|
|
1111
|
+
sysparm_query: `rest_message=${restMessageId}`,
|
|
1112
|
+
sysparm_fields: 'name,value'
|
|
1113
|
+
}
|
|
1114
|
+
});
|
|
1115
|
+
const messageHeaders = msgHeadersResponse.data?.result || [];
|
|
1116
|
+
// Get parameters
|
|
1117
|
+
const paramsResponse = await client.get('/api/now/table/sys_rest_message_fn_parameters', {
|
|
1118
|
+
params: {
|
|
1119
|
+
sysparm_query: `rest_message_function=${methodId}`,
|
|
1120
|
+
sysparm_fields: 'name,value'
|
|
1121
|
+
}
|
|
1122
|
+
});
|
|
1123
|
+
const parameters = paramsResponse.data?.result || [];
|
|
1124
|
+
// Build parameter setting code
|
|
1125
|
+
const paramLines = Object.entries(test_params).map(([k, v]) => `rm.setStringParameterNoEscape('${k}', '${String(v).replace(/'/g, "\\'")}');`);
|
|
1126
|
+
// Generate the test script (ES5 compatible!)
|
|
1127
|
+
const testScript = `
|
|
1128
|
+
// Test REST Message: ${restMessageName} - Method: ${method.name}
|
|
1129
|
+
// Generated by snow_rest_message_manage test action
|
|
1130
|
+
// ES5 COMPATIBLE - Safe for ServiceNow execution
|
|
1131
|
+
|
|
1132
|
+
(function() {
|
|
1133
|
+
var results = {
|
|
1134
|
+
success: false,
|
|
1135
|
+
status_code: null,
|
|
1136
|
+
response_body: null,
|
|
1137
|
+
response_headers: {},
|
|
1138
|
+
error: null,
|
|
1139
|
+
timing_ms: 0
|
|
1140
|
+
};
|
|
1141
|
+
|
|
1142
|
+
try {
|
|
1143
|
+
var startTime = new Date().getTime();
|
|
1144
|
+
|
|
1145
|
+
// Create REST message instance
|
|
1146
|
+
var rm = new sn_ws.RESTMessageV2('${restMessageName}', '${method.name}');
|
|
1147
|
+
|
|
1148
|
+
// Set parameters from test_params
|
|
1149
|
+
${paramLines.length > 0 ? ' ' + paramLines.join('\n ') : ' // No parameters specified'}
|
|
1150
|
+
|
|
1151
|
+
// Execute the request
|
|
1152
|
+
var response = rm.execute();
|
|
1153
|
+
var endTime = new Date().getTime();
|
|
1154
|
+
|
|
1155
|
+
// Collect results
|
|
1156
|
+
results.success = true;
|
|
1157
|
+
results.status_code = response.getStatusCode();
|
|
1158
|
+
results.response_body = response.getBody();
|
|
1159
|
+
results.timing_ms = endTime - startTime;
|
|
1160
|
+
|
|
1161
|
+
// Try to get response headers
|
|
1162
|
+
try {
|
|
1163
|
+
var headerStr = response.getAllHeaders();
|
|
1164
|
+
if (headerStr) {
|
|
1165
|
+
results.response_headers = headerStr;
|
|
1166
|
+
}
|
|
1167
|
+
} catch(headerErr) {
|
|
1168
|
+
// Headers may not be available
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
// Log results
|
|
1172
|
+
gs.info('=== REST MESSAGE TEST RESULTS ===');
|
|
1173
|
+
gs.info('REST Message: ${restMessageName}');
|
|
1174
|
+
gs.info('Method: ${method.name}');
|
|
1175
|
+
gs.info('HTTP Method: ${method.http_method}');
|
|
1176
|
+
gs.info('Status Code: ' + results.status_code);
|
|
1177
|
+
gs.info('Response Time: ' + results.timing_ms + 'ms');
|
|
1178
|
+
gs.info('Response Body: ' + results.response_body);
|
|
1179
|
+
|
|
1180
|
+
} catch(e) {
|
|
1181
|
+
results.success = false;
|
|
1182
|
+
results.error = e.message || String(e);
|
|
1183
|
+
gs.error('REST Message Test Failed: ' + results.error);
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1186
|
+
// Store results in sys_properties for retrieval
|
|
1187
|
+
var propName = 'snow_flow.rest_test.${methodId}';
|
|
1188
|
+
gs.setProperty(propName, JSON.stringify(results));
|
|
1189
|
+
gs.info('Results stored in property: ' + propName);
|
|
1190
|
+
|
|
1191
|
+
return results;
|
|
1192
|
+
})();
|
|
1193
|
+
`.trim();
|
|
1194
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
1195
|
+
action: 'test',
|
|
1196
|
+
method: {
|
|
1197
|
+
sys_id: methodId,
|
|
1198
|
+
name: method.name,
|
|
1199
|
+
http_method: method.http_method,
|
|
1200
|
+
endpoint: method.rest_endpoint,
|
|
1201
|
+
has_body: !!method.content
|
|
1202
|
+
},
|
|
1203
|
+
rest_message: {
|
|
1204
|
+
sys_id: restMessageId,
|
|
1205
|
+
name: restMessageName,
|
|
1206
|
+
base_endpoint: restMessage?.rest_endpoint,
|
|
1207
|
+
authentication_type: restMessage?.authentication_type
|
|
1208
|
+
},
|
|
1209
|
+
configuration: {
|
|
1210
|
+
message_headers: messageHeaders.map((h) => ({ name: h.name, value: h.value })),
|
|
1211
|
+
method_headers: methodHeaders.map((h) => ({ name: h.name, value: h.value })),
|
|
1212
|
+
parameters: parameters.map((p) => ({ name: p.name, value: p.value }))
|
|
1213
|
+
},
|
|
1214
|
+
test_params_provided: test_params,
|
|
1215
|
+
test_script: testScript,
|
|
1216
|
+
usage: {
|
|
1217
|
+
description: 'Use snow_schedule_script_job to execute this test script',
|
|
1218
|
+
example: `snow_schedule_script_job({ script: <test_script>, description: 'Test REST: ${restMessageName}' })`,
|
|
1219
|
+
manual_test: `In ServiceNow: System Web Services > Outbound > REST Message > ${restMessageName} > ${method.name} > Test`
|
|
1220
|
+
},
|
|
1221
|
+
note: 'Direct REST message testing requires ServiceNow script execution. Copy the test_script and run it via snow_schedule_script_job.'
|
|
1222
|
+
}, { operation: 'test_rest_message' });
|
|
1223
|
+
}
|
|
1224
|
+
// If we have REST message name but no method, list available methods
|
|
1225
|
+
if (name || rest_message_sys_id) {
|
|
1226
|
+
let messageSysId = rest_message_sys_id;
|
|
1227
|
+
let messageName = name;
|
|
1228
|
+
// Lookup by name if needed
|
|
1229
|
+
if (!messageSysId && name) {
|
|
1230
|
+
const lookupResponse = await client.get('/api/now/table/sys_rest_message', {
|
|
1231
|
+
params: {
|
|
1232
|
+
sysparm_query: `name=${name}`,
|
|
1233
|
+
sysparm_fields: 'sys_id,name',
|
|
1234
|
+
sysparm_limit: 1
|
|
1235
|
+
}
|
|
1236
|
+
});
|
|
1237
|
+
if (!lookupResponse.data?.result?.[0]) {
|
|
1238
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.NOT_FOUND, `REST message not found: ${name}`);
|
|
1239
|
+
}
|
|
1240
|
+
messageSysId = lookupResponse.data.result[0].sys_id;
|
|
1241
|
+
messageName = lookupResponse.data.result[0].name;
|
|
1242
|
+
}
|
|
1243
|
+
else if (messageSysId && !messageName) {
|
|
1244
|
+
const msgResponse = await client.get(`/api/now/table/sys_rest_message/${messageSysId}`, {
|
|
1245
|
+
params: { sysparm_fields: 'name' }
|
|
1246
|
+
});
|
|
1247
|
+
messageName = msgResponse.data?.result?.name;
|
|
1248
|
+
}
|
|
1249
|
+
// Get methods for this REST message
|
|
1250
|
+
const methodsResponse = await client.get('/api/now/table/sys_rest_message_fn', {
|
|
1251
|
+
params: {
|
|
1252
|
+
sysparm_query: `rest_message=${messageSysId}`,
|
|
1253
|
+
sysparm_fields: 'sys_id,name,http_method,rest_endpoint'
|
|
1254
|
+
}
|
|
1255
|
+
});
|
|
1256
|
+
const methods = methodsResponse.data?.result || [];
|
|
1257
|
+
return (0, error_handler_js_1.createSuccessResult)({
|
|
1258
|
+
action: 'test',
|
|
1259
|
+
rest_message: {
|
|
1260
|
+
sys_id: messageSysId,
|
|
1261
|
+
name: messageName
|
|
1262
|
+
},
|
|
1263
|
+
available_methods: methods.map((m) => ({
|
|
1264
|
+
sys_id: m.sys_id,
|
|
1265
|
+
name: m.name,
|
|
1266
|
+
http_method: m.http_method,
|
|
1267
|
+
endpoint: m.rest_endpoint
|
|
1268
|
+
})),
|
|
1269
|
+
note: 'Specify method_sys_id to generate a test script for a specific method'
|
|
1270
|
+
}, { operation: 'test_rest_message' });
|
|
1271
|
+
}
|
|
1272
|
+
throw new error_handler_js_1.SnowFlowError(error_handler_js_1.ErrorType.VALIDATION_ERROR, 'method_sys_id, name, or rest_message_sys_id is required for test action');
|
|
1273
|
+
}
|
|
1274
|
+
exports.version = '2.0.0';
|
|
1275
|
+
exports.author = 'Snow-Flow SDK';
|
|
1276
|
+
exports.changelog = {
|
|
1277
|
+
'2.0.0': 'Added message-level headers, method-level headers, query parameters, improved test with ES5 script generation',
|
|
1278
|
+
'1.0.0': 'Initial release with REST message and method CRUD operations'
|
|
1279
|
+
};
|
|
1280
|
+
//# sourceMappingURL=snow_rest_message_manage.js.map
|