Files
NodeBB/src/categories/delete.js

89 lines
2.7 KiB
JavaScript
Raw Normal View History

'use strict';
2016-06-08 10:46:33 +03:00
var async = require('async');
var db = require('../database');
var batch = require('../batch');
var plugins = require('../plugins');
var topics = require('../topics');
var groups = require('../groups');
2016-08-27 01:52:08 +03:00
var privileges = require('../privileges');
var cache = require('../cache');
module.exports = function (Categories) {
2019-07-16 00:41:42 -04:00
Categories.purge = async function (cid, uid) {
2021-02-03 23:59:08 -07:00
await batch.processSortedSet(`cid:${cid}:tids`, async function (tids) {
2019-07-16 00:41:42 -04:00
await async.eachLimit(tids, 10, async function (tid) {
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);
2019-07-16 00:41:42 -04:00
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 });
2019-07-16 00:41:42 -04:00
};
async function purgeCategory(categoryData) {
const cid = categoryData.cid;
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`,
`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
]);
2021-02-03 23:59:08 -07:00
await groups.destroy(privileges.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 = [];
const childrenKeys = children.map(function (cid) {
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
};