fix: #12652, incorrect user, post, topic counters with AP enabled

This commit is contained in:
Julian Lam
2024-06-25 12:36:11 -04:00
parent ef97a784cf
commit fe70a2b8b5
5 changed files with 30 additions and 5 deletions

View File

@@ -10,6 +10,7 @@ const notifications = require('../notifications');
const plugins = require('../plugins'); const plugins = require('../plugins');
const flags = require('../flags'); const flags = require('../flags');
const activitypub = require('../activitypub'); const activitypub = require('../activitypub');
const utils = require('../utils');
module.exports = function (Posts) { module.exports = function (Posts) {
Posts.delete = async function (pid, uid) { Posts.delete = async function (pid, uid) {
@@ -108,7 +109,8 @@ module.exports = function (Posts) {
}); });
await db.sortedSetRemoveBulk(bulkRemove); await db.sortedSetRemoveBulk(bulkRemove);
const incrObjectBulk = [['global', { postCount: -postData.length }]]; const localCount = postData.filter(p => utils.isNumber(p.pid)).length;
const incrObjectBulk = [['global', { postCount: -localCount }]];
const postsByCategory = _.groupBy(postData, p => parseInt(p.cid, 10)); const postsByCategory = _.groupBy(postData, p => parseInt(p.cid, 10));
for (const [cid, posts] of Object.entries(postsByCategory)) { for (const [cid, posts] of Object.entries(postsByCategory)) {

View File

@@ -67,7 +67,7 @@ module.exports = function (Topics) {
db.sortedSetsAdd(countedSortedSetKeys, 0, topicData.tid), db.sortedSetsAdd(countedSortedSetKeys, 0, topicData.tid),
user.addTopicIdToUser(topicData.uid, topicData.tid, timestamp), user.addTopicIdToUser(topicData.uid, topicData.tid, timestamp),
db.incrObjectField(`category:${topicData.cid}`, 'topic_count'), db.incrObjectField(`category:${topicData.cid}`, 'topic_count'),
db.incrObjectField('global', 'topicCount'), utils.isNumber(tid) ? db.incrObjectField('global', 'topicCount') : null,
Topics.createTags(data.tags, topicData.tid, timestamp), Topics.createTags(data.tags, topicData.tid, timestamp),
scheduled ? Promise.resolve() : categories.updateRecentTid(topicData.cid, topicData.tid), scheduled ? Promise.resolve() : categories.updateRecentTid(topicData.cid, topicData.tid),
]); ]);

View File

@@ -8,7 +8,7 @@ const categories = require('../categories');
const flags = require('../flags'); const flags = require('../flags');
const plugins = require('../plugins'); const plugins = require('../plugins');
const batch = require('../batch'); const batch = require('../batch');
const utils = require('../utils');
module.exports = function (Topics) { module.exports = function (Topics) {
Topics.delete = async function (tid, uid) { Topics.delete = async function (tid, uid) {
@@ -140,7 +140,9 @@ module.exports = function (Topics) {
async function reduceCounters(tid) { async function reduceCounters(tid) {
const incr = -1; const incr = -1;
await db.incrObjectFieldBy('global', 'topicCount', incr); if (utils.isNumber(tid)) {
await db.incrObjectFieldBy('global', 'topicCount', incr);
}
const topicData = await Topics.getTopicFields(tid, ['cid', 'postcount']); const topicData = await Topics.getTopicFields(tid, ['cid', 'postcount']);
const postCountChange = incr * topicData.postcount; const postCountChange = incr * topicData.postcount;
await Promise.all([ await Promise.all([

View File

@@ -0,0 +1,21 @@
'use strict';
const db = require('../../database');
const meta = require('../../meta');
module.exports = {
name: 'Fix global counts for users and posts due to faulty AP logic',
timestamp: Date.UTC(2024, 5, 25),
method: async () => {
if (!meta.config.activitypubEnabled) {
return;
}
const counts = await db.sortedSetsCard(['users:joindate', 'posts:pid', 'topics:tid']);
await db.setObject('global', {
userCount: counts[0],
postCount: counts[1],
topicCount: counts[2],
});
},
};

View File

@@ -142,7 +142,7 @@ module.exports = function (User) {
await Promise.all([ await Promise.all([
db.sortedSetRemoveBulk(bulkRemove), db.sortedSetRemoveBulk(bulkRemove),
db.decrObjectField('global', 'userCount'), utils.isNumber(uid) ? db.decrObjectField('global', 'userCount') : null,
db.deleteAll(keys), db.deleteAll(keys),
db.setRemove('invitation:uids', uid), db.setRemove('invitation:uids', uid),
deleteUserIps(uid), deleteUserIps(uid),