@agility/management-sdk
Version:
Agility CMS Tyescript SDK for Management API.
738 lines (581 loc) • 22.7 kB
Markdown
# Agility CMS & Management API TypeScript SDK
## PageMethods
This class provides comprehensive page management operations for Agility CMS. Pages are the structural foundation of your website, defining the navigation hierarchy and content organization.
**Important Notes:**
- Pages define the structure and navigation of your website
- Each page has a unique path and can contain multiple content zones
- Pages support workflow states (published, unpublished, approved, etc.)
- Page operations support both immediate return and batch processing
- Page templates define the layout and content zones available
- Pages can be organized in a hierarchical structure with parent-child relationships
### Function List
- [getPage](#getpage) - Retrieves a specific page by ID
- [getPageByPath](#getpagebypath) - Retrieves a page by its URL path
- [getPageHistory](#getpagehistory) - Retrieves version history for a page
- [getPageComments](#getpagecomments) - Retrieves comments for a page
- [getPageList](#getpagelist) - Retrieves list of pages with filtering
- [getPageListByPageTemplateID](#getpagelistbypagetemplateid) - Retrieves pages using specific template
- [getPageListByPage](#getpagelistbypage) - Retrieves pages with pagination
- [getPageListByPageAndPageTemplateID](#getpagelistbypageandpagetemplateid) - Retrieves paginated pages by template
- [getPageTree](#getpagetree) - Retrieves complete page hierarchy
- [getPageTemplateList](#getpagetemplatelist) - Retrieves available page templates
- [getPageSecurity](#getpagesecurity) - Retrieves security settings for a page
- [getPageItemTemplateList](#getpageitemtemplatelist) - Retrieves page item templates
- [getPageContentZones](#getpagecontentzones) - Retrieves content zones for a page
- [savePage](#savepage) - Creates or updates a page
- [savePageSecurity](#savepagesecurity) - Updates page security settings
- [movePageItem](#movepageitem) - Moves a page item within the hierarchy
- [deletePage](#deletepage) - Deletes a page by ID
- [batchWorkflowPages](#batchworkflowpages) - Batch workflow operation on multiple pages
---
### getPage
Retrieves a specific page by its unique ID.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID to retrieve |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem` - Complete page object with content zones and metadata
**Usage Example:**
```typescript
const page = await apiClient.pageMethods.getPage(123, guid);
console.log('Page title:', page.title);
console.log('Page path:', page.path);
console.log('Page template:', page.templateName);
console.log('Last modified:', page.modifiedDate);
console.log('Content zones:', page.contentZones.length);
// Display content zones
page.contentZones.forEach(zone => {
console.log(`Zone: ${zone.name}`);
console.log(` Items: ${zone.items.length}`);
});
```
**Error Handling:**
- Throws `Exception` when page not found
### getPageByPath
Retrieves a page by its URL path.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `path` | `string` | Yes | The URL path of the page (e.g., '/about-us') |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem` - Page object matching the path
**Usage Example:**
```typescript
const page = await apiClient.pageMethods.getPageByPath('/about-us', guid);
if (page) {
console.log('Page found:', page.title);
console.log('Page ID:', page.pageID);
console.log('Template:', page.templateName);
} else {
console.log('Page not found at path');
}
// Validate page paths
const validatePath = async (path) => {
try {
const page = await apiClient.pageMethods.getPageByPath(path, guid);
return page !== null;
} catch (error) {
return false;
}
};
if (await validatePath('/blog')) {
console.log('Blog page exists');
}
```
**Error Handling:**
- Throws `Exception` when page not found or path invalid
### getPageHistory
Retrieves the version history for a specific page.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageHistory[]` - Array of historical versions
**Usage Example:**
```typescript
const history = await apiClient.pageMethods.getPageHistory(123, guid);
console.log(`Found ${history.length} historical versions`);
// Display version details
history.forEach((version, index) => {
console.log(`Version ${index + 1}:`);
console.log(` Date: ${version.modifiedDate}`);
console.log(` User: ${version.modifiedByUser}`);
console.log(` Action: ${version.action}`);
console.log(` Notes: ${version.notes}`);
});
// Get latest version
const latestVersion = history[0];
console.log('Latest change:', latestVersion.action);
```
**Error Handling:**
- Throws `Exception` when page not found
### getPageComments
Retrieves all comments for a specific page.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `ItemComments[]` - Array of page comments
**Usage Example:**
```typescript
const comments = await apiClient.pageMethods.getPageComments(123, guid);
console.log(`Found ${comments.length} comments`);
// Display comments
comments.forEach(comment => {
console.log(`${comment.userName} (${comment.date}):`);
console.log(` ${comment.comment}`);
console.log(` Status: ${comment.status}`);
});
```
**Error Handling:**
- Throws `Exception` when page not found
### getPageList
Retrieves a list of pages with optional filtering and sorting.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `listParams` | `ListParams` | Yes | Filtering and sorting parameters |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem[]` - Array of page items
**Usage Example:**
```typescript
// Get all pages
const allPages = await apiClient.pageMethods.getPageList({}, guid);
// Get pages with filtering
const params = {
filter: 'title contains "blog"',
sort: 'modifiedDate desc',
take: 10,
skip: 0
};
const filteredPages = await apiClient.pageMethods.getPageList(params, guid);
// Get recently modified pages
const recentPages = await apiClient.pageMethods.getPageList({
sort: 'modifiedDate desc',
take: 5
}, guid);
```
**Error Handling:**
- Throws `Exception` when retrieval fails
### getPageListByPageTemplateID
Retrieves pages that use a specific page template.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageTemplateID` | `number` | Yes | The page template ID |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem[]` - Array of pages using the template
**Usage Example:**
```typescript
const pages = await apiClient.pageMethods.getPageListByPageTemplateID(456, guid);
console.log(`Found ${pages.length} pages using this template`);
// Group by status
const pagesByStatus = pages.reduce((acc, page) => {
const status = page.state || 'draft';
if (!acc[status]) acc[status] = [];
acc[status].push(page);
return acc;
}, {});
console.log('Pages by status:', pagesByStatus);
```
**Error Handling:**
- Throws `Exception` when template not found
### getPageListByPage
Retrieves pages with pagination support.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageSize` | `number` | Yes | Number of pages per page |
| `pageNumber` | `number` | Yes | Page number (1-based) |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem[]` - Array of pages for the specified page
**Usage Example:**
```typescript
const pageSize = 20;
const pageNumber = 1;
const firstPage = await apiClient.pageMethods.getPageListByPage(
pageSize,
pageNumber,
guid
);
console.log(`Page ${pageNumber}: ${firstPage.length} pages`);
// Paginated processing
let currentPage = 1;
let hasMore = true;
while (hasMore) {
const pageItems = await apiClient.pageMethods.getPageListByPage(
pageSize,
currentPage,
guid
);
if (pageItems.length === 0) {
hasMore = false;
} else {
console.log(`Processing page ${currentPage} with ${pageItems.length} pages`);
// Process pages...
currentPage++;
}
}
```
**Error Handling:**
- Throws `Exception` when retrieval fails
### getPageListByPageAndPageTemplateID
Retrieves paginated pages filtered by template.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageTemplateID` | `number` | Yes | The page template ID |
| `pageSize` | `number` | Yes | Number of pages per page |
| `pageNumber` | `number` | Yes | Page number (1-based) |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem[]` - Array of pages for the specified page and template
**Usage Example:**
```typescript
const templatePages = await apiClient.pageMethods.getPageListByPageAndPageTemplateID(
456,
10,
1,
guid
);
console.log(`Template pages: ${templatePages.length}`);
```
**Error Handling:**
- Throws `Exception` when template not found
### getPageTree
Retrieves the complete page hierarchy as a tree structure.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem[]` - Hierarchical array of pages with parent-child relationships
**Usage Example:**
```typescript
const pageTree = await apiClient.pageMethods.getPageTree(guid);
console.log(`Root pages: ${pageTree.length}`);
// Display page hierarchy
const displayPageTree = (pages, level = 0) => {
pages.forEach(page => {
const indent = ' '.repeat(level);
console.log(`${indent}${page.title} (${page.path})`);
if (page.children && page.children.length > 0) {
displayPageTree(page.children, level + 1);
}
});
};
displayPageTree(pageTree);
// Find page by path in tree
const findPageInTree = (pages, targetPath) => {
for (const page of pages) {
if (page.path === targetPath) {
return page;
}
if (page.children) {
const found = findPageInTree(page.children, targetPath);
if (found) return found;
}
}
return null;
};
const aboutPage = findPageInTree(pageTree, '/about-us');
```
**Error Handling:**
- Throws `Exception` when retrieval fails
### getPageTemplateList
Retrieves all available page templates.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageTemplate[]` - Array of available page templates
**Usage Example:**
```typescript
const templates = await apiClient.pageMethods.getPageTemplateList(guid);
console.log(`Available templates: ${templates.length}`);
// Display template information
templates.forEach(template => {
console.log(`Template: ${template.name}`);
console.log(` Description: ${template.description}`);
console.log(` Content Zones: ${template.contentZones.length}`);
console.log(` Template File: ${template.templateFile}`);
});
// Create template dropdown options
const templateOptions = templates.map(template => ({
value: template.id,
label: template.name,
description: template.description
}));
```
**Error Handling:**
- Throws `Exception` when retrieval fails
### getPageSecurity
Retrieves security settings for a specific page.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageSecurity` - Page security configuration
**Usage Example:**
```typescript
const security = await apiClient.pageMethods.getPageSecurity(123, guid);
console.log('Page security settings:', security);
// Check if page is public
if (security.isPublic) {
console.log('Page is publicly accessible');
} else {
console.log('Page has restricted access');
console.log('Allowed roles:', security.allowedRoles);
}
```
**Error Handling:**
- Throws `Exception` when page not found
### getPageItemTemplateList
Retrieves available page item templates.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItemTemplate[]` - Array of page item templates
**Usage Example:**
```typescript
const itemTemplates = await apiClient.pageMethods.getPageItemTemplateList(guid);
console.log(`Available item templates: ${itemTemplates.length}`);
// Display template types
itemTemplates.forEach(template => {
console.log(`Template: ${template.name}`);
console.log(` Type: ${template.type}`);
console.log(` Description: ${template.description}`);
});
```
**Error Handling:**
- Throws `Exception` when retrieval fails
### getPageContentZones
Retrieves content zones for a specific page.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `ContentZone[]` - Array of content zones
**Usage Example:**
```typescript
const zones = await apiClient.pageMethods.getPageContentZones(123, guid);
console.log(`Page has ${zones.length} content zones`);
// Display zone information
zones.forEach(zone => {
console.log(`Zone: ${zone.name}`);
console.log(` Items: ${zone.items.length}`);
console.log(` Template: ${zone.templateName}`);
// Display zone items
zone.items.forEach(item => {
console.log(` Item: ${item.title} (${item.type})`);
});
});
```
**Error Handling:**
- Throws `Exception` when page not found
### savePage
Creates a new page or updates an existing one.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `page` | `PageItem` | Yes | Page object to save |
| `guid` | `string` | Yes | Current website GUID |
| `returnBatchId` | `boolean` | No | If `true`, returns batch ID immediately. If `false` (default), waits for completion |
**Returns:** `PageItem | number` - Saved page (if `returnBatchId` is false) or batch ID (if true)
**Usage Example:**
```typescript
// Create a new page
const newPage = {
title: 'New About Page',
path: '/about-us',
templateName: 'About Template',
parentPageID: null, // Root level page
menuText: 'About Us',
isVisible: true,
contentZones: [
{
name: 'MainContent',
items: [
{
type: 'content',
contentID: 456,
title: 'About Us Content'
}
]
}
]
};
const savedPage = await apiClient.pageMethods.savePage(newPage, guid);
console.log('Page created with ID:', savedPage.pageID);
// Update existing page
const existingPage = await apiClient.pageMethods.getPage(123, guid);
existingPage.title = 'Updated Page Title';
existingPage.menuText = 'Updated Menu';
const updatedPage = await apiClient.pageMethods.savePage(existingPage, guid);
// Save with batch processing
const batchId = await apiClient.pageMethods.savePage(newPage, guid, true);
console.log('Batch created with ID:', batchId);
```
**Error Handling:**
- Throws `Exception` when validation fails or save operation fails
### savePageSecurity
Updates security settings for a specific page.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID |
| `security` | `PageSecurity` | Yes | Security configuration to apply |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageSecurity` - Updated security configuration
**Usage Example:**
```typescript
// Make page public
const publicSecurity = {
isPublic: true,
allowedRoles: [],
requiresAuthentication: false
};
const updatedSecurity = await apiClient.pageMethods.savePageSecurity(
123,
publicSecurity,
guid
);
// Restrict page to specific roles
const restrictedSecurity = {
isPublic: false,
allowedRoles: ['Administrator', 'Editor'],
requiresAuthentication: true
};
await apiClient.pageMethods.savePageSecurity(123, restrictedSecurity, guid);
```
**Error Handling:**
- Throws `Exception` when page not found or security update fails
### movePageItem
Moves a page item within the page hierarchy.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID to move |
| `parentPageID` | `number` | Yes | The new parent page ID (0 for root level) |
| `sortOrder` | `number` | Yes | The sort order within the parent |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `PageItem` - Updated page object
**Usage Example:**
```typescript
// Move page to root level
const movedPage = await apiClient.pageMethods.movePageItem(123, 0, 1, guid);
// Move page under another page
const childPage = await apiClient.pageMethods.movePageItem(123, 456, 2, guid);
// Reorder pages
const reorderPages = async (parentID, pageIDs) => {
for (let i = 0; i < pageIDs.length; i++) {
await apiClient.pageMethods.movePageItem(
pageIDs[i],
parentID,
i + 1,
guid
);
}
};
```
**Error Handling:**
- Throws `Exception` when page not found or move operation fails
### deletePage
Deletes a page by its ID.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageID` | `number` | Yes | The page ID to delete |
| `guid` | `string` | Yes | Current website GUID |
**Returns:** `string` - Confirmation message of successful deletion
**Usage Example:**
```typescript
try {
const result = await apiClient.pageMethods.deletePage(123, guid);
console.log(result); // "Page deleted successfully"
} catch (error) {
if (error.message.includes('has children')) {
console.log('Cannot delete page: has child pages');
} else if (error.message.includes('referenced')) {
console.log('Cannot delete page: referenced by other content');
} else {
console.error('Failed to delete page:', error.message);
}
}
// Safe page deletion with checks
const safeDeletePage = async (pageID) => {
try {
const page = await apiClient.pageMethods.getPage(pageID, guid);
// Check if page has children
if (page.children && page.children.length > 0) {
console.log(`Cannot delete page "${page.title}": has child pages`);
return false;
}
// Perform deletion
await apiClient.pageMethods.deletePage(pageID, guid);
console.log('Page deleted successfully');
return true;
} catch (error) {
console.error('Failed to delete page:', error.message);
return false;
}
};
```
**Error Handling:**
- Throws `Exception` when page not found, has children, or deletion fails
**Note:** Pages cannot be deleted if they have child pages or are referenced by other content.
---
### batchWorkflowPages
Performs a batch workflow operation on multiple pages. Supports Publish, Unpublish, Approve, Decline, and RequestApproval operations.
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `pageIDs` | `number[]` | Yes | Array of page IDs to process |
| `guid` | `string` | Yes | Current website GUID |
| `locale` | `string` | Yes | The locale code |
| `operation` | `WorkflowOperationType` | Yes | The workflow operation (Publish, Unpublish, Approve, Decline, RequestApproval) |
| `returnBatchId` | `boolean` | No | If `true`, returns batch ID immediately without waiting |
**Returns:** `Promise<number[]>` - Array of page IDs that were processed
**Usage Example:**
```typescript
import { WorkflowOperationType } from '@agility/management-sdk';
// Publish multiple pages
const pageIDs = [201, 202, 203];
const publishedPageIDs = await client.pageMethods.batchWorkflowPages(
pageIDs,
'your-guid',
'en-us',
WorkflowOperationType.Publish
);
console.log('Published page IDs:', publishedPageIDs);
// Unpublish multiple pages
const unpublishedPageIDs = await client.pageMethods.batchWorkflowPages(
pageIDs,
'your-guid',
'en-us',
WorkflowOperationType.Unpublish
);
// Request approval for multiple pages
const approvalRequestedPageIDs = await client.pageMethods.batchWorkflowPages(
pageIDs,
'your-guid',
'en-us',
WorkflowOperationType.RequestApproval
);
// Approve multiple pages
const approvedPageIDs = await client.pageMethods.batchWorkflowPages(
pageIDs,
'your-guid',
'en-us',
WorkflowOperationType.Approve
);
// Decline multiple pages
const declinedPageIDs = await client.pageMethods.batchWorkflowPages(
pageIDs,
'your-guid',
'en-us',
WorkflowOperationType.Decline
);
```
**Error Handling:**
- Throws `Exception` when batch operation fails
---
## Navigation
- [← Back to Main Documentation](../README.md)
- [Authentication & Setup](./auth.md)
- [AssetMethods](./asset-methods.md)
- [BatchMethods](./batch-methods.md)
- [ContainerMethods](./container-methods.md)
- [ContentMethods](./content-methods.md)
- [InstanceMethods](./instance-methods.md)
- [InstanceUserMethods](./instance-user-methods.md)
- [ModelMethods](./model-methods.md)
- [ServerUserMethods](./server-user-methods.md)
- [WebhookMethods](./webhook-methods.md)
- [Multi-Instance Operations](./multi-instance-operations.md)