diff --git a/src/controllers/aliases.js b/src/controllers/aliases.js index dbabca9..e1f3a1f 100644 --- a/src/controllers/aliases.js +++ b/src/controllers/aliases.js @@ -21,6 +21,14 @@ class Aliases { return alias; } + + /** + * @param id + * @returns {Promise} + */ + static async removeById(id) { + return Alias.destroyByEntityId(id); + } } module.exports = Aliases; diff --git a/src/controllers/pagesOrder.js b/src/controllers/pagesOrder.js index 12493b9..2a55e17 100644 --- a/src/controllers/pagesOrder.js +++ b/src/controllers/pagesOrder.js @@ -90,6 +90,20 @@ class PagesOrder { pageOrder.putAbove(currentPageId, putAbovePageId); await pageOrder.save(); } + + /** + * @param parentId + * @returns {Promise} + */ + static async remove(parentId) { + const order = await Model.get(parentId); + + if (!order._id) { + throw new Error('Page with given id does not contain order'); + } + + return order.destroy(); + } } module.exports = PagesOrder; diff --git a/src/models/alias.js b/src/models/alias.js index fac0296..64dc0ff 100644 --- a/src/models/alias.js +++ b/src/models/alias.js @@ -47,6 +47,18 @@ class Alias { return new Alias(data); } + /** + * @param {string} id + * @returns {Promise} + */ + static async destroyByEntityId(id) { + await aliasesDb.remove({id}); + + delete this._id; + + return this; + } + /** * @constructor * diff --git a/src/models/pageOrder.js b/src/models/pageOrder.js index 3d27792..91aaefa 100644 --- a/src/models/pageOrder.js +++ b/src/models/pageOrder.js @@ -18,6 +18,7 @@ class PageOrder { * Returns current Page's children order * * @param {string} pageId - page's id + * @returns {PageOrder} */ static async get(pageId) { const order = await db.findOne({page: pageId}); diff --git a/src/routes/api/pages.js b/src/routes/api/pages.js index 2e87179..87b686f 100644 --- a/src/routes/api/pages.js +++ b/src/routes/api/pages.js @@ -3,7 +3,7 @@ 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 * @@ -126,15 +126,39 @@ router.delete('/page/:id', async (req, res) => { responsePage = page._parent !== "0" ? await Pages.get(page._parent) : null; } - // remove current page and return previous from order + // remove current page and go deeper to remove children with orders + async function deleteRecursively(startFrom) { + let order = []; + try { + const children = await PagesOrder.get(startFrom); + order = children.order; + } catch (e) {} + + order.forEach(async id => { + await deleteRecursively(id); + }); + + try { + await Pages.remove(startFrom); + await PagesOrder.remove(startFrom); + await Aliases.removeById(startFrom); + } catch (e) {} + + } + + await deleteRecursively(req.params.id); + + // remove also from parent's order parentPageOrder.remove(req.params.id); - await [Pages.remove(req.params.id), parentPageOrder.save()]; + await Aliases.removeById(req.params.id); + await parentPageOrder.save(); res.json({ success: true, result: responsePage }); } catch (err) { + console.log(err); res.status(400).json({ success: false, error: err.message diff --git a/test/models/page.js b/test/models/page.js index c81c9b4..6c99f3c 100644 --- a/test/models/page.js +++ b/test/models/page.js @@ -352,4 +352,31 @@ describe('Page model', () => { expect(page.title).to.equal(pageData.body.blocks[0].data.text); }); + + it('test deletion', async () => { + + const pages = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; + const orders = { + '0' : ['1', '2', '3'], + '1' : ['4', '5'], + '5' : ['6', '7', '8'], + '3' : ['9'] + }; + + function deleteRecursively(startFrom) { + const order = orders[startFrom]; + if (!order) { + const found = pages.indexOf(startFrom); + pages.splice(found, 1); + return; + } + + order.forEach(id => { + deleteRecursively(id); + }); + + const found = pages.indexOf(startFrom); + pages.splice(found, 1); + } + }); });