UNPKG

dc-management-sdk-js

Version:
85 lines 6.14 kB
import { JsonTree } from '../../utils/JsonTree'; import { ContentLink } from '../models/ContentLink'; /** * Utility to assist parsing and generating Content Item graphs. */ export class ContentGraph { /** * Extract content-link references from the body of a Content Item * @param content * @returns {IContentLink[]} */ static extractLinks(content) { const result = new Array(); JsonTree.visit(content, (value) => { if (ContentLink.isContentLink(value)) { result.push(value); } }); return result; } /** * Utility to help deeply copy a content graph. Each content item and its dependencies * are visited using the contentItemProvider function to load the source item. The * contentItemPicker is invoked for every Content Item giving your application an opportunity * to either save the item to a new location (copy) or return the original (reference). * * The JSON body provided to the contentItemPicker function will have had any Content Links * remapped to the newly saved Content Item. * * ```typescript * const targetRepository = await client.contentRepositories.get('5b32377b4cedfd01c4503691'); * const contentIds = ['a87fd535-fb25-44ee-b687-0db72bbab721']; * * const idMap = await ContentGraph.deepCopy( * contentIds, * client.contentItems.get, * function(item:ContentItem, body:any) { * return targetRepository.related.contentItems.create(new ContentItem({ * label: item.label, * body: body * })); * } * ); * ``` * * @param ids Ids of the root content items to copy * @param contentItemProvider Function that loads content items by id * @param contentItemPicker Function that creates or returns an existing content item that should be used in place of the original * @returns {Promise<any>} Mapping of old content item ids to the newly created ids */ static async deepCopy(ids, contentItemProvider, contentItemPicker) { const cache = {}; const mapping = {}; const processItem = (id) => { if (cache[id]) { return cache[id]; } else { return (cache[id] = contentItemProvider(id) .then((item) => { // visit children const links = ContentGraph.extractLinks(item.body); return Promise.all(links.map((link) => processItem(link.id))).then(() => item); }) .then((item) => { // Rewrite the body so that linked items point to the id of the copy const body = JSON.parse(JSON.stringify(item.body)); const links = ContentGraph.extractLinks(body); for (const link of links) { link.id = mapping[link.id]; } // Let the application choose how to copy the item const newItem = contentItemPicker(item, body); newItem.then((newItemValue) => { mapping[item.id] = newItemValue.id; }); return newItem; })); } }; await Promise.all(ids.map((id) => processItem(id))); return mapping; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udGVudEdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb250ZW50L3NlcnZpY2VzL0NvbnRlbnRHcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBdUIsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RTs7R0FFRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBQ3ZCOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQVk7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQXVCLENBQUM7UUFDaEQsUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNyQyxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUE0QixDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTZCRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUMxQixHQUFhLEVBQ2IsbUJBQXlELEVBQ3pELGlCQUd5QjtRQUV6QixNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxPQUFPLEdBQVEsRUFBRSxDQUFDO1FBRXhCLE1BQU0sV0FBVyxHQUFHLENBQUMsRUFBVSxFQUF3QixFQUFFO1lBQ3ZELElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsRUFBRSxDQUFDO3FCQUN4QyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDYixpQkFBaUI7b0JBQ2pCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNuRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNoRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQ1gsQ0FBQztnQkFDSixDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ2Isb0VBQW9FO29CQUNwRSxNQUFNLElBQUksR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3hELE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDN0IsQ0FBQztvQkFFRCxrREFBa0Q7b0JBQ2xELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDOUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO3dCQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUM7b0JBQ3JDLENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sT0FBTyxDQUFDO2dCQUNqQixDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRiJ9