From f16e984f1c2de4b278f6a98404dccffcd42f2a3a Mon Sep 17 00:00:00 2001 From: Murod Khaydarov Date: Tue, 15 Jan 2019 16:21:29 +0300 Subject: [PATCH] requested changes. Code improvements --- .../{pagesChildrenOrder.js => pagesOrder.js} | 55 +++++--- src/models/pageChildrenOrder.js | 115 --------------- src/models/pageOrder.js | 132 ++++++++++++++++++ src/routes/api/pages.js | 8 +- src/routes/middlewares/pages.js | 4 +- src/routes/pages.js | 4 +- src/utils/database/index.js | 4 +- .../{pagesChildrenOrder.js => pagesOrder.js} | 2 +- 8 files changed, 176 insertions(+), 148 deletions(-) rename src/controllers/{pagesChildrenOrder.js => pagesOrder.js} (50%) delete mode 100644 src/models/pageChildrenOrder.js create mode 100644 src/models/pageOrder.js rename src/utils/database/{pagesChildrenOrder.js => pagesOrder.js} (50%) diff --git a/src/controllers/pagesChildrenOrder.js b/src/controllers/pagesOrder.js similarity index 50% rename from src/controllers/pagesChildrenOrder.js rename to src/controllers/pagesOrder.js index d78b899..a05595a 100644 --- a/src/controllers/pagesChildrenOrder.js +++ b/src/controllers/pagesOrder.js @@ -1,12 +1,17 @@ -const Model = require('../models/pageChildrenOrder'); +const Model = require('../models/pageOrder'); /** - * @class PagesChildrenOrder - * @classdesc PagesChildrenOrder controller + * @class PagesOrder + * @classdesc PagesOrder controller + * + * Manipulates with Pages: changes the order, deletes, updates and so on... */ -class PagesChildrenOrder { +class PagesOrder { /** - * @param parentId + * Returns Page's order + * + * @param {string} parentId - of which page we want to get children order + * @returns {Promise} */ static async get(parentId) { const order = await Model.get(parentId); @@ -19,46 +24,53 @@ class PagesChildrenOrder { } /** - * @param parentId - * @param childId - * @return {Promise} + * Pushes the child page to the parent's order list + * + * @param {string} parentId - parent page's id + * @param {string} childId - new page pushed to the order */ static async push(parentId, childId) { const order = await Model.get(parentId); - order.pushChild(childId); + order.push(childId); await order.save(); } /** * Move one page to another Page's order + * + * @param {string} oldParentId - old parent page's id + * @param {string} newParentId - new parent page's id + * @param {string} childId - page's id which is changing the parent page */ static async renew(oldParentId, newParentId, childId) { const oldParentOrder = await Model.get(oldParentId); - oldParentOrder.removeChild(childId); + oldParentOrder.remove(childId); oldParentOrder.save(); const newParentOrder = await Model.get(newParentId); - newParentOrder.pushChild(childId); + newParentOrder.push(childId); await newParentOrder.save(); } /** - * @param pages - * @param currentPageId - * @param parentPageId - * @param ignoreSelf + * Returns new array with ordered pages + * + * @param {Array} pages - list of all available pages + * @param {string} currentPageId - page's id around which we are ordering + * @param {string} parentPageId - parent page's id that contains page above + * @param {Boolean} ignoreSelf - should we ignore current page in list or not * @return Array */ static async getOrderedChildren(pages, currentPageId, parentPageId, ignoreSelf = false) { - const children = await PagesChildrenOrder.get(parentPageId); + const children = await PagesOrder.get(parentPageId); const result = []; children.order.forEach(pageId => { pages.forEach(page => { - if (page._id === pageId && pageId !== currentPageId) { + if (page._id === pageId && (pageId !== currentPageId || !ignoreSelf)) { result.push(page); } }); @@ -68,10 +80,9 @@ class PagesChildrenOrder { } /** - * @param currentPageId - * @param parentPageId - * @param putAbovePageId - * @return {Promise} + * @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) { const children = await Model.get(parentPageId); @@ -93,4 +104,4 @@ class PagesChildrenOrder { } } -module.exports = PagesChildrenOrder; +module.exports = PagesOrder; diff --git a/src/models/pageChildrenOrder.js b/src/models/pageChildrenOrder.js deleted file mode 100644 index 2c36392..0000000 --- a/src/models/pageChildrenOrder.js +++ /dev/null @@ -1,115 +0,0 @@ -const {pagesChildrenOrder: db} = require('../utils/database/index'); - -/** - * PagesChildrenOrder - */ -class PageChildrenOrder { - /** - * Returns current Page's children order - * - * @param pageId - */ - static async get(pageId) { - const childrenOrder = await db.findOne({pageId}); - - let data = {}; - - if (!childrenOrder) { - data.pageId = pageId; - } else { - data = childrenOrder; - } - - return new PageChildrenOrder(data); - } - - /** - * @param data - */ - constructor(data) { - if (data === null) { - data = {}; - } - - if (data._id) { - this._id = data._id; - } - - this.data = data; - } - - /** - * constructor data setter - * @param pagesChildrenOrderData - */ - set data(pagesChildrenOrderData) { - this._pageId = pagesChildrenOrderData.pageId || 0; - this._childrenOrder = pagesChildrenOrderData.childrenOrder || []; - } - - /** - * Return Page Children order - */ - get data() { - return { - _id: this._id, - pageId: '' + this._pageId, - childrenOrder: this._childrenOrder - }; - } - - /** - * Pushes to the orders array - * @param pageChild - */ - pushChild(pageChild) { - this._childrenOrder.push(pageChild); - } - - /** - * Removes child - * @param pageChild - */ - removeChild(pageChild) { - const found = this._childrenOrder.indexOf(pageChild); - - if (found >= 0) { - this._childrenOrder.splice(found, 1); - } - } - - /** - * @return {Array} - */ - get order() { - return this._childrenOrder; - } - - /** - * Save or update page data in the database - */ - async save() { - if (!this._id) { - const insertedRow = await db.insert(this.data); - - this._id = insertedRow._id; - } else { - await db.update({_id: this._id}, this.data); - } - - return this; - } - - /** - * Remove page data from the database - */ - async destroy() { - await db.remove({_id: this._id}); - - delete this._id; - - return this; - } -} - -module.exports = PageChildrenOrder; diff --git a/src/models/pageOrder.js b/src/models/pageOrder.js new file mode 100644 index 0000000..ea311d4 --- /dev/null +++ b/src/models/pageOrder.js @@ -0,0 +1,132 @@ +const {pagesOrder: db} = require('../utils/database/index'); + +/** + * @typedef {Object} PageOrderData + * @property {string} _id - row unique id + * @property {string} page - page id + * @property {Array} order - list of ordered pages + */ + +/** + * @class PageOrder + * @classdesc PageOrder + * + * Creates order for Pages with children + */ +class PageOrder { + /** + * Returns current Page's children order + * + * @param page + */ + static async get(page) { + const order = await db.findOne({page}); + + let data = {}; + + if (!order) { + data.page = page; + } else { + data = order; + } + + return new PageOrder(data); + } + + /** + * @constructor + * + * @param {PageOrderData} data + */ + constructor(data) { + if (data === null) { + data = {}; + } + + if (data._id) { + this._id = data._id; + } + + this.data = data; + } + + /** + * constructor data setter + * @param {PageOrderData} pageOrderData + */ + set data(pageOrderData) { + this._page = pageOrderData.page || 0; + this._order = pageOrderData.order || []; + } + + /** + * Return Page Children order + * @returns {PageOrderData} + */ + get data() { + return { + _id: this._id, + page: '' + this._page, + order: this._order + }; + } + + /** + * Pushes page id to the orders array + * + * @param {string} pageId + */ + push(pageId) { + this._order.push(pageId); + } + + /** + * Removes page id from orders array + * + * @param {string} pageId + */ + remove(pageId) { + const found = this._order.indexOf(pageId); + + if (found >= 0) { + this._order.splice(found, 1); + } + } + + /** + * Returns ordered list + * + * @return {Array} + */ + get order() { + return this._order; + } + + /** + * Save or update page data in the database + */ + async save() { + if (!this._id) { + const insertedRow = await db.insert(this.data); + + this._id = insertedRow._id; + } else { + await db.update({_id: this._id}, this.data); + } + + return this; + } + + /** + * Remove page data from the database + */ + async destroy() { + await db.remove({_id: this._id}); + + delete this._id; + + return this; + } +} + +module.exports = PageOrder; diff --git a/src/routes/api/pages.js b/src/routes/api/pages.js index 0040a76..8f918eb 100644 --- a/src/routes/api/pages.js +++ b/src/routes/api/pages.js @@ -2,7 +2,7 @@ const express = require('express'); const router = express.Router(); const multer = require('multer')(); const Pages = require('../../controllers/pages'); -const PagesChildrenOrder = require('../../controllers/pagesChildrenOrder'); +const PagesOrder = require('../../controllers/pagesOrder'); /** * GET /page/:id @@ -57,7 +57,7 @@ router.put('/page', multer.any(), async (req, res) => { const page = await Pages.insert({title, body, parent}); /** push to the orders array */ - await PagesChildrenOrder.push(parent, page._id); + await PagesOrder.push(parent, page._id); res.json({ success: true, @@ -84,9 +84,9 @@ router.post('/page/:id', multer.any(), async (req, res) => { let page = await Pages.get(id); if (page._parent !== parent) { - await PagesChildrenOrder.renew(page._parent, parent, id); + await PagesOrder.renew(page._parent, parent, id); } else { - await PagesChildrenOrder.update(page._id, page._parent, putAbovePageId); + await PagesOrder.update(page._id, page._parent, putAbovePageId); } page = await Pages.update(id, {title, body, parent}); diff --git a/src/routes/middlewares/pages.js b/src/routes/middlewares/pages.js index 55a2b0d..72370b5 100644 --- a/src/routes/middlewares/pages.js +++ b/src/routes/middlewares/pages.js @@ -1,5 +1,5 @@ const Pages = require('../../controllers/pages'); -const PagesChildrenOrder = require('../../controllers/pagesChildrenOrder'); +const pagesOrder = require('../../controllers/pagesOrder'); const asyncMiddleware = require('../../utils/asyncMiddleware'); /** @@ -11,7 +11,7 @@ async function createMenuTree(pages) { return Promise.all(pages.filter(page => page._parent === '0').map(async page => { const childrenOrdered = []; try { - const children = await PagesChildrenOrder.get(page._id); + const children = await pagesOrder.get(page._id); children.order.forEach(pageId => { pages.forEach(_page => { if (_page._id === pageId) { diff --git a/src/routes/pages.js b/src/routes/pages.js index 77f2f0c..da7f28c 100644 --- a/src/routes/pages.js +++ b/src/routes/pages.js @@ -1,7 +1,7 @@ const express = require('express'); const router = express.Router(); const Pages = require('../controllers/pages'); -const PagesChildrenOrder = require('../controllers/pagesChildrenOrder'); +const PagesOrder = require('../controllers/pagesOrder'); /** * Create new page form @@ -24,7 +24,7 @@ router.get('/page/edit/:id', async (req, res, next) => { try { const page = await Pages.get(pageId); const pagesAvailable = await Pages.getAll(); - const parentsChildrenOrdered = await PagesChildrenOrder.getOrderedChildren(pagesAvailable, pageId, page._parent, true); + const parentsChildrenOrdered = await PagesOrder.getOrderedChildren(pagesAvailable, pageId, page._parent, true); res.render('pages/form', { page, diff --git a/src/utils/database/index.js b/src/utils/database/index.js index 7bc37ef..8813724 100644 --- a/src/utils/database/index.js +++ b/src/utils/database/index.js @@ -1,5 +1,5 @@ const pages = require('./pages'); -const pagesChildrenOrder = require('./pagesChildrenOrder'); +const pagesOrder = require('./pagesOrder'); /** * @class Database @@ -144,5 +144,5 @@ class Database { module.exports = { class: Database, pages: new Database(pages), - pagesChildrenOrder: new Database(pagesChildrenOrder) + pagesOrder: new Database(pagesOrder) }; diff --git a/src/utils/database/pagesChildrenOrder.js b/src/utils/database/pagesOrder.js similarity index 50% rename from src/utils/database/pagesChildrenOrder.js rename to src/utils/database/pagesOrder.js index 0e080de..8b382c5 100644 --- a/src/utils/database/pagesChildrenOrder.js +++ b/src/utils/database/pagesOrder.js @@ -1,6 +1,6 @@ const Datastore = require('nedb'); const config = require('../../../config'); -const db = new Datastore({filename: `./${config.database}/pagesChildrenOrder.db`, autoload: true}); +const db = new Datastore({filename: `./${config.database}/pagesOrder.db`, autoload: true}); module.exports = db;