Files
NodeBB/src/categories/delete.js

91 lines
2.7 KiB
JavaScript
Raw Normal View History

'use strict';
2021-02-04 00:06:15 -07:00
const async = require('async');
const db = require('../database');
const batch = require('../batch');
const plugins = require('../plugins');
const topics = require('../topics');
const groups = require('../groups');
const privileges = require('../privileges');
const cache = require('../cache');
module.exports = function (Categories) {
2019-07-16 00:41:42 -04:00
Categories.purge = async function (cid, uid) {
2021-02-04 00:01:39 -07:00
await batch.processSortedSet(`cid:${cid}:tids`, async (tids) => {
await async.eachLimit(tids, 10, async (tid) => {
2019-07-16 00:41:42 -04:00
await topics.purgePostsAndTopic(tid, uid);
});
}, { alwaysStartAt: 0 });
2021-02-03 23:59:08 -07:00
const pinnedTids = await db.getSortedSetRevRange(`cid:${cid}:tids:pinned`, 0, -1);
2021-02-04 00:01:39 -07:00
await async.eachLimit(pinnedTids, 10, async (tid) => {
2019-07-16 00:41:42 -04:00
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 });
2019-07-16 00:41:42 -04:00
};
async function purgeCategory(categoryData) {
2021-02-06 14:10:15 -07:00
const { cid } = categoryData;
await db.sortedSetRemoveBulk([
['categories:cid', cid],
2021-02-03 23:59:08 -07:00
['categories:name', `${categoryData.name.substr(0, 200).toLowerCase()}:${cid}`],
]);
2019-07-16 00:41:42 -04:00
await removeFromParent(cid);
await deleteTags(cid);
2019-07-16 00:41:42 -04:00
await db.deleteAll([
2021-02-03 23:59:08 -07:00
`cid:${cid}:tids`,
`cid:${cid}:tids:pinned`,
`cid:${cid}:tids:posts`,
`cid:${cid}:tids:votes`,
2021-09-28 11:13:56 -04:00
`cid:${cid}:tids:views`,
2021-02-03 23:59:08 -07:00
`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}`,
2019-07-16 00:41:42 -04:00
]);
const privilegeList = await privileges.categories.getPrivilegeList();
await groups.destroy(privilegeList.map(privilege => `cid:${cid}:privileges:${privilege}`));
}
2019-07-16 00:41:42 -04:00
async function removeFromParent(cid) {
const [parentCid, children] = await Promise.all([
Categories.getCategoryField(cid, 'parentCid'),
2021-02-03 23:59:08 -07:00
db.getSortedSetRange(`cid:${cid}:children`, 0, -1),
2019-07-16 00:41:42 -04:00
]);
const bulkAdd = [];
2021-02-04 00:01:39 -07:00
const childrenKeys = children.map((cid) => {
2019-07-16 00:41:42 -04:00
bulkAdd.push(['cid:0:children', cid, cid]);
2021-02-03 23:59:08 -07:00
return `category:${cid}`;
});
2019-07-16 00:41:42 -04:00
await Promise.all([
2021-02-03 23:59:08 -07:00
db.sortedSetRemove(`cid:${parentCid}:children`, cid),
2019-07-16 00:41:42 -04:00
db.setObjectField(childrenKeys, 'parentCid', 0),
db.sortedSetAddBulk(bulkAdd),
]);
cache.del([
'categories:cid',
'cid:0:children',
2021-02-03 23:59:08 -07:00
`cid:${parentCid}:children`,
`cid:${parentCid}:children:all`,
`cid:${cid}:children`,
`cid:${cid}:children:all`,
`cid:${cid}:tag:whitelist`,
2019-07-16 00:41:42 -04:00
]);
}
async function deleteTags(cid) {
2021-02-03 23:59:08 -07:00
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`);
}
2017-02-18 02:30:48 -07:00
};