@agility/management-sdk 0.1.2 → 0.1.4-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/api-documentation-manifest.md +275 -0
- package/.cursor/api-functions-analysis.md +111 -0
- package/.cursor/docs-final-check.md +269 -0
- package/.cursor/manifest.md +153 -0
- package/.env +92 -0
- package/README.md +219 -352
- package/dist/apiClient.d.ts +86 -0
- package/dist/apiClient.js +229 -0
- package/dist/apiClient.js.map +1 -0
- package/dist/apiMethods/assetMethods.d.ts +28 -6
- package/dist/apiMethods/assetMethods.js +346 -74
- package/dist/apiMethods/assetMethods.js.map +1 -0
- package/dist/apiMethods/authMethods.d.ts +239 -0
- package/dist/apiMethods/authMethods.js +604 -0
- package/dist/apiMethods/batchMethods.d.ts +32 -1
- package/dist/apiMethods/batchMethods.js +324 -42
- package/dist/apiMethods/batchMethods.js.map +1 -0
- package/dist/apiMethods/clientInstance.d.ts +58 -4
- package/dist/apiMethods/clientInstance.js +383 -56
- package/dist/apiMethods/clientInstance.js.map +1 -0
- package/dist/apiMethods/containerMethods.d.ts +15 -7
- package/dist/apiMethods/containerMethods.js +199 -83
- package/dist/apiMethods/containerMethods.js.map +1 -0
- package/dist/apiMethods/contentMethods.d.ts +17 -10
- package/dist/apiMethods/contentMethods.js +432 -149
- package/dist/apiMethods/contentMethods.js.map +1 -0
- package/dist/apiMethods/instanceMethods.d.ts +9 -0
- package/dist/apiMethods/instanceMethods.js +69 -0
- package/dist/apiMethods/instanceMethods.js.map +1 -0
- package/dist/apiMethods/instanceUserMethods.d.ts +3 -3
- package/dist/apiMethods/instanceUserMethods.js +93 -39
- package/dist/apiMethods/instanceUserMethods.js.map +1 -0
- package/dist/apiMethods/modelMethods.d.ts +6 -5
- package/dist/apiMethods/modelMethods.js +150 -61
- package/dist/apiMethods/modelMethods.js.map +1 -0
- package/dist/apiMethods/pageMethods.d.ts +21 -9
- package/dist/apiMethods/pageMethods.js +500 -134
- package/dist/apiMethods/pageMethods.js.map +1 -0
- package/dist/apiMethods/serverUserMethods.d.ts +10 -0
- package/dist/apiMethods/serverUserMethods.js +89 -0
- package/dist/apiMethods/serverUserMethods.js.map +1 -0
- package/dist/apiMethods/webhookMethods.d.ts +12 -0
- package/dist/apiMethods/webhookMethods.js +131 -0
- package/dist/apiMethods/webhookMethods.js.map +1 -0
- package/dist/enums/assetGroupingType.d.ts +3 -0
- package/dist/enums/assetGroupingType.js +7 -0
- package/dist/enums/assetGroupingType.js.map +1 -0
- package/dist/enums/batchItemType.d.ts +7 -0
- package/dist/enums/batchItemType.js +11 -0
- package/dist/enums/batchOperationType.js +1 -1
- package/dist/enums/batchOperationType.js.map +1 -0
- package/dist/enums/batchState..js +1 -1
- package/dist/enums/batchState.d.ts +7 -0
- package/dist/enums/batchState.js +12 -0
- package/dist/enums/batchState.js.map +1 -0
- package/dist/enums/pageItemTemplateType.d.ts +4 -0
- package/dist/enums/pageItemTemplateType.js +8 -0
- package/dist/enums/pageItemTemplateType.js.map +1 -0
- package/dist/enums/workflowOperationType.d.ts +26 -0
- package/dist/enums/workflowOperationType.js +30 -0
- package/dist/errors/exception.d.ts +4 -0
- package/dist/errors/exception.js +11 -0
- package/dist/errors/exception.js.map +1 -0
- package/dist/index.d.ts +41 -9
- package/dist/index.js +48 -10
- package/dist/index.js.map +1 -0
- package/dist/models/assetContainer.d.ts +7 -0
- package/dist/models/assetContainer.js +9 -0
- package/dist/models/assetGalleries.d.ts +5 -0
- package/dist/models/assetGalleries.js +9 -0
- package/dist/models/assetMediaGrouping.d.ts +17 -0
- package/dist/models/assetMediaGrouping.js +9 -0
- package/dist/models/assetMediaGroupingMetaData.d.ts +4 -0
- package/dist/models/assetMediaGroupingMetaData.js +9 -0
- package/dist/models/authTokens.d.ts +73 -0
- package/dist/models/authTokens.js +2 -0
- package/dist/models/batch.js +5 -2
- package/dist/models/batchItem.d.ts +1 -0
- package/dist/models/batchItem.js +5 -2
- package/dist/models/batchRequests.d.ts +67 -0
- package/dist/models/batchRequests.js +2 -0
- package/dist/models/batchTypes.d.ts +34 -0
- package/dist/models/batchTypes.js +2 -0
- package/dist/models/container.d.ts +2 -1
- package/dist/models/container.js +5 -2
- package/dist/models/contentDefinitionTypeID.d.ts +17 -0
- package/dist/models/contentDefinitionTypeID.js +21 -0
- package/dist/models/contentItem.js +25 -10
- package/dist/models/contentItemHistory.d.ts +20 -0
- package/dist/models/contentItemHistory.js +15 -0
- package/dist/models/contentListFilterModel.d.ts +26 -0
- package/dist/models/contentListFilterModel.js +33 -0
- package/dist/models/contentSectionDefaultModule.d.ts +7 -0
- package/dist/models/contentSectionDefaultModule.js +9 -0
- package/dist/models/contentSectionDefinition.d.ts +35 -0
- package/dist/models/contentSectionDefinition.js +9 -0
- package/dist/models/contentViewColumn.js +5 -2
- package/dist/models/exception.js +23 -5
- package/dist/models/instanceRole.js +5 -2
- package/dist/models/instanceUser.js +5 -2
- package/dist/models/itemComments.d.ts +14 -0
- package/dist/models/itemComments.js +15 -0
- package/dist/models/listParams.d.ts +9 -0
- package/dist/models/listParams.js +16 -0
- package/dist/models/locales.d.ts +3 -0
- package/dist/models/locales.js +30 -0
- package/dist/models/media.js +10 -4
- package/dist/models/model.js +10 -4
- package/dist/models/notification.js +5 -2
- package/dist/models/options.d.ts +2 -5
- package/dist/models/options.js +4 -20
- package/dist/models/pageHistory.d.ts +21 -0
- package/dist/models/pageHistory.js +15 -0
- package/dist/models/pageItem.js +30 -12
- package/dist/models/pageModel.d.ts +14 -0
- package/dist/models/pageModel.js +9 -0
- package/dist/models/serverUser.d.ts +21 -0
- package/dist/models/serverUser.js +9 -0
- package/dist/models/sharedModule.d.ts +7 -0
- package/dist/models/sharedModule.js +9 -0
- package/dist/models/sitemap.js +10 -4
- package/dist/models/webhook.d.ts +9 -0
- package/dist/models/webhook.js +9 -0
- package/dist/models/websiteListing.d.ts +16 -0
- package/dist/models/websiteListing.js +9 -0
- package/dist/models/websiteUser.js +10 -4
- package/dist/tests/authHelper.d.ts +2 -0
- package/dist/tests/authHelper.js +14 -0
- package/dist/tests/authHelper.js.map +1 -0
- package/dist/tests/config/apiClient.config.d.ts +16 -0
- package/dist/tests/config/apiClient.config.js +84 -0
- package/dist/tests/config/apiClient.config.js.map +1 -0
- package/dist/tests/config/test.config.d.ts +24 -0
- package/dist/tests/config/test.config.js +47 -0
- package/dist/tests/config/test.config.js.map +1 -0
- package/dist/tokenStorage.d.ts +72 -0
- package/dist/tokenStorage.js +366 -0
- package/dist/types/apiResponse.d.ts +13 -0
- package/dist/types/apiResponse.js +3 -0
- package/dist/types/apiResponse.js.map +1 -0
- package/dist/types/assetContainer.d.ts +7 -0
- package/dist/types/assetContainer.js +3 -0
- package/dist/types/assetContainer.js.map +1 -0
- package/dist/types/assetGalleries.d.ts +5 -0
- package/dist/types/assetGalleries.js +3 -0
- package/dist/types/assetGalleries.js.map +1 -0
- package/dist/types/assetMediaGrouping.d.ts +17 -0
- package/dist/types/assetMediaGrouping.js +3 -0
- package/dist/types/assetMediaGrouping.js.map +1 -0
- package/dist/types/assetMediaGroupingMetaData.d.ts +4 -0
- package/dist/types/assetMediaGroupingMetaData.js +3 -0
- package/dist/types/assetMediaGroupingMetaData.js.map +1 -0
- package/dist/types/batch.d.ts +29 -0
- package/dist/types/batch.js +3 -0
- package/dist/types/batch.js.map +1 -0
- package/dist/types/batchItem.d.ts +13 -0
- package/dist/types/batchItem.js +3 -0
- package/dist/types/batchItem.js.map +1 -0
- package/dist/types/container.d.ts +47 -0
- package/dist/types/container.js +3 -0
- package/dist/types/container.js.map +1 -0
- package/dist/types/contentItem.d.ts +37 -0
- package/dist/types/contentItem.js +3 -0
- package/dist/types/contentItem.js.map +1 -0
- package/dist/types/contentItemHistory.d.ts +20 -0
- package/dist/types/contentItemHistory.js +3 -0
- package/dist/types/contentItemHistory.js.map +1 -0
- package/dist/types/contentListFilterModel.d.ts +26 -0
- package/dist/types/contentListFilterModel.js +3 -0
- package/dist/types/contentListFilterModel.js.map +1 -0
- package/dist/types/contentSectionDefaultModule.d.ts +7 -0
- package/dist/types/contentSectionDefaultModule.js +3 -0
- package/dist/types/contentSectionDefaultModule.js.map +1 -0
- package/dist/types/contentSectionDefinition.d.ts +35 -0
- package/dist/types/contentSectionDefinition.js +3 -0
- package/dist/types/contentSectionDefinition.js.map +1 -0
- package/dist/types/contentViewColumn.d.ts +8 -0
- package/dist/types/contentViewColumn.js +3 -0
- package/dist/types/contentViewColumn.js.map +1 -0
- package/dist/types/instanceRole.d.ts +7 -0
- package/dist/types/instanceRole.js +3 -0
- package/dist/types/instanceRole.js.map +1 -0
- package/dist/types/instanceUser.d.ts +14 -0
- package/dist/types/instanceUser.js +3 -0
- package/dist/types/instanceUser.js.map +1 -0
- package/dist/types/itemComments.d.ts +14 -0
- package/dist/types/itemComments.js +3 -0
- package/dist/types/itemComments.js.map +1 -0
- package/dist/types/listParams.d.ts +9 -0
- package/dist/types/listParams.js +3 -0
- package/dist/types/listParams.js.map +1 -0
- package/dist/types/locales.d.ts +1 -0
- package/dist/types/locales.js +3 -0
- package/dist/types/locales.js.map +1 -0
- package/dist/types/media.d.ts +30 -0
- package/dist/types/media.js +3 -0
- package/dist/types/media.js.map +1 -0
- package/dist/types/model.d.ts +30 -0
- package/dist/types/model.js +3 -0
- package/dist/types/model.js.map +1 -0
- package/dist/types/notification.d.ts +13 -0
- package/dist/types/notification.js +3 -0
- package/dist/types/notification.js.map +1 -0
- package/dist/types/options.d.ts +7 -0
- package/dist/types/options.js +3 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/pageHistory.d.ts +21 -0
- package/dist/types/pageHistory.js +3 -0
- package/dist/types/pageHistory.js.map +1 -0
- package/dist/types/pageItem.d.ts +56 -0
- package/dist/types/pageItem.js +3 -0
- package/dist/types/pageItem.js.map +1 -0
- package/dist/types/pageModel.d.ts +14 -0
- package/dist/types/pageModel.js +3 -0
- package/dist/types/pageModel.js.map +1 -0
- package/dist/types/serverUser.d.ts +21 -0
- package/dist/types/serverUser.js +3 -0
- package/dist/types/serverUser.js.map +1 -0
- package/dist/types/sharedModule.d.ts +7 -0
- package/dist/types/sharedModule.js +3 -0
- package/dist/types/sharedModule.js.map +1 -0
- package/dist/types/sitemap.d.ts +20 -0
- package/dist/types/sitemap.js +3 -0
- package/dist/types/sitemap.js.map +1 -0
- package/dist/types/tokenResponseData.d.ts +10 -0
- package/dist/types/tokenResponseData.js +3 -0
- package/dist/types/tokenResponseData.js.map +1 -0
- package/dist/types/webhook.d.ts +9 -0
- package/dist/types/webhook.js +3 -0
- package/dist/types/webhook.js.map +1 -0
- package/dist/types/websiteListing.d.ts +16 -0
- package/dist/types/websiteListing.js +3 -0
- package/dist/types/websiteListing.js.map +1 -0
- package/dist/types/websiteUser.d.ts +22 -0
- package/dist/types/websiteUser.js +3 -0
- package/dist/types/websiteUser.js.map +1 -0
- package/docs/asset-methods.md +382 -0
- package/docs/auth.md +594 -0
- package/docs/batch-methods.md +244 -0
- package/docs/cicd.md +607 -0
- package/docs/container-methods.md +268 -0
- package/docs/content-methods.md +423 -0
- package/docs/instance-methods.md +105 -0
- package/docs/instance-user-methods.md +231 -0
- package/docs/model-methods.md +434 -0
- package/docs/multi-instance-operations.md +192 -0
- package/docs/page-methods.md +671 -0
- package/docs/server-user-methods.md +280 -0
- package/docs/webhook-methods.md +452 -0
- package/package.json +14 -10
- package/tsconfig.json +2 -2
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
# Agility CMS & Management API TypeScript SDK
|
|
2
|
+
|
|
3
|
+
## WebhookMethods
|
|
4
|
+
|
|
5
|
+
This class provides comprehensive webhook management operations for Agility CMS. Webhooks allow you to receive real-time notifications when specific events occur in your CMS, enabling integration with external systems and automated workflows.
|
|
6
|
+
|
|
7
|
+
**Important Notes:**
|
|
8
|
+
- Webhooks provide real-time event notifications to external endpoints
|
|
9
|
+
- Each webhook can be configured to trigger on specific events
|
|
10
|
+
- Webhooks support various event types (content changes, page updates, etc.)
|
|
11
|
+
- Webhook URLs must be accessible and return appropriate HTTP status codes
|
|
12
|
+
- Failed webhook deliveries are automatically retried with exponential backoff
|
|
13
|
+
- Webhooks can be secured with authentication headers or signatures
|
|
14
|
+
|
|
15
|
+
### Function List
|
|
16
|
+
- [getWebhook](#getwebhook) - Retrieves a specific webhook by ID
|
|
17
|
+
- [webhookList](#webhooklist) - Retrieves list of all webhooks
|
|
18
|
+
- [saveWebhook](#savewebhook) - Creates or updates a webhook
|
|
19
|
+
- [deleteWebhook](#deletewebhook) - Deletes a webhook by ID
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
### getWebhook
|
|
24
|
+
|
|
25
|
+
Retrieves a specific webhook by its unique ID.
|
|
26
|
+
|
|
27
|
+
| Parameter | Type | Required | Description |
|
|
28
|
+
|-----------|------|----------|-------------|
|
|
29
|
+
| `webhookID` | `number` | Yes | The webhook ID to retrieve |
|
|
30
|
+
| `guid` | `string` | Yes | Current website GUID |
|
|
31
|
+
|
|
32
|
+
**Returns:** `Webhook` - Complete webhook object with configuration and statistics
|
|
33
|
+
|
|
34
|
+
**Usage Example:**
|
|
35
|
+
```typescript
|
|
36
|
+
const webhook = await apiClient.webhookMethods.getWebhook(123, guid);
|
|
37
|
+
console.log('Webhook name:', webhook.name);
|
|
38
|
+
console.log('Webhook URL:', webhook.url);
|
|
39
|
+
console.log('Events:', webhook.events);
|
|
40
|
+
console.log('Active:', webhook.isActive);
|
|
41
|
+
console.log('Created:', webhook.createdDate);
|
|
42
|
+
console.log('Last triggered:', webhook.lastTriggered);
|
|
43
|
+
|
|
44
|
+
// Display webhook statistics
|
|
45
|
+
if (webhook.statistics) {
|
|
46
|
+
console.log('Statistics:');
|
|
47
|
+
console.log(` Total deliveries: ${webhook.statistics.totalDeliveries}`);
|
|
48
|
+
console.log(` Successful deliveries: ${webhook.statistics.successfulDeliveries}`);
|
|
49
|
+
console.log(` Failed deliveries: ${webhook.statistics.failedDeliveries}`);
|
|
50
|
+
console.log(` Success rate: ${webhook.statistics.successRate}%`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Display webhook configuration
|
|
54
|
+
console.log('Configuration:');
|
|
55
|
+
console.log(` Method: ${webhook.method}`);
|
|
56
|
+
console.log(` Content Type: ${webhook.contentType}`);
|
|
57
|
+
console.log(` Timeout: ${webhook.timeout}ms`);
|
|
58
|
+
console.log(` Retry count: ${webhook.retryCount}`);
|
|
59
|
+
|
|
60
|
+
// Check authentication
|
|
61
|
+
if (webhook.authentication) {
|
|
62
|
+
console.log('Authentication enabled:');
|
|
63
|
+
console.log(` Type: ${webhook.authentication.type}`);
|
|
64
|
+
console.log(` Headers: ${Object.keys(webhook.authentication.headers).join(', ')}`);
|
|
65
|
+
} else {
|
|
66
|
+
console.log('No authentication configured');
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Response Properties:**
|
|
71
|
+
The `Webhook` object includes:
|
|
72
|
+
- `webhookID`: Unique identifier for the webhook
|
|
73
|
+
- `name`: Human-readable name for the webhook
|
|
74
|
+
- `url`: Target URL for webhook deliveries
|
|
75
|
+
- `events`: Array of events that trigger the webhook
|
|
76
|
+
- `isActive`: Whether the webhook is active
|
|
77
|
+
- `method`: HTTP method (GET, POST, PUT, etc.)
|
|
78
|
+
- `contentType`: Content type for webhook payload
|
|
79
|
+
- `timeout`: Request timeout in milliseconds
|
|
80
|
+
- `retryCount`: Number of retry attempts for failed deliveries
|
|
81
|
+
- `authentication`: Authentication configuration
|
|
82
|
+
- `statistics`: Delivery statistics and metrics
|
|
83
|
+
|
|
84
|
+
**Error Handling:**
|
|
85
|
+
- Throws `Exception` when webhook not found
|
|
86
|
+
|
|
87
|
+
### webhookList
|
|
88
|
+
|
|
89
|
+
Retrieves a list of all webhooks in the current website.
|
|
90
|
+
|
|
91
|
+
| Parameter | Type | Required | Description |
|
|
92
|
+
|-----------|------|----------|-------------|
|
|
93
|
+
| `guid` | `string` | Yes | Current website GUID |
|
|
94
|
+
| `take` | `number` | No | Number of records to take (default: 20) |
|
|
95
|
+
| `token` | `string` | No | Token parameter (default: null) |
|
|
96
|
+
|
|
97
|
+
**Returns:** `any` - Array of all webhooks
|
|
98
|
+
|
|
99
|
+
**Usage Example:**
|
|
100
|
+
```typescript
|
|
101
|
+
const webhooks = await apiClient.webhookMethods.getWebhookList(guid);
|
|
102
|
+
console.log(`Total webhooks: ${webhooks.length}`);
|
|
103
|
+
|
|
104
|
+
// Display webhook summary
|
|
105
|
+
webhooks.forEach(webhook => {
|
|
106
|
+
console.log(`Webhook: ${webhook.name}`);
|
|
107
|
+
console.log(` URL: ${webhook.url}`);
|
|
108
|
+
console.log(` Events: ${webhook.events.join(', ')}`);
|
|
109
|
+
console.log(` Active: ${webhook.isActive ? 'Yes' : 'No'}`);
|
|
110
|
+
console.log(` Last triggered: ${webhook.lastTriggered || 'Never'}`);
|
|
111
|
+
console.log('---');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
// Filter active webhooks
|
|
115
|
+
const activeWebhooks = webhooks.filter(w => w.isActive);
|
|
116
|
+
const inactiveWebhooks = webhooks.filter(w => !w.isActive);
|
|
117
|
+
console.log(`Active webhooks: ${activeWebhooks.length}`);
|
|
118
|
+
console.log(`Inactive webhooks: ${inactiveWebhooks.length}`);
|
|
119
|
+
|
|
120
|
+
// Group webhooks by event type
|
|
121
|
+
const webhooksByEvent = webhooks.reduce((acc, webhook) => {
|
|
122
|
+
webhook.events.forEach(event => {
|
|
123
|
+
if (!acc[event]) acc[event] = [];
|
|
124
|
+
acc[event].push(webhook);
|
|
125
|
+
});
|
|
126
|
+
return acc;
|
|
127
|
+
}, {});
|
|
128
|
+
|
|
129
|
+
console.log('Webhooks by event:');
|
|
130
|
+
Object.entries(webhooksByEvent).forEach(([event, eventWebhooks]) => {
|
|
131
|
+
console.log(` ${event}: ${eventWebhooks.length} webhooks`);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// Find webhooks with high failure rates
|
|
135
|
+
const failingWebhooks = webhooks.filter(webhook =>
|
|
136
|
+
webhook.statistics && webhook.statistics.successRate < 90
|
|
137
|
+
);
|
|
138
|
+
console.log(`Webhooks with high failure rate: ${failingWebhooks.length}`);
|
|
139
|
+
|
|
140
|
+
// Create webhook dropdown options
|
|
141
|
+
const webhookOptions = webhooks.map(webhook => ({
|
|
142
|
+
value: webhook.webhookID,
|
|
143
|
+
label: webhook.name,
|
|
144
|
+
url: webhook.url,
|
|
145
|
+
active: webhook.isActive
|
|
146
|
+
}));
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Common Webhook Events:**
|
|
150
|
+
- `content.created`: New content item created
|
|
151
|
+
- `content.updated`: Content item updated
|
|
152
|
+
- `content.deleted`: Content item deleted
|
|
153
|
+
- `content.published`: Content item published
|
|
154
|
+
- `content.unpublished`: Content item unpublished
|
|
155
|
+
- `page.created`: New page created
|
|
156
|
+
- `page.updated`: Page updated
|
|
157
|
+
- `page.deleted`: Page deleted
|
|
158
|
+
- `page.published`: Page published
|
|
159
|
+
- `page.unpublished`: Page unpublished
|
|
160
|
+
- `model.created`: Content model created
|
|
161
|
+
- `model.updated`: Content model updated
|
|
162
|
+
- `asset.uploaded`: Asset uploaded
|
|
163
|
+
- `asset.updated`: Asset updated
|
|
164
|
+
|
|
165
|
+
**Error Handling:**
|
|
166
|
+
- Throws `Exception` when retrieval fails
|
|
167
|
+
|
|
168
|
+
### saveWebhook
|
|
169
|
+
|
|
170
|
+
Creates a new webhook or updates an existing one.
|
|
171
|
+
|
|
172
|
+
| Parameter | Type | Required | Description |
|
|
173
|
+
|-----------|------|----------|-------------|
|
|
174
|
+
| `webhook` | `Webhook` | Yes | Webhook object to save |
|
|
175
|
+
| `guid` | `string` | Yes | Current website GUID |
|
|
176
|
+
|
|
177
|
+
**Returns:** `Webhook` - Saved webhook object with updated metadata
|
|
178
|
+
|
|
179
|
+
**Usage Example:**
|
|
180
|
+
```typescript
|
|
181
|
+
// Create a new webhook
|
|
182
|
+
const newWebhook = {
|
|
183
|
+
name: 'Content Update Notification',
|
|
184
|
+
url: 'https://api.example.com/webhooks/agility-content',
|
|
185
|
+
events: [
|
|
186
|
+
'content.created',
|
|
187
|
+
'content.updated',
|
|
188
|
+
'content.published'
|
|
189
|
+
],
|
|
190
|
+
isActive: true,
|
|
191
|
+
method: 'POST',
|
|
192
|
+
contentType: 'application/json',
|
|
193
|
+
timeout: 30000,
|
|
194
|
+
retryCount: 3,
|
|
195
|
+
authentication: {
|
|
196
|
+
type: 'header',
|
|
197
|
+
headers: {
|
|
198
|
+
'Authorization': 'Bearer your-api-token',
|
|
199
|
+
'X-API-Key': 'your-api-key'
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const savedWebhook = await apiClient.webhookMethods.saveWebhook(newWebhook, guid);
|
|
205
|
+
console.log('Webhook created with ID:', savedWebhook.webhookID);
|
|
206
|
+
|
|
207
|
+
// Update existing webhook
|
|
208
|
+
const existingWebhook = await apiClient.webhookMethods.getWebhook(123, guid);
|
|
209
|
+
existingWebhook.name = 'Updated Webhook Name';
|
|
210
|
+
existingWebhook.url = 'https://api.example.com/webhooks/updated-endpoint';
|
|
211
|
+
existingWebhook.events.push('page.published');
|
|
212
|
+
|
|
213
|
+
const updatedWebhook = await apiClient.webhookMethods.saveWebhook(existingWebhook, guid);
|
|
214
|
+
console.log('Webhook updated:', updatedWebhook.name);
|
|
215
|
+
|
|
216
|
+
// Create webhook with custom payload template
|
|
217
|
+
const customWebhook = {
|
|
218
|
+
name: 'Custom Payload Webhook',
|
|
219
|
+
url: 'https://api.example.com/webhooks/custom',
|
|
220
|
+
events: ['content.published'],
|
|
221
|
+
isActive: true,
|
|
222
|
+
method: 'POST',
|
|
223
|
+
contentType: 'application/json',
|
|
224
|
+
timeout: 15000,
|
|
225
|
+
retryCount: 2,
|
|
226
|
+
payloadTemplate: {
|
|
227
|
+
eventType: '{{event}}',
|
|
228
|
+
timestamp: '{{timestamp}}',
|
|
229
|
+
contentData: {
|
|
230
|
+
id: '{{content.id}}',
|
|
231
|
+
title: '{{content.title}}',
|
|
232
|
+
referenceName: '{{content.referenceName}}'
|
|
233
|
+
},
|
|
234
|
+
customField: 'custom value'
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// Create webhook with signature verification
|
|
239
|
+
const secureWebhook = {
|
|
240
|
+
name: 'Secure Webhook',
|
|
241
|
+
url: 'https://api.example.com/webhooks/secure',
|
|
242
|
+
events: ['content.created', 'content.updated'],
|
|
243
|
+
isActive: true,
|
|
244
|
+
method: 'POST',
|
|
245
|
+
contentType: 'application/json',
|
|
246
|
+
timeout: 30000,
|
|
247
|
+
retryCount: 3,
|
|
248
|
+
authentication: {
|
|
249
|
+
type: 'signature',
|
|
250
|
+
secret: 'your-webhook-secret',
|
|
251
|
+
algorithm: 'sha256',
|
|
252
|
+
headerName: 'X-Agility-Signature'
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
// Bulk webhook operations
|
|
257
|
+
const createContentWebhooks = async (endpoints) => {
|
|
258
|
+
const webhooks = [];
|
|
259
|
+
for (const endpoint of endpoints) {
|
|
260
|
+
const webhook = {
|
|
261
|
+
name: `Content Webhook - ${endpoint.name}`,
|
|
262
|
+
url: endpoint.url,
|
|
263
|
+
events: ['content.created', 'content.updated', 'content.published'],
|
|
264
|
+
isActive: true,
|
|
265
|
+
method: 'POST',
|
|
266
|
+
contentType: 'application/json',
|
|
267
|
+
timeout: 30000,
|
|
268
|
+
retryCount: 3
|
|
269
|
+
};
|
|
270
|
+
|
|
271
|
+
const saved = await apiClient.webhookMethods.saveWebhook(webhook, guid);
|
|
272
|
+
webhooks.push(saved);
|
|
273
|
+
}
|
|
274
|
+
return webhooks;
|
|
275
|
+
};
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
**Webhook Structure:**
|
|
279
|
+
```typescript
|
|
280
|
+
interface Webhook {
|
|
281
|
+
webhookID?: number; // Auto-generated for new webhooks
|
|
282
|
+
name: string; // Human-readable name (required)
|
|
283
|
+
url: string; // Target URL (required)
|
|
284
|
+
events: string[]; // Array of event types (required)
|
|
285
|
+
isActive: boolean; // Whether webhook is active
|
|
286
|
+
method: string; // HTTP method (GET, POST, PUT, etc.)
|
|
287
|
+
contentType: string; // Content type for payload
|
|
288
|
+
timeout: number; // Request timeout in milliseconds
|
|
289
|
+
retryCount: number; // Number of retry attempts
|
|
290
|
+
authentication?: WebhookAuth; // Authentication configuration
|
|
291
|
+
payloadTemplate?: any; // Custom payload template
|
|
292
|
+
statistics?: WebhookStats; // Delivery statistics (read-only)
|
|
293
|
+
createdDate?: string; // Auto-generated
|
|
294
|
+
lastTriggered?: string; // Auto-generated
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
interface WebhookAuth {
|
|
298
|
+
type: string; // 'header', 'signature', 'basic', etc.
|
|
299
|
+
headers?: { [key: string]: string }; // Custom headers
|
|
300
|
+
secret?: string; // Secret for signature authentication
|
|
301
|
+
algorithm?: string; // Algorithm for signature (sha256, etc.)
|
|
302
|
+
headerName?: string; // Header name for signature
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
interface WebhookStats {
|
|
306
|
+
totalDeliveries: number; // Total delivery attempts
|
|
307
|
+
successfulDeliveries: number; // Successful deliveries
|
|
308
|
+
failedDeliveries: number; // Failed deliveries
|
|
309
|
+
successRate: number; // Success rate percentage
|
|
310
|
+
lastDeliveryDate: string; // Last delivery attempt date
|
|
311
|
+
lastSuccessDate: string; // Last successful delivery date
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
**Authentication Types:**
|
|
316
|
+
- `header`: Custom headers for authentication
|
|
317
|
+
- `signature`: HMAC signature verification
|
|
318
|
+
- `basic`: Basic authentication
|
|
319
|
+
- `bearer`: Bearer token authentication
|
|
320
|
+
- `custom`: Custom authentication scheme
|
|
321
|
+
|
|
322
|
+
**Error Handling:**
|
|
323
|
+
- Throws `Exception` when validation fails (invalid URL, unsupported events, etc.)
|
|
324
|
+
- Throws `Exception` when save operation fails
|
|
325
|
+
- Throws `Exception` when authentication configuration is invalid
|
|
326
|
+
|
|
327
|
+
### deleteWebhook
|
|
328
|
+
|
|
329
|
+
Deletes a webhook by its ID.
|
|
330
|
+
|
|
331
|
+
| Parameter | Type | Required | Description |
|
|
332
|
+
|-----------|------|----------|-------------|
|
|
333
|
+
| `webhookID` | `number` | Yes | The webhook ID to delete |
|
|
334
|
+
| `guid` | `string` | Yes | Current website GUID |
|
|
335
|
+
|
|
336
|
+
**Returns:** `string` - Confirmation message of successful deletion
|
|
337
|
+
|
|
338
|
+
**Usage Example:**
|
|
339
|
+
```typescript
|
|
340
|
+
try {
|
|
341
|
+
const result = await apiClient.webhookMethods.deleteWebhook(123, guid);
|
|
342
|
+
console.log(result); // "Webhook deleted successfully"
|
|
343
|
+
} catch (error) {
|
|
344
|
+
console.error('Failed to delete webhook:', error.message);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Safe webhook deletion with confirmation
|
|
348
|
+
const safeDeleteWebhook = async (webhookID) => {
|
|
349
|
+
try {
|
|
350
|
+
// Get webhook details first
|
|
351
|
+
const webhook = await apiClient.webhookMethods.getWebhook(webhookID, guid);
|
|
352
|
+
console.log(`About to delete webhook: ${webhook.name}`);
|
|
353
|
+
console.log(`URL: ${webhook.url}`);
|
|
354
|
+
console.log(`Events: ${webhook.events.join(', ')}`);
|
|
355
|
+
|
|
356
|
+
// Check if webhook is active
|
|
357
|
+
if (webhook.isActive) {
|
|
358
|
+
console.log('Warning: Deleting active webhook');
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// Perform deletion
|
|
362
|
+
const result = await apiClient.webhookMethods.deleteWebhook(webhookID, guid);
|
|
363
|
+
console.log('Webhook deleted successfully');
|
|
364
|
+
return result;
|
|
365
|
+
} catch (error) {
|
|
366
|
+
console.error('Failed to delete webhook:', error.message);
|
|
367
|
+
throw error;
|
|
368
|
+
}
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
// Bulk cleanup of inactive webhooks
|
|
372
|
+
const cleanupInactiveWebhooks = async () => {
|
|
373
|
+
const webhooks = await apiClient.webhookMethods.getWebhookList(guid);
|
|
374
|
+
const inactiveWebhooks = webhooks.filter(w => !w.isActive);
|
|
375
|
+
|
|
376
|
+
console.log(`Found ${inactiveWebhooks.length} inactive webhooks`);
|
|
377
|
+
|
|
378
|
+
for (const webhook of inactiveWebhooks) {
|
|
379
|
+
const shouldDelete = confirm(
|
|
380
|
+
`Delete inactive webhook "${webhook.name}"? (${webhook.url})`
|
|
381
|
+
);
|
|
382
|
+
|
|
383
|
+
if (shouldDelete) {
|
|
384
|
+
await apiClient.webhookMethods.deleteWebhook(webhook.webhookID, guid);
|
|
385
|
+
console.log(`Deleted webhook: ${webhook.name}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
// Delete webhooks with high failure rates
|
|
391
|
+
const cleanupFailingWebhooks = async (maxFailureRate = 50) => {
|
|
392
|
+
const webhooks = await apiClient.webhookMethods.getWebhookList(guid);
|
|
393
|
+
|
|
394
|
+
const failingWebhooks = webhooks.filter(webhook =>
|
|
395
|
+
webhook.statistics &&
|
|
396
|
+
webhook.statistics.successRate < maxFailureRate &&
|
|
397
|
+
webhook.statistics.totalDeliveries > 10 // Only consider webhooks with sufficient data
|
|
398
|
+
);
|
|
399
|
+
|
|
400
|
+
console.log(`Found ${failingWebhooks.length} webhooks with high failure rate`);
|
|
401
|
+
|
|
402
|
+
for (const webhook of failingWebhooks) {
|
|
403
|
+
console.log(`Webhook "${webhook.name}" has ${webhook.statistics.successRate}% success rate`);
|
|
404
|
+
|
|
405
|
+
const shouldDelete = confirm(
|
|
406
|
+
`Delete failing webhook "${webhook.name}"? (Success rate: ${webhook.statistics.successRate}%)`
|
|
407
|
+
);
|
|
408
|
+
|
|
409
|
+
if (shouldDelete) {
|
|
410
|
+
await apiClient.webhookMethods.deleteWebhook(webhook.webhookID, guid);
|
|
411
|
+
console.log(`Deleted failing webhook: ${webhook.name}`);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
**Deletion Considerations:**
|
|
418
|
+
- Deleting a webhook immediately stops all future event deliveries
|
|
419
|
+
- Pending webhook deliveries may still be processed
|
|
420
|
+
- Webhook statistics and history are permanently lost
|
|
421
|
+
- Consider deactivating instead of deleting for temporary suspension
|
|
422
|
+
|
|
423
|
+
**Best Practices:**
|
|
424
|
+
- Test webhook endpoints before creating webhooks
|
|
425
|
+
- Use appropriate authentication to secure webhook endpoints
|
|
426
|
+
- Monitor webhook statistics and success rates
|
|
427
|
+
- Implement proper error handling in webhook receivers
|
|
428
|
+
- Use webhook signatures to verify authenticity
|
|
429
|
+
- Set reasonable timeout values to avoid blocking
|
|
430
|
+
- Consider implementing idempotency in webhook receivers
|
|
431
|
+
|
|
432
|
+
**Error Handling:**
|
|
433
|
+
- Throws `Exception` when webhook not found
|
|
434
|
+
- Throws `Exception` when deletion fails
|
|
435
|
+
- Throws `Exception` when insufficient permissions to delete webhooks
|
|
436
|
+
|
|
437
|
+
---
|
|
438
|
+
|
|
439
|
+
## Navigation
|
|
440
|
+
- [← Back to Main Documentation](../README.md)
|
|
441
|
+
- [Authentication & Setup](./auth.md)
|
|
442
|
+
- [AssetMethods](./asset-methods.md)
|
|
443
|
+
- [BatchMethods](./batch-methods.md)
|
|
444
|
+
- [ContainerMethods](./container-methods.md)
|
|
445
|
+
- [ContentMethods](./content-methods.md)
|
|
446
|
+
- [InstanceMethods](./instance-methods.md)
|
|
447
|
+
- [InstanceUserMethods](./instance-user-methods.md)
|
|
448
|
+
- [ModelMethods](./model-methods.md)
|
|
449
|
+
- [PageMethods](./page-methods.md)
|
|
450
|
+
- [ServerUserMethods](./server-user-methods.md)
|
|
451
|
+
- [ServerUserMethods](./server-user-methods.md)
|
|
452
|
+
- **WebhookMethods** *(current)*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agility/management-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4-beta.1",
|
|
4
4
|
"description": "Agility CMS Tyescript SDK for Management API.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,27 +13,31 @@
|
|
|
13
13
|
"main": "dist/index.js",
|
|
14
14
|
"scripts": {
|
|
15
15
|
"clean": "git clean -Xf && rm -rf ./dist",
|
|
16
|
-
|
|
16
|
+
"build": "tsc",
|
|
17
17
|
"prepare": "yarn build",
|
|
18
18
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
19
19
|
},
|
|
20
20
|
"keywords": [
|
|
21
21
|
"typescript",
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
"agility",
|
|
23
|
+
"cms",
|
|
24
|
+
"headlesscms",
|
|
25
25
|
"management-api"
|
|
26
26
|
],
|
|
27
27
|
"author": "Agility CMS",
|
|
28
28
|
"contributors": [
|
|
29
|
-
|
|
30
|
-
"Mohit Vashishtha"
|
|
31
|
-
|
|
29
|
+
"Joel Varty",
|
|
30
|
+
"Mohit Vashishtha",
|
|
31
|
+
"Kevin Tran",
|
|
32
|
+
"Aaron Taylor"
|
|
33
|
+
],
|
|
32
34
|
"license": "MIT",
|
|
33
35
|
"dependencies": {
|
|
34
|
-
"axios": "^
|
|
36
|
+
"axios": "^1.10.0",
|
|
37
|
+
"keytar": "^7.9.0"
|
|
35
38
|
},
|
|
36
39
|
"devDependencies": {
|
|
37
|
-
"@types/node": "^
|
|
40
|
+
"@types/node": "^24.0.10",
|
|
41
|
+
"@types/keytar": "^4.4.2"
|
|
38
42
|
}
|
|
39
43
|
}
|
package/tsconfig.json
CHANGED
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
"allowJs": true,
|
|
5
5
|
"declaration": true,
|
|
6
6
|
"jsx": "react",
|
|
7
|
-
"target": "
|
|
7
|
+
"target": "es5",
|
|
8
8
|
"outDir": "./dist/",
|
|
9
9
|
"lib": ["es2016", "dom"],
|
|
10
10
|
"esModuleInterop": true,
|
|
11
11
|
"skipLibCheck": true,
|
|
12
12
|
"allowSyntheticDefaultImports": true
|
|
13
13
|
},
|
|
14
|
-
"include": ["src"]
|
|
14
|
+
"include": ["src", "src/apiClient.ts"]
|
|
15
15
|
}
|