From dbfc594e66c4dbe70be7e5e1e9adc860d6e67091 Mon Sep 17 00:00:00 2001 From: cabad11 <44175180+cabad11@users.noreply.github.com> Date: Mon, 14 Jan 2019 17:53:10 +0300 Subject: [PATCH] Don't allow to set child element as parent. (#19) * filter available pages * refactor set function as method of Pages * change wrong word * change commentaries * change method name * refactor refactor * Update src/controllers/pages.js Co-Authored-By: cabad11 <44175180+cabad11@users.noreply.github.com> * refactor change comments change metod name --- src/controllers/pages.js | 32 ++++++++++++++++++++++++++++++++ src/routes/pages.js | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/controllers/pages.js b/src/controllers/pages.js index c321929..696f682 100644 --- a/src/controllers/pages.js +++ b/src/controllers/pages.js @@ -41,6 +41,38 @@ class Pages { return Model.getAll(); } + /** + * @static + * Return all pages without children of passed page + * + * @param {string} parent - id of current page + * @returns {Promise} + */ + static async getAllExceptChildrens(parent) { + let pagesAvailable = this.removeChildren(await Pages.getAll(), parent); + + return pagesAvailable.filter((item) => item !== null); + } + + /** + * @static + * Set all children elements to null + * + * @param {Page[]} [pagesAvailable] - Array of all pages + * @param {string} parent - id of parent page + * @returns {Array} + */ + static removeChildren(pagesAvailable, parent) { + pagesAvailable.forEach(async (item, index) => { + if (item === null || item._parent !== parent) { + return; + } + pagesAvailable[index] = null; + pagesAvailable = Pages.removeChildren(pagesAvailable, item._id); + }); + return pagesAvailable; + } + /** * Create new page model and save it in the database * diff --git a/src/routes/pages.js b/src/routes/pages.js index 62a788c..51cd120 100644 --- a/src/routes/pages.js +++ b/src/routes/pages.js @@ -22,7 +22,7 @@ router.get('/page/edit/:id', async (req, res, next) => { try { let page = await Pages.get(pageId); - let pagesAvailable = await Pages.getAll(); + let pagesAvailable = await Pages.getAllExceptChildrens(pageId); res.render('pages/form', { pagesAvailable,