From 9d6b9d10ef8cbef39e89bc709285abffb0d8caa1 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 19 Feb 2021 09:50:13 +0100 Subject: Fix video comments display with deleted comments --- server/models/utils.ts | 2 +- server/models/video/video-comment.ts | 60 +++++++++++++++++++++++------------- 2 files changed, 39 insertions(+), 23 deletions(-) (limited to 'server/models') diff --git a/server/models/utils.ts b/server/models/utils.ts index 143c1a23c..5337ae75d 100644 --- a/server/models/utils.ts +++ b/server/models/utils.ts @@ -134,7 +134,7 @@ function buildBlockedAccountSQL (blockerIds: number[]) { const blockerIdsString = blockerIds.join(', ') return 'SELECT "targetAccountId" AS "id" FROM "accountBlocklist" WHERE "accountId" IN (' + blockerIdsString + ')' + - ' UNION ALL ' + + ' UNION ' + 'SELECT "account"."id" AS "id" FROM account INNER JOIN "actor" ON account."actorId" = actor.id ' + 'INNER JOIN "serverBlocklist" ON "actor"."serverId" = "serverBlocklist"."targetServerId" ' + 'WHERE "serverBlocklist"."accountId" IN (' + blockerIdsString + ')' diff --git a/server/models/video/video-comment.ts b/server/models/video/video-comment.ts index 8d1c38826..cfd1d5b7a 100644 --- a/server/models/video/video-comment.ts +++ b/server/models/video/video-comment.ts @@ -414,7 +414,15 @@ export class VideoCommentModel extends Model { const blockerAccountIds = await VideoCommentModel.buildBlockerAccountIds({ videoId, user, isVideoOwned }) - const query = { + const accountBlockedWhere = { + accountId: { + [Op.notIn]: Sequelize.literal( + '(' + buildBlockedAccountSQL(blockerAccountIds) + ')' + ) + } + } + + const queryList = { offset: start, limit: count, order: getCommentSort(sort), @@ -428,13 +436,7 @@ export class VideoCommentModel extends Model { }, { [Op.or]: [ - { - accountId: { - [Op.notIn]: Sequelize.literal( - '(' + buildBlockedAccountSQL(blockerAccountIds) + ')' - ) - } - }, + accountBlockedWhere, { accountId: null } @@ -444,19 +446,27 @@ export class VideoCommentModel extends Model { } } - const scopes: (string | ScopeOptions)[] = [ + const scopesList: (string | ScopeOptions)[] = [ ScopeNames.WITH_ACCOUNT_FOR_API, { method: [ ScopeNames.ATTRIBUTES_FOR_API, blockerAccountIds ] } ] - return VideoCommentModel - .scope(scopes) - .findAndCountAll(query) - .then(({ rows, count }) => { - return { total: count, data: rows } - }) + const queryCount = { + where: { + videoId, + deletedAt: null, + ...accountBlockedWhere + } + } + + return Promise.all([ + VideoCommentModel.scope(scopesList).findAndCountAll(queryList), + VideoCommentModel.count(queryCount) + ]).then(([ { rows, count }, totalNotDeletedComments ]) => { + return { total: count, data: rows, totalNotDeletedComments } + }) } static async listThreadCommentsForApi (parameters: { @@ -477,11 +487,18 @@ export class VideoCommentModel extends Model { { id: threadId }, { originCommentId: threadId } ], - accountId: { - [Op.notIn]: Sequelize.literal( - '(' + buildBlockedAccountSQL(blockerAccountIds) + ')' - ) - } + [Op.or]: [ + { + accountId: { + [Op.notIn]: Sequelize.literal( + '(' + buildBlockedAccountSQL(blockerAccountIds) + ')' + ) + } + }, + { + accountId: null + } + ] } } @@ -492,8 +509,7 @@ export class VideoCommentModel extends Model { } ] - return VideoCommentModel - .scope(scopes) + return VideoCommentModel.scope(scopes) .findAndCountAll(query) .then(({ rows, count }) => { return { total: count, data: rows } -- cgit v1.2.3