You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.7 KiB
JavaScript
91 lines
2.7 KiB
JavaScript
'use strict';
|
|
|
|
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) {
|
|
Categories.purge = async function (cid, uid) {
|
|
await batch.processSortedSet(`cid:${cid}:tids`, async (tids) => {
|
|
await async.eachLimit(tids, 10, async (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 (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;
|
|
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:views`,
|
|
`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}`,
|
|
]);
|
|
const privilegeList = await privileges.categories.getPrivilegeList();
|
|
await groups.destroy(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((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`);
|
|
}
|
|
};
|