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.
nodebb/src/topics/delete.js

147 lines
4.3 KiB
JavaScript

'use strict';
var async = require('async');
var db = require('../database');
var user = require('../user');
var posts = require('../posts');
const categories = require('../categories');
var plugins = require('../plugins');
var batch = require('../batch');
module.exports = function (Topics) {
Topics.delete = async function (tid, uid) {
await Promise.all([
Topics.setTopicFields(tid, {
deleted: 1,
deleterUid: uid,
deletedTimestamp: Date.now(),
}),
removeTopicPidsFromCid(tid),
]);
};
async function removeTopicPidsFromCid(tid) {
const [cid, pids] = await Promise.all([
Topics.getTopicField(tid, 'cid'),
Topics.getPids(tid),
]);
await db.sortedSetRemove('cid:' + cid + ':pids', pids);
await categories.updateRecentTidForCid(cid);
}
async function addTopicPidsToCid(tid) {
const [cid, pids] = await Promise.all([
Topics.getTopicField(tid, 'cid'),
Topics.getPids(tid),
]);
let postData = await posts.getPostsFields(pids, ['pid', 'timestamp', 'deleted']);
postData = postData.filter(post => post && !post.deleted);
var pidsToAdd = [];
var scores = [];
postData.forEach(function (post) {
pidsToAdd.push(post.pid);
scores.push(post.timestamp);
});
await db.sortedSetAdd('cid:' + cid + ':pids', scores, pidsToAdd);
await categories.updateRecentTidForCid(cid);
}
Topics.restore = async function (tid) {
await Topics.deleteTopicFields(tid, [
'deleterUid', 'deletedTimestamp',
]);
await Promise.all([
Topics.setTopicField(tid, 'deleted', 0),
addTopicPidsToCid(tid),
]);
};
Topics.purgePostsAndTopic = async function (tid, uid) {
const mainPid = await Topics.getTopicField(tid, 'mainPid');
await batch.processSortedSet('tid:' + tid + ':posts', function (pids, next) {
async.eachSeries(pids, function (pid, next) {
posts.purge(pid, uid, next);
}, next);
}, { alwaysStartAt: 0 });
await posts.purge(mainPid, uid);
await Topics.purge(tid, uid);
};
Topics.purge = async function (tid, uid) {
const [deletedTopic, tags] = await Promise.all([
Topics.getTopicData(tid),
Topics.getTopicTags(tid),
]);
if (!deletedTopic) {
return;
}
deletedTopic.tags = tags;
await deleteFromFollowersIgnorers(tid);
await Promise.all([
db.deleteAll([
'tid:' + tid + ':followers',
'tid:' + tid + ':ignorers',
'tid:' + tid + ':posts',
'tid:' + tid + ':posts:votes',
'tid:' + tid + ':bookmarks',
'tid:' + tid + ':posters',
]),
db.sortedSetsRemove([
'topics:tid',
'topics:recent',
'topics:posts',
'topics:views',
'topics:votes',
], tid),
deleteTopicFromCategoryAndUser(tid),
Topics.deleteTopicTags(tid),
reduceCounters(tid),
]);
plugins.fireHook('action:topic.purge', { topic: deletedTopic, uid: uid });
await db.delete('topic:' + tid);
};
async function deleteFromFollowersIgnorers(tid) {
const [followers, ignorers] = await Promise.all([
db.getSetMembers('tid:' + tid + ':followers'),
db.getSetMembers('tid:' + tid + ':ignorers'),
]);
const followerKeys = followers.map(uid => 'uid:' + uid + ':followed_tids');
const ignorerKeys = ignorers.map(uid => 'uid:' + uid + 'ignored_tids');
await db.sortedSetsRemove(followerKeys.concat(ignorerKeys), tid);
}
async function deleteTopicFromCategoryAndUser(tid) {
const topicData = await Topics.getTopicFields(tid, ['cid', 'uid']);
await Promise.all([
db.sortedSetsRemove([
'cid:' + topicData.cid + ':tids',
'cid:' + topicData.cid + ':tids:pinned',
'cid:' + topicData.cid + ':tids:posts',
'cid:' + topicData.cid + ':tids:lastposttime',
'cid:' + topicData.cid + ':tids:votes',
'cid:' + topicData.cid + ':recent_tids',
'cid:' + topicData.cid + ':uid:' + topicData.uid + ':tids',
'uid:' + topicData.uid + ':topics',
], tid),
user.decrementUserFieldBy(topicData.uid, 'topiccount', 1),
]);
await categories.updateRecentTidForCid(topicData.cid);
}
async function reduceCounters(tid) {
var incr = -1;
await db.incrObjectFieldBy('global', 'topicCount', incr);
const topicData = await Topics.getTopicFields(tid, ['cid', 'postcount']);
var postCountChange = incr * topicData.postcount;
await Promise.all([
db.incrObjectFieldBy('global', 'postCount', postCountChange),
db.incrObjectFieldBy('category:' + topicData.cid, 'post_count', postCountChange),
db.incrObjectFieldBy('category:' + topicData.cid, 'topic_count', incr),
]);
}
};