1
0
Fork 0
mirror of https://github.com/codex-team/codex.docs.git synced 2025-08-10 07:55:24 +02:00

Renamed flatArray model to pagesFlatArray, updated descriptions, renamed generate to regenerate, removed hardcoded key name in cache

This commit is contained in:
slaveeks 2022-07-28 18:05:10 +03:00
parent c895f4d9fe
commit bb2113cab9
5 changed files with 65 additions and 45 deletions

View file

@ -3,7 +3,7 @@ import Alias from '../models/alias';
import PagesOrder from './pagesOrder'; import PagesOrder from './pagesOrder';
import PageOrder from '../models/pageOrder'; import PageOrder from '../models/pageOrder';
import HttpException from '../exceptions/httpException'; import HttpException from '../exceptions/httpException';
import flatArray from '../models/flatArray'; import PagesFlatArray from '../models/pagesFlatArray';
type PageDataFields = keyof PageData; type PageDataFields = keyof PageData;
@ -196,7 +196,7 @@ class Pages {
pagesAvailable[index] = null; pagesAvailable[index] = null;
pagesAvailable = Pages.removeChildren(pagesAvailable, item._id); pagesAvailable = Pages.removeChildren(pagesAvailable, item._id);
}); });
flatArray.generate(); PagesFlatArray.regenerate();
return pagesAvailable; return pagesAvailable;
} }
@ -223,7 +223,7 @@ class Pages {
alias.save(); alias.save();
} }
await flatArray.generate(); await PagesFlatArray.regenerate();
return insertedPage; return insertedPage;
} catch (e) { } catch (e) {
@ -267,7 +267,7 @@ class Pages {
Alias.markAsDeprecated(previousUri); Alias.markAsDeprecated(previousUri);
} }
} }
await flatArray.generate(); await PagesFlatArray.regenerate();
return updatedPage; return updatedPage;
} }
@ -291,7 +291,7 @@ class Pages {
await alias.destroy(); await alias.destroy();
} }
const removedPage = page.destroy(); const removedPage = page.destroy();
await flatArray.generate(); await PagesFlatArray.regenerate();
return removedPage; return removedPage;
} }

View file

@ -1,6 +1,6 @@
import PageOrder from '../models/pageOrder'; import PageOrder from '../models/pageOrder';
import Page from '../models/page'; import Page from '../models/page';
import flatArray from '../models/flatArray'; import PagesFlatArray from '../models/pagesFlatArray';
/** /**
* @class PagesOrder * @class PagesOrder
@ -63,7 +63,7 @@ class PagesOrder {
order.push(childId); order.push(childId);
await order.save(); await order.save();
await flatArray.generate(); await PagesFlatArray.regenerate();
} }
/** /**
@ -78,13 +78,13 @@ class PagesOrder {
oldParentOrder.remove(targetPageId); oldParentOrder.remove(targetPageId);
await oldParentOrder.save(); await oldParentOrder.save();
await flatArray.generate(); await PagesFlatArray.regenerate();
const newParentOrder = await PageOrder.get(newParentId); const newParentOrder = await PageOrder.get(newParentId);
newParentOrder.push(targetPageId); newParentOrder.push(targetPageId);
await newParentOrder.save(); await newParentOrder.save();
await flatArray.generate(); await PagesFlatArray.regenerate();
} }
/** /**
@ -129,7 +129,7 @@ class PagesOrder {
pageOrder.order = Array.from(new Set([...pageOrder.order, ...unordered])); pageOrder.order = Array.from(new Set([...pageOrder.order, ...unordered]));
pageOrder.putAbove(currentPageId, putAbovePageId); pageOrder.putAbove(currentPageId, putAbovePageId);
await pageOrder.save(); await pageOrder.save();
await flatArray.generate(); await PagesFlatArray.regenerate();
} }
/** /**
@ -144,7 +144,7 @@ class PagesOrder {
} }
await order.destroy(); await order.destroy();
await flatArray.generate(); await PagesFlatArray.regenerate();
} }
} }

View file

@ -5,56 +5,76 @@ import NodeCache from 'node-cache';
// Create cache for flat array // Create cache for flat array
const cache = new NodeCache({ stdTTL: 120 }); const cache = new NodeCache({ stdTTL: 120 });
const cacheKey = 'pagesFlatArray';
/** /**
* @typedef {object} FlatArrayData * Element for pagesFlatArray
* @property {string} id - page id
* @property {string} parentId - page parent id
* @property {string} rootId - page root id
* @property {number} level - page level in sidebar
* @property {string} title - page title
* @property {string} uri - page uri
*/ */
export interface FlatArrayData { export interface PagesFlatArrayData {
/**
* Page id
*/
id?: string; id?: string;
/**
* Page parent id
*/
parentId?: string; parentId?: string;
/**
* id of parent with parent id '0'
*/
rootId?: string; rootId?: string;
/**
* Page level in sidebar view
*/
level?: number; level?: number;
/**
* Page title
*/
title?: string; title?: string;
/**
* Page uri
*/
uri?: string; uri?: string;
} }
/** /**
* @class FlatArray * @class PagesFlatArray
* @class FlatArray model * @class PagesFlatArray model - flat array of pages, which are ordered like in sidebar
*/ */
class FlatArray { class PagesFlatArray {
/** /**
* Returns pages flat array * Returns pages flat array
* *
* @returns {Promise<Array<FlatArrayData>>} * @returns {Promise<Array<PagesFlatArrayData>>}
*/ */
public static async get(): Promise<Array<FlatArrayData>> { public static async get(): Promise<Array<PagesFlatArrayData>> {
// Get flat array from cache // Get flat array from cache
let arr = cache.get('flatArray') as Array<FlatArrayData>; let arr = cache.get(cacheKey) as Array<PagesFlatArrayData>;
// Check is flat array consists in cache // Check is flat array consists in cache
if (!arr) { if (!arr) {
arr = await this.generate(); arr = await this.regenerate();
} }
return arr; return arr;
} }
/** /**
* Generates flat array, saves it to cache, returns it * Generates new flat array, saves it to cache, returns it
* Calls, when there is no pages flat array data in cache or when page or pageOrder data updates
* *
* @returns {Promise<Array<FlatArrayData>>} * @returns {Promise<Array<PagesFlatArrayData>>}
*/ */
public static async generate(): Promise<Array<FlatArrayData>> { public static async regenerate(): Promise<Array<PagesFlatArrayData>> {
const pages = await Page.getAll(); const pages = await Page.getAll();
const pagesOrders = await PageOrder.getAll(); const pagesOrders = await PageOrder.getAll();
let arr = new Array<FlatArrayData>(); let arr = new Array<PagesFlatArrayData>();
// Get root order // Get root order
const rootOrder = pagesOrders.find( order => order.page == '0' ); const rootOrder = pagesOrders.find( order => order.page == '0' );
@ -70,7 +90,7 @@ class FlatArray {
} }
// Save generated flat array to cache // Save generated flat array to cache
cache.set('flatArray', arr); cache.set(cacheKey, arr);
return arr; return arr;
} }
@ -79,9 +99,9 @@ class FlatArray {
* Returns previous page * Returns previous page
* *
* @param pageId - page id * @param pageId - page id
* @returns {Promise<FlatArrayData | undefined>} * @returns {Promise<PagesFlatArrayData | undefined>}
*/ */
public static async getPageBefore(pageId: string): Promise<FlatArrayData | undefined> { public static async getPageBefore(pageId: string): Promise<PagesFlatArrayData | undefined> {
const arr = await this.get(); const arr = await this.get();
const pageIndex = arr.findIndex( (item) => item.id == pageId); const pageIndex = arr.findIndex( (item) => item.id == pageId);
@ -99,9 +119,9 @@ class FlatArray {
* Returns next page * Returns next page
* *
* @param pageId - page id * @param pageId - page id
* @returns {Promise<FlatArrayData | undefined>} * @returns {Promise<PagesFlatArrayData | undefined>}
*/ */
public static async getPageAfter(pageId: string): Promise<FlatArrayData | undefined> { public static async getPageAfter(pageId: string): Promise<PagesFlatArrayData | undefined> {
const arr = await this.get(); const arr = await this.get();
const pageIndex = arr.findIndex( (item) => item.id == pageId ); const pageIndex = arr.findIndex( (item) => item.id == pageId );
@ -122,11 +142,11 @@ class FlatArray {
* @param level - page level in sidebar * @param level - page level in sidebar
* @param pages - all pages * @param pages - all pages
* @param orders - all page orders * @param orders - all page orders
* @returns {Promise<Array<FlatArrayData>>} * @returns {Promise<Array<PagesFlatArrayData>>}
*/ */
private static getChildrenFlatArray(pageId: string, level: number, private static getChildrenFlatArray(pageId: string, level: number,
pages: Array<Page>, orders: Array<PageOrder>): Array<FlatArrayData> { pages: Array<Page>, orders: Array<PageOrder>): Array<PagesFlatArrayData> {
let arr: Array<FlatArrayData> = new Array<FlatArrayData>(); let arr: Array<PagesFlatArrayData> = new Array<PagesFlatArrayData>();
const page = pages.find( item => item._id == pageId ); const page = pages.find( item => item._id == pageId );
@ -155,4 +175,4 @@ class FlatArray {
} }
} }
export default FlatArray; export default PagesFlatArray;

View file

@ -3,7 +3,7 @@ import Aliases from '../controllers/aliases';
import Pages from '../controllers/pages'; import Pages from '../controllers/pages';
import Alias from '../models/alias'; import Alias from '../models/alias';
import verifyToken from './middlewares/token'; import verifyToken from './middlewares/token';
import FlatArray from '../models/flatArray'; import PagesFlatArray from '../models/pagesFlatArray';
const router = express.Router(); const router = express.Router();
@ -33,8 +33,8 @@ router.get('*', verifyToken, async (req: Request, res: Response) => {
const pageParent = await page.getParent(); const pageParent = await page.getParent();
const previousPage = await FlatArray.getPageBefore(alias.id); const previousPage = await PagesFlatArray.getPageBefore(alias.id);
const nextPage = await FlatArray.getPageAfter(alias.id); const nextPage = await PagesFlatArray.getPageAfter(alias.id);
res.render('pages/page', { res.render('pages/page', {
page, page,

View file

@ -3,7 +3,7 @@ import Pages from '../controllers/pages';
import PagesOrder from '../controllers/pagesOrder'; import PagesOrder from '../controllers/pagesOrder';
import verifyToken from './middlewares/token'; import verifyToken from './middlewares/token';
import allowEdit from './middlewares/locals'; import allowEdit from './middlewares/locals';
import FlatArray from '../models/flatArray'; import PagesFlatArray from '../models/pagesFlatArray';
const router = express.Router(); const router = express.Router();
@ -63,8 +63,8 @@ router.get('/page/:id', verifyToken, async (req: Request, res: Response, next: N
const pageParent = await page.parent; const pageParent = await page.parent;
const previousPage = await FlatArray.getPageBefore(pageId); const previousPage = await PagesFlatArray.getPageBefore(pageId);
const nextPage = await FlatArray.getPageAfter(pageId); const nextPage = await PagesFlatArray.getPageAfter(pageId);
res.render('pages/page', { res.render('pages/page', {
page, page,