@foxpage/foxpage-manager
Version:
foxpage resource manager
144 lines (143 loc) • 4.33 kB
JavaScript
;
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;