From ec34075bc50d9c8eb274c42f18c07e86a880f5ae Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Mon, 18 Feb 2019 21:51:21 +0300 Subject: [PATCH] remove migration and order is optional --- src/controllers/pagesOrder.js | 15 ++++++++---- src/routes/api/pages.js | 5 ++-- src/routes/middlewares/pages.js | 9 +++---- src/utils/database/pagesOrder.js | 41 -------------------------------- 4 files changed, 19 insertions(+), 51 deletions(-) diff --git a/src/controllers/pagesOrder.js b/src/controllers/pagesOrder.js index 1068bbf..e36b139 100644 --- a/src/controllers/pagesOrder.js +++ b/src/controllers/pagesOrder.js @@ -74,10 +74,14 @@ class PagesOrder { * @return {Page[]} */ static async getOrderedChildren(pages, currentPageId, parentPageId, ignoreSelf = false) { - const children = await PagesOrder.get(parentPageId); - const result = []; + const children = await Model.get(parentPageId); + const unordered = pages.filter(page => page._parent === parentPageId).map(page => page._id); - children.order.forEach(pageId => { + // Create unique array with ordered and unordered pages id + const ordered = [...new Set([...children.order, ...unordered])]; + + const result = []; + ordered.forEach(pageId => { pages.forEach(page => { if (page._id === pageId && (pageId !== currentPageId || !ignoreSelf)) { result.push(page); @@ -89,13 +93,16 @@ class PagesOrder { } /** + * @param {string[]} unordered * @param {string} currentPageId - page's id that changes the order * @param {string} parentPageId - parent page's id that contains both two pages * @param {string} putAbovePageId - page's id above which we put the target page */ - static async update(currentPageId, parentPageId, putAbovePageId) { + static async update(unordered, currentPageId, parentPageId, putAbovePageId) { const pageOrder = await Model.get(parentPageId); + // Create unique array with ordered and unordered pages id + pageOrder.order = [...new Set([...pageOrder.order, ...unordered])]; pageOrder.putAbove(currentPageId, putAbovePageId); await pageOrder.save(); } diff --git a/src/routes/api/pages.js b/src/routes/api/pages.js index b082bb0..294e01b 100644 --- a/src/routes/api/pages.js +++ b/src/routes/api/pages.js @@ -3,7 +3,6 @@ const router = express.Router(); const multer = require('multer')(); const Pages = require('../../controllers/pages'); const PagesOrder = require('../../controllers/pagesOrder'); -const Aliases = require("../../controllers/aliases"); /** * GET /page/:id * @@ -81,13 +80,15 @@ router.post('/page/:id', multer.any(), async (req, res) => { try { const {title, body, parent, putAbovePageId, uri} = req.body; + const pages = await Pages.getAll(); let page = await Pages.get(id); if (page._parent !== parent) { await PagesOrder.move(page._parent, parent, id); } else { if (putAbovePageId && putAbovePageId !== '0') { - await PagesOrder.update(page._id, page._parent, putAbovePageId); + const unordered = pages.filter( _page => _page._parent === page._parent).map(_page => _page._id); + await PagesOrder.update(unordered, page._id, page._parent, putAbovePageId); } } diff --git a/src/routes/middlewares/pages.js b/src/routes/middlewares/pages.js index 2321671..2ea9205 100644 --- a/src/routes/middlewares/pages.js +++ b/src/routes/middlewares/pages.js @@ -21,15 +21,16 @@ function createMenuTree(parentPageId, pages, pagesOrder, level = 1, currentLevel * if we got some children order on parents tree, then we push found pages in order sequence * otherwise just find all pages includes parent tree */ - let branch = []; + let ordered = []; if (childrenOrder) { - branch = childrenOrder.order.map( pageId => { + ordered = childrenOrder.order.map( pageId => { return pages.find( page => page._id === pageId); }); - } else { - branch = pages.filter( page => page._parent === parentPageId); } + const unordered = pages.filter( page => page._parent === parentPageId); + const branch = [...new Set([...ordered, ...unordered])]; + /** * stop recursion when we got the passed max level */ diff --git a/src/utils/database/pagesOrder.js b/src/utils/database/pagesOrder.js index f86c1f1..eecc776 100644 --- a/src/utils/database/pagesOrder.js +++ b/src/utils/database/pagesOrder.js @@ -2,46 +2,5 @@ const Datastore = require('nedb'); const config = require('../../../config'); const db = new Datastore({filename: `./${config.database}/pagesOrder.db`, autoload: true}); -/** - * Current DataStore preparation - * Add initial row for RootPage - */ -(async function() { - const parentIdOfRootPages = '0'; - const cbk = (resolve, reject) => (err, doc) => { - if (err) { - reject(err); - } - - resolve(doc); - }; - - const order = await new Promise((resolve, reject) => { - db.findOne({page: parentIdOfRootPages}, cbk(resolve, reject)); - }); - - if (!order) { - const Pages = require('../../controllers/pages'); - - // Converter - const pages = await Pages.getAll(); - - async function convert(pages, parentId) { - const children = pages.filter(page => page._parent === parentId); - const initialData = { - page: parentId, - order: children.map(page => page._id) - }; - await db.insert(initialData); - - children.forEach(async page => { - await convert(pages, page._id); - }); - } - - await convert(pages, parentIdOfRootPages); } - -}()); - module.exports = db;