diff options
-rw-r--r-- | client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html | 2 | ||||
-rw-r--r-- | server/models/video/video-abuse.ts | 43 |
2 files changed, 36 insertions, 9 deletions
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html index 4afa2850b..2f6e12d1c 100644 --- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html +++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html | |||
@@ -149,7 +149,7 @@ | |||
149 | <span class="text-muted">{{ videoAbuse.video.channel.ownerAccount ? createByString(videoAbuse.video.channel.ownerAccount) : '' }}</span> | 149 | <span class="text-muted">{{ videoAbuse.video.channel.ownerAccount ? createByString(videoAbuse.video.channel.ownerAccount) : '' }}</span> |
150 | </div> | 150 | </div> |
151 | </div> | 151 | </div> |
152 | <a [routerLink]="[ '/admin/moderation/video-abuses/list' ]" [queryParams]="{ 'search': videoAbuse.video.channel.ownerAccount.displayName }" class="ml-auto text-muted video-details-links" *ngIf="!videoAbuse.video.deleted" i18n> | 152 | <a [routerLink]="[ '/admin/moderation/video-abuses/list' ]" [queryParams]="{ 'search': videoAbuse.video.channel.ownerAccount.displayName }" class="ml-auto text-muted video-details-links" i18n> |
153 | {videoAbuse.countReportsForReportee, plural, =1 {1 report} other {{{ videoAbuse.countReportsForReportee }} reports}}<span class="ml-1Â glyphicon glyphicon-flag"></span> | 153 | {videoAbuse.countReportsForReportee, plural, =1 {1 report} other {{{ videoAbuse.countReportsForReportee }} reports}}<span class="ml-1Â glyphicon glyphicon-flag"></span> |
154 | </a> | 154 | </a> |
155 | </span> | 155 | </span> |
diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts index 71b519cd9..285fb1fbc 100644 --- a/server/models/video/video-abuse.ts +++ b/server/models/video/video-abuse.ts | |||
@@ -15,7 +15,7 @@ import { VideoAbuseState, VideoDetails } from '../../../shared' | |||
15 | import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants' | 15 | import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants' |
16 | import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models' | 16 | import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models' |
17 | import * as Bluebird from 'bluebird' | 17 | import * as Bluebird from 'bluebird' |
18 | import { literal, Op, Sequelize } from 'sequelize' | 18 | import { literal, Op } from 'sequelize' |
19 | import { ThumbnailModel } from './thumbnail' | 19 | import { ThumbnailModel } from './thumbnail' |
20 | import { VideoBlacklistModel } from './video-blacklist' | 20 | import { VideoBlacklistModel } from './video-blacklist' |
21 | import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel' | 21 | import { ScopeNames as VideoChannelScopeNames, SummaryOptions, VideoChannelModel } from './video-channel' |
@@ -75,6 +75,7 @@ export enum ScopeNames { | |||
75 | attributes: { | 75 | attributes: { |
76 | include: [ | 76 | include: [ |
77 | [ | 77 | [ |
78 | // we don't care about this count for deleted videos, so there are not included | ||
78 | literal( | 79 | literal( |
79 | '(' + | 80 | '(' + |
80 | 'SELECT count(*) ' + | 81 | 'SELECT count(*) ' + |
@@ -85,6 +86,7 @@ export enum ScopeNames { | |||
85 | 'countReportsForVideo' | 86 | 'countReportsForVideo' |
86 | ], | 87 | ], |
87 | [ | 88 | [ |
89 | // we don't care about this count for deleted videos, so there are not included | ||
88 | literal( | 90 | literal( |
89 | '(' + | 91 | '(' + |
90 | 'SELECT t.nth ' + | 92 | 'SELECT t.nth ' + |
@@ -109,7 +111,17 @@ export enum ScopeNames { | |||
109 | 'WHERE "account"."id" = "VideoAbuseModel"."reporterAccountId" ' + | 111 | 'WHERE "account"."id" = "VideoAbuseModel"."reporterAccountId" ' + |
110 | ')' | 112 | ')' |
111 | ), | 113 | ), |
112 | 'countReportsForReporter' | 114 | 'countReportsForReporter__video' |
115 | ], | ||
116 | [ | ||
117 | literal( | ||
118 | '(' + | ||
119 | 'SELECT count(DISTINCT "videoAbuse"."id") ' + | ||
120 | 'FROM "videoAbuse" ' + | ||
121 | `WHERE CAST("deletedVideo"->'channel'->'ownerAccount'->>'id' AS INTEGER) = "VideoAbuseModel"."reporterAccountId" ` + | ||
122 | ')' | ||
123 | ), | ||
124 | 'countReportsForReporter__deletedVideo' | ||
113 | ], | 125 | ], |
114 | [ | 126 | [ |
115 | literal( | 127 | literal( |
@@ -118,10 +130,23 @@ export enum ScopeNames { | |||
118 | 'FROM "videoAbuse" ' + | 130 | 'FROM "videoAbuse" ' + |
119 | 'INNER JOIN "video" ON "video"."id" = "videoAbuse"."videoId" ' + | 131 | 'INNER JOIN "video" ON "video"."id" = "videoAbuse"."videoId" ' + |
120 | 'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' + | 132 | 'INNER JOIN "videoChannel" ON "videoChannel"."id" = "video"."channelId" ' + |
121 | 'INNER JOIN "account" ON "videoChannel"."accountId" = "Video->VideoChannel"."accountId" ' + | 133 | 'INNER JOIN "account" ON ' + |
134 | '"videoChannel"."accountId" = "Video->VideoChannel"."accountId" ' + | ||
135 | `OR "videoChannel"."accountId" = CAST("VideoAbuseModel"."deletedVideo"->'channel'->'ownerAccount'->>'id' AS INTEGER) ` + | ||
136 | ')' | ||
137 | ), | ||
138 | 'countReportsForReportee__video' | ||
139 | ], | ||
140 | [ | ||
141 | literal( | ||
142 | '(' + | ||
143 | 'SELECT count(DISTINCT "videoAbuse"."id") ' + | ||
144 | 'FROM "videoAbuse" ' + | ||
145 | `WHERE CAST("deletedVideo"->'channel'->'ownerAccount'->>'id' AS INTEGER) = "Video->VideoChannel"."accountId" ` + | ||
146 | `OR CAST("deletedVideo"->'channel'->'ownerAccount'->>'id' AS INTEGER) = CAST("VideoAbuseModel"."deletedVideo"->'channel'->'ownerAccount'->>'id' AS INTEGER) ` + | ||
122 | ')' | 147 | ')' |
123 | ), | 148 | ), |
124 | 'countReportsForReportee' | 149 | 'countReportsForReportee__deletedVideo' |
125 | ] | 150 | ] |
126 | ] | 151 | ] |
127 | }, | 152 | }, |
@@ -270,8 +295,10 @@ export class VideoAbuseModel extends Model<VideoAbuseModel> { | |||
270 | toFormattedJSON (this: MVideoAbuseFormattable): VideoAbuse { | 295 | toFormattedJSON (this: MVideoAbuseFormattable): VideoAbuse { |
271 | const countReportsForVideo = this.get('countReportsForVideo') as number | 296 | const countReportsForVideo = this.get('countReportsForVideo') as number |
272 | const nthReportForVideo = this.get('nthReportForVideo') as number | 297 | const nthReportForVideo = this.get('nthReportForVideo') as number |
273 | const countReportsForReporter = this.get('countReportsForReporter') as number | 298 | const countReportsForReporterVideo = this.get('countReportsForReporter__video') as number |
274 | const countReportsForReportee = this.get('countReportsForReportee') as number | 299 | const countReportsForReporterDeletedVideo = this.get('countReportsForReporter__deletedVideo') as number |
300 | const countReportsForReporteeVideo = this.get('countReportsForReportee__video') as number | ||
301 | const countReportsForReporteeDeletedVideo = this.get('countReportsForReportee__deletedVideo') as number | ||
275 | 302 | ||
276 | const video = this.Video | 303 | const video = this.Video |
277 | ? this.Video | 304 | ? this.Video |
@@ -300,8 +327,8 @@ export class VideoAbuseModel extends Model<VideoAbuseModel> { | |||
300 | updatedAt: this.updatedAt, | 327 | updatedAt: this.updatedAt, |
301 | count: countReportsForVideo || 0, | 328 | count: countReportsForVideo || 0, |
302 | nth: nthReportForVideo || 0, | 329 | nth: nthReportForVideo || 0, |
303 | countReportsForReporter: countReportsForReporter || 0, | 330 | countReportsForReporter: (countReportsForReporterVideo || 0) + (countReportsForReporterDeletedVideo || 0), |
304 | countReportsForReportee: countReportsForReportee || 0 | 331 | countReportsForReportee: (countReportsForReporteeVideo || 0) + (countReportsForReporteeDeletedVideo || 0) |
305 | } | 332 | } |
306 | } | 333 | } |
307 | 334 | ||