mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-02-25 16:11:19 +01:00
* 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
89 lines
2.8 KiB
JavaScript
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');
|
|
}
|
|
};
|