diff --git a/src/categories/create.js b/src/categories/create.js index 40e434bbe8..403c492215 100644 --- a/src/categories/create.js +++ b/src/categories/create.js @@ -95,11 +95,9 @@ module.exports = function (Categories) { await privileges.categories.give(result.modPrivileges, category.cid, ['administrators', 'Global Moderators']); await privileges.categories.give(result.guestPrivileges, category.cid, ['guests', 'spiders']); - cache.del([ - 'categories:cid', - `cid:${parentCid}:children`, - `cid:${parentCid}:children:all`, - ]); + cache.del('categories:cid'); + await clearParentCategoryCache(parentCid); + if (data.cloneFromCid && parseInt(data.cloneFromCid, 10)) { category = await Categories.copySettingsFrom(data.cloneFromCid, category.cid, !data.parentCid); } @@ -112,6 +110,22 @@ module.exports = function (Categories) { return category; }; + async function clearParentCategoryCache(parentCid) { + while (parseInt(parentCid, 10) >= 0) { + cache.del([ + `cid:${parentCid}:children`, + `cid:${parentCid}:children:all`, + ]); + + if (parseInt(parentCid, 10) === 0) { + return; + } + // clear all the way to root + // eslint-disable-next-line no-await-in-loop + parentCid = await Categories.getCategoryField(parentCid, 'parentCid'); + } + } + async function duplicateCategoriesChildren(parentCid, cid, uid) { let children = await Categories.getChildren([cid], uid); if (!children.length) {