Files
NodeBB/src/categories/delete.js
Barış Soner Uşaklı 47299ea587 Categories refactor (#9257)
* feat: wip categories pagination

* feat: add subCategoriesPerPage setting

* feat: add load more sub categories button to category page

* fix: openapi spec

* feat: show sub categories left on category page

hide button when no more categories left

* breaking: rename categories to allCategories on /search

categories contains the search results

* fix: spec

* refactor: remove cidsPerPage

* fix: tests

* feat: use component for subcategories

* fix: prevent negative subCategoriesLeft

* feat: new category filter/search WIP

* feat: remove categories from /tag

* fix: dont load all categories when showing move modal

* feat: allow adding custom categories to list

* breaking: dont load entire category tree on post queue

removed unused code
add hooks to filter/selector
add options to filter/selector

* feat: make selector modal work again

* feat: replace old search module

* fix: topic move selector

* feat: dont load all categories on create category modal

* fix: fix more categorySelectors

* feat: dont load entire category tree on group details page

* feat: dont load all categories on home page and user settings page

* feat: add pagination to /user/:userslug/categories

* fix: update schemas

* fix: more tests

* fix: test

* feat: flags page, dont return entire category tree

* fix: flag test

* feat: categories manage page

dont load all categories
allow changing root category
clear caches properly

* fix: spec

* feat: admins&mods page

dont load all categories

* fix: spec

* fix: dont load all children when opening dropdown

* fix: on search results dont return all children

* refactor: pass all options, rename options.cids to options.selectedCids

* fix: #9266

* fix: index 0

* fix: spec

* feat: #9265, add setObjectBulk

* refactor: shoter updateOrder

* feat: selectors on categories/category

* fix: tests and search filter

* fix: category update test

* feat: pagination on acp categories page

show order in set order modal

* fix: allow drag&drop on pages > 1 in /admin/manage/categories

* fix: teasers for deep nested categories

fix sub category display on /category page

* fix: spec

* refactor: use eslint-disable-next-line

* refactor: shorter
2021-02-07 15:09:52 -05:00

89 lines
2.8 KiB
JavaScript

'use strict';
var async = require('async');
var db = require('../database');
var batch = require('../batch');
var plugins = require('../plugins');
var topics = require('../topics');
var groups = require('../groups');
var privileges = require('../privileges');
var cache = require('../cache');
module.exports = function (Categories) {
Categories.purge = async function (cid, uid) {
await batch.processSortedSet('cid:' + cid + ':tids', async function (tids) {
await async.eachLimit(tids, 10, async function (tid) {
await topics.purgePostsAndTopic(tid, uid);
});
}, { alwaysStartAt: 0 });
const pinnedTids = await db.getSortedSetRevRange('cid:' + cid + ':tids:pinned', 0, -1);
await async.eachLimit(pinnedTids, 10, async function (tid) {
await topics.purgePostsAndTopic(tid, uid);
});
const categoryData = await Categories.getCategoryData(cid);
await purgeCategory(categoryData);
plugins.hooks.fire('action:category.delete', { cid: cid, uid: uid, category: categoryData });
};
async function purgeCategory(categoryData) {
const cid = categoryData.cid;
await db.sortedSetRemoveBulk([
['categories:cid', cid],
['categories:name', categoryData.name.substr(0, 200).toLowerCase() + ':' + cid],
]);
await removeFromParent(cid);
await deleteTags(cid);
await db.deleteAll([
'cid:' + cid + ':tids',
'cid:' + cid + ':tids:pinned',
'cid:' + cid + ':tids:posts',
'cid:' + cid + ':tids:votes',
'cid:' + cid + ':tids:lastposttime',
'cid:' + cid + ':recent_tids',
'cid:' + cid + ':pids',
'cid:' + cid + ':read_by_uid',
'cid:' + cid + ':uid:watch:state',
'cid:' + cid + ':children',
'cid:' + cid + ':tag:whitelist',
'category:' + cid,
]);
await groups.destroy(privileges.privilegeList.map(privilege => 'cid:' + cid + ':privileges:' + privilege));
}
async function removeFromParent(cid) {
const [parentCid, children] = await Promise.all([
Categories.getCategoryField(cid, 'parentCid'),
db.getSortedSetRange('cid:' + cid + ':children', 0, -1),
]);
const bulkAdd = [];
const childrenKeys = children.map(function (cid) {
bulkAdd.push(['cid:0:children', cid, cid]);
return 'category:' + cid;
});
await Promise.all([
db.sortedSetRemove('cid:' + parentCid + ':children', cid),
db.setObjectField(childrenKeys, 'parentCid', 0),
db.sortedSetAddBulk(bulkAdd),
]);
cache.del([
'categories:cid',
'cid:0:children',
'cid:' + parentCid + ':children',
'cid:' + parentCid + ':children:all',
'cid:' + cid + ':children',
'cid:' + cid + ':children:all',
'cid:' + cid + ':tag:whitelist',
]);
}
async function deleteTags(cid) {
const tags = await db.getSortedSetMembers('cid:' + cid + ':tags');
await db.deleteAll(tags.map(tag => 'cid:' + cid + ':tag:' + tag + ':topics'));
await db.delete('cid:' + cid + ':tags');
}
};