diff --git a/src/posts/delete.js b/src/posts/delete.js index dddb33e6a9..ba637ccff5 100644 --- a/src/posts/delete.js +++ b/src/posts/delete.js @@ -197,20 +197,15 @@ module.exports = function (Posts) { } async function deleteFromReplies(postData) { - const arrayOfReplyPids = await db.getSortedSetsMembers(postData.map(p => `pid:${p.pid}:replies`)); - const allReplyPids = _.flatten(arrayOfReplyPids); - const promises = [ - db.deleteObjectFields( - allReplyPids.map(pid => `post:${pid}`), ['toPid'] - ), - db.deleteAll(postData.map(p => `pid:${p.pid}:replies`)), - ]; + // Any replies to deleted posts will retain toPid reference (gh#13527) + await db.deleteAll(postData.map(p => `pid:${p.pid}:replies`)); + // Remove post(s) from parents' replies zsets const postsWithParents = postData.filter(p => parseInt(p.toPid, 10)); const bulkRemove = postsWithParents.map(p => [`pid:${p.toPid}:replies`, p.pid]); - promises.push(db.sortedSetRemoveBulk(bulkRemove)); - await Promise.all(promises); + await db.sortedSetRemoveBulk(bulkRemove); + // Recalculate reply count const parentPids = _.uniq(postsWithParents.map(p => p.toPid)); const counts = await db.sortedSetsCard(parentPids.map(pid => `pid:${pid}:replies`)); await db.setObjectBulk(parentPids.map((pid, index) => [`post:${pid}`, { replies: counts[index] }])); diff --git a/src/topics/posts.js b/src/topics/posts.js index 8201bcad02..41b819d219 100644 --- a/src/topics/posts.js +++ b/src/topics/posts.js @@ -184,6 +184,9 @@ module.exports = function (Topics) { .filter(p => p && p.hasOwnProperty('toPid') && (activitypub.helpers.isUri(p.toPid) || utils.isNumber(p.toPid))) .map(postObj => postObj.toPid); + const exists = await posts.exists(parentPids); + parentPids = parentPids.filter((_, idx) => exists[idx]); + if (!parentPids.length) { return; }