From 00be053e948f0db210ba23527aa0ae594540418c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Tue, 18 Jul 2023 12:38:17 -0400 Subject: [PATCH] fix: topic postercount field if owner is changed also fix when posts are purged --- src/posts/delete.js | 10 ++++++++++ src/posts/user.js | 3 +++ test/posts.js | 4 +++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/posts/delete.js b/src/posts/delete.js index fb285b5128..66c8269334 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -116,7 +116,9 @@ module.exports = function (Posts) { const topicPostCountTasks = []; const topicTasks = []; const zsetIncrBulk = []; + const tids = []; for (const [tid, posts] of Object.entries(postsByTopic)) { + tids.push(tid); incrObjectBulk.push([`topic:${tid}`, { postcount: -posts.length }]); if (posts.length && posts[0]) { const topicData = posts[0].topic; @@ -142,6 +144,14 @@ module.exports = function (Posts) { user.updatePostCount(_.uniq(postData.map(p => p.uid))), notifications.rescind(...postData.map(p => `new_post:tid:${p.tid}:pid:${p.pid}:uid:${p.uid}`)), ]); + const tidPosterZsets = tids.map(tid => `tid:${tid}:posters`); + await db.sortedSetsRemoveRangeByScore(tidPosterZsets, '-inf', 0); + const posterCounts = await db.sortedSetsCard(tidPosterZsets); + await db.setObjectBulk( + tids.map((tid, idx) => ( + [`topic:${tid}`, { postercount: posterCounts[idx] || 0 }] + )) + ); } async function deleteFromCategoryRecentPosts(postData) { diff --git a/src/posts/user.js b/src/posts/user.js index 960e4960a6..4d9ab4d21e 100644 --- a/src/posts/user.js +++ b/src/posts/user.js @@ -206,6 +206,9 @@ module.exports = function (Posts) { await async.eachOf(postsByUser, async (posts, uid) => { await db.sortedSetIncrBy(`tid:${tid}:posters`, -posts.length, uid); }); + await db.sortedSetsRemoveRangeByScore([`tid:${tid}:posters`], '-inf', 0); + const posterCount = await db.sortedSetCard(`tid:${tid}:posters`); + await topics.setTopicField(tid, 'postercount', posterCount); }); } diff --git a/test/posts.js b/test/posts.js index 866fc3b529..ef4069ec81 100644 --- a/test/posts.js +++ b/test/posts.js @@ -114,7 +114,7 @@ describe('Post\'s', () => { await posts.changeOwner([pid1, pid2], newUid); - assert.deepStrictEqual(await db.sortedSetScores(`tid:${postResult.topicData.tid}:posters`, [oldUid, newUid]), [0, 2]); + assert.deepStrictEqual(await db.sortedSetScores(`tid:${postResult.topicData.tid}:posters`, [oldUid, newUid]), [null, 2]); assert.deepStrictEqual(await posts.isOwner([pid1, pid2], oldUid), [false, false]); assert.deepStrictEqual(await posts.isOwner([pid1, pid2], newUid), [true, true]); @@ -130,6 +130,8 @@ describe('Post\'s', () => { assert.strictEqual(await topics.isOwner(postResult.topicData.tid, oldUid), false); assert.strictEqual(await topics.isOwner(postResult.topicData.tid, newUid), true); + + assert.strictEqual(await topics.getTopicField(postResult.topicData.tid, 'postercount'), 1); }); it('should fail to change owner if new owner does not exist', async () => {