UNPKG

@foxpage/foxpage-manager

Version:

foxpage resource manager

144 lines (143 loc) 4.33 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PageManagerImpl = void 0; const lodash_1 = require("lodash"); const common_1 = require("../common"); const data_service_1 = require("../data-service"); const page_1 = require("./page"); const CHUNK_SIZE = 5; /** * page manager * * @export * @class PageManager */ class PageManagerImpl extends common_1.ManagerBaseImpl { constructor(app) { super(app, { type: 'page', diskCache: { enable: true } }); } /** * add page to manager * * @param {Page} page */ addPage(page) { this.logger.info(`add page@${page.id}`); this.logger.debug(`add page@${page.id}, detail:`, JSON.stringify(page)); const newPage = this.newPage(page); this.addOne(page.id, page, newPage); return newPage; } /** * remove page from manager * * @param {string[]} pageIds */ removePages(pageIds) { this.remove(pageIds); } /** * get page from local first * no exist will fetch from server * * @param {string} pageId * @return {*} {(Page | undefined)} */ async getPage(pageId) { return (await this.getPages([pageId]))[0]; } /** * get pages * * @param {string[]} pageIds * @return {*} {Promise<Page[]>} */ async getPages(pageIds) { return await this.find(pageIds); } /** * fetch draft pages * * @param {string[]} pageIds * @param {string} [locale] * @return {*} {Promise<ContentRelationInfo[]>} */ async getDraftPages(pageIds, locale) { return await data_service_1.foxpageDataService.fetchDraftPageInfos(this.appId, { contentIds: pageIds, locale }); } /** * fetch preview version pages * @param pageIds * @param version * @param locale * @return {*} {Promise<ContentRelationInfo>} */ async getPreviewPages(pageId, version, locale) { return await data_service_1.foxpageDataService.fetchPreviewPageInfos(this.appId, { contentId: pageId, version, locale }); } /** * fetch pages from server * * @return {*} {Promise<Page[]>} */ async freshPages(pageIds = []) { const chunks = (0, lodash_1.chunk)(pageIds, CHUNK_SIZE); let pages = []; const fetcher = async (list) => { for (const _pageIds of list) { const result = await data_service_1.foxpageDataService.fetchPages(this.appId, { pageIds: _pageIds }); pages = pages.concat(result); } }; await fetcher(chunks); // add & update return pages.map(page => { return this.addPage(page); }); } /** * first request page will return the all relations * * @protected * @param {string[]} pageIds */ async onFetch(pageIds) { // return await this.freshPages(list); const results = await data_service_1.foxpageDataService.fetchPageInfos(this.appId, { contentIds: pageIds }); this.logger.info('fetched content infos'); this.logger.debug('fetched content infos:', JSON.stringify(results)); return results.map(item => { // emit event: cache user request data this.emit('DATA_PUSH', item.relations); return this.addPage(item.content); }); } async onPull(data) { this.logger.info('get pull'); this.logger.debug('get pull, detail:', data); const { updates, removes } = data.page || {}; if (updates && updates.length > 0) { const contentIds = await this.filterExists(updates); if (contentIds.length > 0) { this.markNeedUpdates(contentIds); await this.freshPages(contentIds); } } if (removes && removes.length > 0) { this.removePages(removes); } } onStash(data) { var _a; (_a = data.pages) === null || _a === void 0 ? void 0 : _a.map(item => { this.addPage(item); }); } async createInstance(data) { return this.newPage(data); } newPage(data) { return new page_1.PageInstance(data); } } exports.PageManagerImpl = PageManagerImpl;