@agility/management-sdk 0.1.36 → 0.1.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +371 -317
- package/dist/apiMethods/clientInstance.d.ts +2 -0
- package/dist/apiMethods/clientInstance.js +11 -2
- package/dist/apiMethods/containerMethods.d.ts +3 -0
- package/dist/apiMethods/containerMethods.js +43 -9
- package/dist/apiMethods/contentMethods.d.ts +12 -0
- package/dist/apiMethods/contentMethods.js +100 -46
- package/dist/apiMethods/pageMethods.d.ts +12 -0
- package/dist/apiMethods/pageMethods.js +88 -34
- package/dist/enums/contentViewType.d.ts +6 -0
- package/dist/enums/contentViewType.js +10 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/models/pagedResult.d.ts +4 -0
- package/dist/models/pagedResult.js +2 -0
- package/docs/asset-methods.md +381 -381
- package/docs/auth-component.md +360 -360
- package/docs/auth.md +593 -593
- package/docs/batch-methods.md +243 -243
- package/docs/cicd.md +606 -606
- package/docs/container-methods.md +267 -267
- package/docs/content-methods.md +491 -422
- package/docs/instance-methods.md +104 -104
- package/docs/instance-user-methods.md +230 -230
- package/docs/model-methods.md +433 -433
- package/docs/multi-instance-operations.md +191 -191
- package/docs/page-methods.md +737 -670
- package/docs/server-user-methods.md +279 -279
- package/docs/webhook-methods.md +451 -451
- package/license.txt +20 -20
- package/package.json +40 -40
- package/tsconfig.json +14 -14
- package/.cursor/api-coverage.md +0 -217
- package/.cursor/api-documentation-manifest.md +0 -275
- package/.cursor/api-functions-analysis.md +0 -111
- package/.cursor/breakout-manifest.md +0 -278
- package/.cursor/docs-final-check.md +0 -269
- package/.cursor/github-actions-improvements.md +0 -76
- package/.cursor/hardening.md +0 -271
- package/.cursor/linting-fix.md +0 -160
- package/.cursor/manifest.md +0 -243
- package/.cursor/mocks.md +0 -100
- package/.cursor/test-coverage.md +0 -841
- package/.env +0 -92
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/coverage-summary.json +0 -43
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -161
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -161
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov-report/src/apiClient.ts.html +0 -199
- package/coverage/lcov-report/src/apiMethods/assetMethods.ts.html +0 -682
- package/coverage/lcov-report/src/apiMethods/batchMethods.ts.html +0 -736
- package/coverage/lcov-report/src/apiMethods/clientInstance.ts.html +0 -403
- package/coverage/lcov-report/src/apiMethods/containerMethods.ts.html +0 -460
- package/coverage/lcov-report/src/apiMethods/contentMethods.ts.html +0 -1183
- package/coverage/lcov-report/src/apiMethods/index.html +0 -266
- package/coverage/lcov-report/src/apiMethods/instanceMethods.ts.html +0 -160
- package/coverage/lcov-report/src/apiMethods/instanceUserMethods.ts.html +0 -268
- package/coverage/lcov-report/src/apiMethods/modelMethods.ts.html +0 -352
- package/coverage/lcov-report/src/apiMethods/pageMethods.ts.html +0 -1276
- package/coverage/lcov-report/src/apiMethods/serverUserMethods.ts.html +0 -196
- package/coverage/lcov-report/src/apiMethods/webhookMethods.ts.html +0 -271
- package/coverage/lcov-report/src/enums/batchItemType.ts.html +0 -106
- package/coverage/lcov-report/src/enums/batchOperationType.ts.html +0 -142
- package/coverage/lcov-report/src/enums/batchState..ts.html +0 -106
- package/coverage/lcov-report/src/enums/index.html +0 -161
- package/coverage/lcov-report/src/enums/workflowOperationType.ts.html +0 -175
- package/coverage/lcov-report/src/index.html +0 -116
- package/coverage/lcov-report/src/models/assetContainer.ts.html +0 -106
- package/coverage/lcov-report/src/models/assetGalleries.ts.html +0 -103
- package/coverage/lcov-report/src/models/assetMediaGrouping.ts.html +0 -136
- package/coverage/lcov-report/src/models/assetMediaGroupingMetaData.ts.html +0 -97
- package/coverage/lcov-report/src/models/batch.ts.html +0 -178
- package/coverage/lcov-report/src/models/batchItem.ts.html +0 -127
- package/coverage/lcov-report/src/models/container.ts.html +0 -232
- package/coverage/lcov-report/src/models/contentDefinitionTypeID.ts.html +0 -142
- package/coverage/lcov-report/src/models/contentItem.ts.html +0 -202
- package/coverage/lcov-report/src/models/contentSectionDefaultModule.ts.html +0 -106
- package/coverage/lcov-report/src/models/contentSectionDefinition.ts.html +0 -196
- package/coverage/lcov-report/src/models/contentViewColumn.ts.html +0 -109
- package/coverage/lcov-report/src/models/exception.ts.html +0 -109
- package/coverage/lcov-report/src/models/index.html +0 -476
- package/coverage/lcov-report/src/models/instanceRole.ts.html +0 -106
- package/coverage/lcov-report/src/models/instanceUser.ts.html +0 -130
- package/coverage/lcov-report/src/models/locales.ts.html +0 -100
- package/coverage/lcov-report/src/models/media.ts.html +0 -178
- package/coverage/lcov-report/src/models/model.ts.html +0 -172
- package/coverage/lcov-report/src/models/notification.ts.html +0 -124
- package/coverage/lcov-report/src/models/options.ts.html +0 -109
- package/coverage/lcov-report/src/models/pageItem.ts.html +0 -268
- package/coverage/lcov-report/src/models/pageModel.ts.html +0 -130
- package/coverage/lcov-report/src/models/sharedModule.ts.html +0 -106
- package/coverage/lcov-report/src/models/sitemap.ts.html +0 -148
- package/coverage/lcov-report/src/models/websiteUser.ts.html +0 -157
- package/coverage/lcov.info +0 -1459
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/src/apiClient.ts.html +0 -199
- package/coverage/src/apiMethods/assetMethods.ts.html +0 -682
- package/coverage/src/apiMethods/batchMethods.ts.html +0 -736
- package/coverage/src/apiMethods/clientInstance.ts.html +0 -403
- package/coverage/src/apiMethods/containerMethods.ts.html +0 -460
- package/coverage/src/apiMethods/contentMethods.ts.html +0 -1183
- package/coverage/src/apiMethods/index.html +0 -266
- package/coverage/src/apiMethods/instanceMethods.ts.html +0 -160
- package/coverage/src/apiMethods/instanceUserMethods.ts.html +0 -268
- package/coverage/src/apiMethods/modelMethods.ts.html +0 -352
- package/coverage/src/apiMethods/pageMethods.ts.html +0 -1276
- package/coverage/src/apiMethods/serverUserMethods.ts.html +0 -196
- package/coverage/src/apiMethods/webhookMethods.ts.html +0 -271
- package/coverage/src/enums/batchItemType.ts.html +0 -106
- package/coverage/src/enums/batchOperationType.ts.html +0 -142
- package/coverage/src/enums/batchState..ts.html +0 -106
- package/coverage/src/enums/index.html +0 -161
- package/coverage/src/enums/workflowOperationType.ts.html +0 -175
- package/coverage/src/index.html +0 -116
- package/coverage/src/models/assetContainer.ts.html +0 -106
- package/coverage/src/models/assetGalleries.ts.html +0 -103
- package/coverage/src/models/assetMediaGrouping.ts.html +0 -136
- package/coverage/src/models/assetMediaGroupingMetaData.ts.html +0 -97
- package/coverage/src/models/batch.ts.html +0 -178
- package/coverage/src/models/batchItem.ts.html +0 -127
- package/coverage/src/models/container.ts.html +0 -232
- package/coverage/src/models/contentDefinitionTypeID.ts.html +0 -142
- package/coverage/src/models/contentItem.ts.html +0 -202
- package/coverage/src/models/contentSectionDefaultModule.ts.html +0 -106
- package/coverage/src/models/contentSectionDefinition.ts.html +0 -196
- package/coverage/src/models/contentViewColumn.ts.html +0 -109
- package/coverage/src/models/exception.ts.html +0 -109
- package/coverage/src/models/index.html +0 -476
- package/coverage/src/models/instanceRole.ts.html +0 -106
- package/coverage/src/models/instanceUser.ts.html +0 -130
- package/coverage/src/models/locales.ts.html +0 -100
- package/coverage/src/models/media.ts.html +0 -178
- package/coverage/src/models/model.ts.html +0 -172
- package/coverage/src/models/notification.ts.html +0 -124
- package/coverage/src/models/options.ts.html +0 -109
- package/coverage/src/models/pageItem.ts.html +0 -268
- package/coverage/src/models/pageModel.ts.html +0 -130
- package/coverage/src/models/sharedModule.ts.html +0 -106
- package/coverage/src/models/sitemap.ts.html +0 -148
- package/coverage/src/models/websiteUser.ts.html +0 -157
- package/dist/.tsbuildinfo +0 -1
- package/dist/apiClient.d.ts.map +0 -1
- package/dist/apiClient.js.map +0 -1
- package/dist/apiMethods/assetMethods.d.ts.map +0 -1
- package/dist/apiMethods/assetMethods.js.map +0 -1
- package/dist/apiMethods/batchMethods.d.ts.map +0 -1
- package/dist/apiMethods/batchMethods.js.map +0 -1
- package/dist/apiMethods/clientInstance.d.ts.map +0 -1
- package/dist/apiMethods/clientInstance.js.map +0 -1
- package/dist/apiMethods/containerMethods.d.ts.map +0 -1
- package/dist/apiMethods/containerMethods.js.map +0 -1
- package/dist/apiMethods/contentMethods.d.ts.map +0 -1
- package/dist/apiMethods/contentMethods.js.map +0 -1
- package/dist/apiMethods/instanceMethods.d.ts.map +0 -1
- package/dist/apiMethods/instanceMethods.js.map +0 -1
- package/dist/apiMethods/instanceUserMethods.d.ts.map +0 -1
- package/dist/apiMethods/instanceUserMethods.js.map +0 -1
- package/dist/apiMethods/modelMethods.d.ts.map +0 -1
- package/dist/apiMethods/modelMethods.js.map +0 -1
- package/dist/apiMethods/pageMethods.d.ts.map +0 -1
- package/dist/apiMethods/pageMethods.js.map +0 -1
- package/dist/apiMethods/serverUserMethods.d.ts.map +0 -1
- package/dist/apiMethods/serverUserMethods.js.map +0 -1
- package/dist/apiMethods/webhookMethods.d.ts.map +0 -1
- package/dist/apiMethods/webhookMethods.js.map +0 -1
- package/dist/enums/assetGroupingType.d.ts.map +0 -1
- package/dist/enums/assetGroupingType.js.map +0 -1
- package/dist/enums/batchItemType.d.ts.map +0 -1
- package/dist/enums/batchItemType.js.map +0 -1
- package/dist/enums/batchOperationType.d.ts.map +0 -1
- package/dist/enums/batchOperationType.js.map +0 -1
- package/dist/enums/batchState..d.ts.map +0 -1
- package/dist/enums/batchState..js.map +0 -1
- package/dist/enums/pageItemTemplateType.d.ts.map +0 -1
- package/dist/enums/pageItemTemplateType.js.map +0 -1
- package/dist/enums/workflowOperationType.d.ts.map +0 -1
- package/dist/enums/workflowOperationType.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/models/assetContainer.d.ts.map +0 -1
- package/dist/models/assetContainer.js.map +0 -1
- package/dist/models/assetGalleries.d.ts.map +0 -1
- package/dist/models/assetGalleries.js.map +0 -1
- package/dist/models/assetMediaGrouping.d.ts.map +0 -1
- package/dist/models/assetMediaGrouping.js.map +0 -1
- package/dist/models/assetMediaGroupingMetaData.d.ts.map +0 -1
- package/dist/models/assetMediaGroupingMetaData.js.map +0 -1
- package/dist/models/batch.d.ts.map +0 -1
- package/dist/models/batch.js.map +0 -1
- package/dist/models/batchItem.d.ts.map +0 -1
- package/dist/models/batchItem.js.map +0 -1
- package/dist/models/batchTypes.d.ts.map +0 -1
- package/dist/models/batchTypes.js.map +0 -1
- package/dist/models/container.d.ts.map +0 -1
- package/dist/models/container.js.map +0 -1
- package/dist/models/contentDefinitionTypeID.d.ts.map +0 -1
- package/dist/models/contentDefinitionTypeID.js.map +0 -1
- package/dist/models/contentItem.d.ts.map +0 -1
- package/dist/models/contentItem.js.map +0 -1
- package/dist/models/contentItemHistory.d.ts.map +0 -1
- package/dist/models/contentItemHistory.js.map +0 -1
- package/dist/models/contentListFilterModel.d.ts.map +0 -1
- package/dist/models/contentListFilterModel.js.map +0 -1
- package/dist/models/contentSectionDefaultModule.d.ts.map +0 -1
- package/dist/models/contentSectionDefaultModule.js.map +0 -1
- package/dist/models/contentSectionDefinition.d.ts.map +0 -1
- package/dist/models/contentSectionDefinition.js.map +0 -1
- package/dist/models/contentViewColumn.d.ts.map +0 -1
- package/dist/models/contentViewColumn.js.map +0 -1
- package/dist/models/exception.d.ts.map +0 -1
- package/dist/models/exception.js.map +0 -1
- package/dist/models/instanceRole.d.ts.map +0 -1
- package/dist/models/instanceRole.js.map +0 -1
- package/dist/models/instanceUser.d.ts.map +0 -1
- package/dist/models/instanceUser.js.map +0 -1
- package/dist/models/itemComments.d.ts.map +0 -1
- package/dist/models/itemComments.js.map +0 -1
- package/dist/models/listParams.d.ts.map +0 -1
- package/dist/models/listParams.js.map +0 -1
- package/dist/models/locales.d.ts.map +0 -1
- package/dist/models/locales.js.map +0 -1
- package/dist/models/media.d.ts.map +0 -1
- package/dist/models/media.js.map +0 -1
- package/dist/models/model.d.ts.map +0 -1
- package/dist/models/model.js.map +0 -1
- package/dist/models/notification.d.ts.map +0 -1
- package/dist/models/notification.js.map +0 -1
- package/dist/models/options.d.ts.map +0 -1
- package/dist/models/options.js.map +0 -1
- package/dist/models/pageHistory.d.ts.map +0 -1
- package/dist/models/pageHistory.js.map +0 -1
- package/dist/models/pageItem.d.ts.map +0 -1
- package/dist/models/pageItem.js.map +0 -1
- package/dist/models/pageModel.d.ts.map +0 -1
- package/dist/models/pageModel.js.map +0 -1
- package/dist/models/serverUser.d.ts.map +0 -1
- package/dist/models/serverUser.js.map +0 -1
- package/dist/models/sharedModule.d.ts.map +0 -1
- package/dist/models/sharedModule.js.map +0 -1
- package/dist/models/sitemap.d.ts.map +0 -1
- package/dist/models/sitemap.js.map +0 -1
- package/dist/models/webhook.d.ts.map +0 -1
- package/dist/models/webhook.js.map +0 -1
- package/dist/models/websiteListing.d.ts.map +0 -1
- package/dist/models/websiteListing.js.map +0 -1
- package/dist/models/websiteUser.d.ts.map +0 -1
- package/dist/models/websiteUser.js.map +0 -1
|
@@ -1,192 +1,192 @@
|
|
|
1
|
-
# Multi-Instance Operations
|
|
2
|
-
|
|
3
|
-
This guide demonstrates how to perform content operations across multiple Agility CMS instances and locales using configuration-driven approaches.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
When managing content across multiple Agility CMS instances (different regions, environments, or brands), you can use a configuration matrix to create identical content across multiple instances and locales.
|
|
8
|
-
|
|
9
|
-
## Configuration Structure
|
|
10
|
-
|
|
11
|
-
Define your instance matrix using a simple configuration structure:
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
interface InstanceConfig {
|
|
15
|
-
guid: string;
|
|
16
|
-
locales: string[];
|
|
17
|
-
name?: string; // Optional: for reporting
|
|
18
|
-
region?: string; // Optional: for regional instances
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const instances: InstanceConfig[] = [
|
|
22
|
-
{
|
|
23
|
-
guid: 'xxxxxxx-u',
|
|
24
|
-
locales: ['en-us', 'en-ca', 'fr-ca'],
|
|
25
|
-
name: 'Production US',
|
|
26
|
-
region: 'us'
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
guid: 'xxxxxxy-u',
|
|
30
|
-
locales: ['en-us'],
|
|
31
|
-
name: 'Production EU',
|
|
32
|
-
region: 'eu'
|
|
33
|
-
}
|
|
34
|
-
];
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Basic Multi-Instance Content Creation
|
|
38
|
-
|
|
39
|
-
### Sequential Content Creation
|
|
40
|
-
|
|
41
|
-
```typescript
|
|
42
|
-
import * as mgmtApi from '@agility/management-sdk';
|
|
43
|
-
|
|
44
|
-
interface ContentCreationResult {
|
|
45
|
-
guid: string;
|
|
46
|
-
locale: string;
|
|
47
|
-
success: boolean;
|
|
48
|
-
contentId?: number;
|
|
49
|
-
error?: string;
|
|
50
|
-
instanceName?: string;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
async function createContentAcrossInstances(
|
|
54
|
-
instances: InstanceConfig[],
|
|
55
|
-
contentData: any
|
|
56
|
-
): Promise<ContentCreationResult[]> {
|
|
57
|
-
const apiClient = new mgmtApi.ApiClient();
|
|
58
|
-
await apiClient.auth();
|
|
59
|
-
|
|
60
|
-
const results: ContentCreationResult[] = [];
|
|
61
|
-
|
|
62
|
-
for (const instance of instances) {
|
|
63
|
-
for (const locale of instance.locales) {
|
|
64
|
-
try {
|
|
65
|
-
console.log(`Creating content in ${instance.name || instance.guid} (${locale})...`);
|
|
66
|
-
|
|
67
|
-
const contentIds = await apiClient.contentMethods.saveContentItem(
|
|
68
|
-
contentData,
|
|
69
|
-
instance.guid,
|
|
70
|
-
locale
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
results.push({
|
|
74
|
-
guid: instance.guid,
|
|
75
|
-
locale,
|
|
76
|
-
success: true,
|
|
77
|
-
contentId: Array.isArray(contentIds) ? contentIds[0] : contentIds,
|
|
78
|
-
instanceName: instance.name
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
console.log(`✅ Success: Content created with ID ${contentIds} in ${instance.name} (${locale})`);
|
|
82
|
-
|
|
83
|
-
} catch (error) {
|
|
84
|
-
results.push({
|
|
85
|
-
guid: instance.guid,
|
|
86
|
-
locale,
|
|
87
|
-
success: false,
|
|
88
|
-
error: error.message,
|
|
89
|
-
instanceName: instance.name
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
console.error(`❌ Failed: ${instance.name} (${locale}) - ${error.message}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return results;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Usage
|
|
101
|
-
const contentData = {
|
|
102
|
-
properties: {
|
|
103
|
-
referenceName: 'blog-post',
|
|
104
|
-
definitionName: 'BlogPost',
|
|
105
|
-
state: 2
|
|
106
|
-
},
|
|
107
|
-
fields: {
|
|
108
|
-
title: 'Global Product Launch Announcement',
|
|
109
|
-
content: 'We are excited to announce our new product...',
|
|
110
|
-
publishDate: new Date().toISOString(),
|
|
111
|
-
author: 'Marketing Team'
|
|
112
|
-
}
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
const results = await createContentAcrossInstances(instances, contentData);
|
|
116
|
-
console.log('Content creation completed:', results);
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Parallel Processing for Better Performance
|
|
120
|
-
|
|
121
|
-
```typescript
|
|
122
|
-
async function createContentParallel(
|
|
123
|
-
instances: InstanceConfig[],
|
|
124
|
-
contentData: any
|
|
125
|
-
): Promise<ContentCreationResult[]> {
|
|
126
|
-
const apiClient = new mgmtApi.ApiClient();
|
|
127
|
-
await apiClient.auth();
|
|
128
|
-
|
|
129
|
-
// Create array of all instance/locale combinations
|
|
130
|
-
const operations = instances.flatMap(instance =>
|
|
131
|
-
instance.locales.map(locale => ({ instance, locale }))
|
|
132
|
-
);
|
|
133
|
-
|
|
134
|
-
// Execute all operations in parallel
|
|
135
|
-
const results = await Promise.allSettled(
|
|
136
|
-
operations.map(async ({ instance, locale }) => {
|
|
137
|
-
try {
|
|
138
|
-
const contentIds = await apiClient.contentMethods.saveContentItem(
|
|
139
|
-
contentData,
|
|
140
|
-
instance.guid,
|
|
141
|
-
locale
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
return {
|
|
145
|
-
guid: instance.guid,
|
|
146
|
-
locale,
|
|
147
|
-
success: true,
|
|
148
|
-
contentId: Array.isArray(contentIds) ? contentIds[0] : contentIds,
|
|
149
|
-
instanceName: instance.name
|
|
150
|
-
} as ContentCreationResult;
|
|
151
|
-
|
|
152
|
-
} catch (error) {
|
|
153
|
-
return {
|
|
154
|
-
guid: instance.guid,
|
|
155
|
-
locale,
|
|
156
|
-
success: false,
|
|
157
|
-
error: error.message,
|
|
158
|
-
instanceName: instance.name
|
|
159
|
-
} as ContentCreationResult;
|
|
160
|
-
}
|
|
161
|
-
})
|
|
162
|
-
);
|
|
163
|
-
|
|
164
|
-
// Extract results from Promise.allSettled
|
|
165
|
-
return results.map(result =>
|
|
166
|
-
result.status === 'fulfilled' ? result.value : result.reason
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// Usage
|
|
171
|
-
const parallelResults = await createContentParallel(instances, contentData);
|
|
172
|
-
console.log('Parallel content creation completed:', parallelResults);
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## Navigation
|
|
178
|
-
- [← Back to Main Documentation](../README.md)
|
|
179
|
-
- [Authentication & Setup](./auth.md)
|
|
180
|
-
- [CI/CD & Automated Environments](./cicd.md)
|
|
181
|
-
- [AssetMethods](./asset-methods.md)
|
|
182
|
-
- [BatchMethods](./batch-methods.md)
|
|
183
|
-
- [ContainerMethods](./container-methods.md)
|
|
184
|
-
- [ContentMethods](./content-methods.md)
|
|
185
|
-
- [InstanceMethods](./instance-methods.md)
|
|
186
|
-
- [InstanceUserMethods](./instance-user-methods.md)
|
|
187
|
-
- [ModelMethods](./model-methods.md)
|
|
188
|
-
- [PageMethods](./page-methods.md)
|
|
189
|
-
- [ServerUserMethods](./server-user-methods.md)
|
|
190
|
-
- [WebhookMethods](./webhook-methods.md)
|
|
191
|
-
|
|
1
|
+
# Multi-Instance Operations
|
|
2
|
+
|
|
3
|
+
This guide demonstrates how to perform content operations across multiple Agility CMS instances and locales using configuration-driven approaches.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
When managing content across multiple Agility CMS instances (different regions, environments, or brands), you can use a configuration matrix to create identical content across multiple instances and locales.
|
|
8
|
+
|
|
9
|
+
## Configuration Structure
|
|
10
|
+
|
|
11
|
+
Define your instance matrix using a simple configuration structure:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
interface InstanceConfig {
|
|
15
|
+
guid: string;
|
|
16
|
+
locales: string[];
|
|
17
|
+
name?: string; // Optional: for reporting
|
|
18
|
+
region?: string; // Optional: for regional instances
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const instances: InstanceConfig[] = [
|
|
22
|
+
{
|
|
23
|
+
guid: 'xxxxxxx-u',
|
|
24
|
+
locales: ['en-us', 'en-ca', 'fr-ca'],
|
|
25
|
+
name: 'Production US',
|
|
26
|
+
region: 'us'
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
guid: 'xxxxxxy-u',
|
|
30
|
+
locales: ['en-us'],
|
|
31
|
+
name: 'Production EU',
|
|
32
|
+
region: 'eu'
|
|
33
|
+
}
|
|
34
|
+
];
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Basic Multi-Instance Content Creation
|
|
38
|
+
|
|
39
|
+
### Sequential Content Creation
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
import * as mgmtApi from '@agility/management-sdk';
|
|
43
|
+
|
|
44
|
+
interface ContentCreationResult {
|
|
45
|
+
guid: string;
|
|
46
|
+
locale: string;
|
|
47
|
+
success: boolean;
|
|
48
|
+
contentId?: number;
|
|
49
|
+
error?: string;
|
|
50
|
+
instanceName?: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function createContentAcrossInstances(
|
|
54
|
+
instances: InstanceConfig[],
|
|
55
|
+
contentData: any
|
|
56
|
+
): Promise<ContentCreationResult[]> {
|
|
57
|
+
const apiClient = new mgmtApi.ApiClient();
|
|
58
|
+
await apiClient.auth();
|
|
59
|
+
|
|
60
|
+
const results: ContentCreationResult[] = [];
|
|
61
|
+
|
|
62
|
+
for (const instance of instances) {
|
|
63
|
+
for (const locale of instance.locales) {
|
|
64
|
+
try {
|
|
65
|
+
console.log(`Creating content in ${instance.name || instance.guid} (${locale})...`);
|
|
66
|
+
|
|
67
|
+
const contentIds = await apiClient.contentMethods.saveContentItem(
|
|
68
|
+
contentData,
|
|
69
|
+
instance.guid,
|
|
70
|
+
locale
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
results.push({
|
|
74
|
+
guid: instance.guid,
|
|
75
|
+
locale,
|
|
76
|
+
success: true,
|
|
77
|
+
contentId: Array.isArray(contentIds) ? contentIds[0] : contentIds,
|
|
78
|
+
instanceName: instance.name
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
console.log(`✅ Success: Content created with ID ${contentIds} in ${instance.name} (${locale})`);
|
|
82
|
+
|
|
83
|
+
} catch (error) {
|
|
84
|
+
results.push({
|
|
85
|
+
guid: instance.guid,
|
|
86
|
+
locale,
|
|
87
|
+
success: false,
|
|
88
|
+
error: error.message,
|
|
89
|
+
instanceName: instance.name
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
console.error(`❌ Failed: ${instance.name} (${locale}) - ${error.message}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return results;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Usage
|
|
101
|
+
const contentData = {
|
|
102
|
+
properties: {
|
|
103
|
+
referenceName: 'blog-post',
|
|
104
|
+
definitionName: 'BlogPost',
|
|
105
|
+
state: 2
|
|
106
|
+
},
|
|
107
|
+
fields: {
|
|
108
|
+
title: 'Global Product Launch Announcement',
|
|
109
|
+
content: 'We are excited to announce our new product...',
|
|
110
|
+
publishDate: new Date().toISOString(),
|
|
111
|
+
author: 'Marketing Team'
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const results = await createContentAcrossInstances(instances, contentData);
|
|
116
|
+
console.log('Content creation completed:', results);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Parallel Processing for Better Performance
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
async function createContentParallel(
|
|
123
|
+
instances: InstanceConfig[],
|
|
124
|
+
contentData: any
|
|
125
|
+
): Promise<ContentCreationResult[]> {
|
|
126
|
+
const apiClient = new mgmtApi.ApiClient();
|
|
127
|
+
await apiClient.auth();
|
|
128
|
+
|
|
129
|
+
// Create array of all instance/locale combinations
|
|
130
|
+
const operations = instances.flatMap(instance =>
|
|
131
|
+
instance.locales.map(locale => ({ instance, locale }))
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
// Execute all operations in parallel
|
|
135
|
+
const results = await Promise.allSettled(
|
|
136
|
+
operations.map(async ({ instance, locale }) => {
|
|
137
|
+
try {
|
|
138
|
+
const contentIds = await apiClient.contentMethods.saveContentItem(
|
|
139
|
+
contentData,
|
|
140
|
+
instance.guid,
|
|
141
|
+
locale
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
return {
|
|
145
|
+
guid: instance.guid,
|
|
146
|
+
locale,
|
|
147
|
+
success: true,
|
|
148
|
+
contentId: Array.isArray(contentIds) ? contentIds[0] : contentIds,
|
|
149
|
+
instanceName: instance.name
|
|
150
|
+
} as ContentCreationResult;
|
|
151
|
+
|
|
152
|
+
} catch (error) {
|
|
153
|
+
return {
|
|
154
|
+
guid: instance.guid,
|
|
155
|
+
locale,
|
|
156
|
+
success: false,
|
|
157
|
+
error: error.message,
|
|
158
|
+
instanceName: instance.name
|
|
159
|
+
} as ContentCreationResult;
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
// Extract results from Promise.allSettled
|
|
165
|
+
return results.map(result =>
|
|
166
|
+
result.status === 'fulfilled' ? result.value : result.reason
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Usage
|
|
171
|
+
const parallelResults = await createContentParallel(instances, contentData);
|
|
172
|
+
console.log('Parallel content creation completed:', parallelResults);
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Navigation
|
|
178
|
+
- [← Back to Main Documentation](../README.md)
|
|
179
|
+
- [Authentication & Setup](./auth.md)
|
|
180
|
+
- [CI/CD & Automated Environments](./cicd.md)
|
|
181
|
+
- [AssetMethods](./asset-methods.md)
|
|
182
|
+
- [BatchMethods](./batch-methods.md)
|
|
183
|
+
- [ContainerMethods](./container-methods.md)
|
|
184
|
+
- [ContentMethods](./content-methods.md)
|
|
185
|
+
- [InstanceMethods](./instance-methods.md)
|
|
186
|
+
- [InstanceUserMethods](./instance-user-methods.md)
|
|
187
|
+
- [ModelMethods](./model-methods.md)
|
|
188
|
+
- [PageMethods](./page-methods.md)
|
|
189
|
+
- [ServerUserMethods](./server-user-methods.md)
|
|
190
|
+
- [WebhookMethods](./webhook-methods.md)
|
|
191
|
+
|
|
192
192
|
|