diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts index f04efa9fc..e87163c4f 100644 --- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts +++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts @@ -217,6 +217,7 @@ export class VideoAbuseListComponent extends RestTable implements OnInit, AfterV } setTableFilter (filter: string) { + // FIXME: cannot use ViewChild, so create a component for the filter input const filterInput = document.getElementById('table-filter') as HTMLInputElement if (filterInput) filterInput.value = filter } diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.html b/client/src/app/+admin/users/user-edit/user-edit.component.html index 5303d6096..df9f24749 100644 --- a/client/src/app/+admin/users/user-edit/user-edit.component.html +++ b/client/src/app/+admin/users/user-edit/user-edit.component.html @@ -37,13 +37,13 @@
- +
{{ user.videoAbusesCount }}
Incriminated in reports
- +
{{ user.videoAbusesAcceptedCount }} / {{ user.videoAbusesCreatedCount }}
Authored reports accepted
diff --git a/client/src/sass/include/_mixins.scss b/client/src/sass/include/_mixins.scss index adeee758e..a6d1abd6d 100644 --- a/client/src/sass/include/_mixins.scss +++ b/client/src/sass/include/_mixins.scss @@ -692,6 +692,8 @@ margin-bottom: 10px; & > a { + @include disable-default-a-behaviour; + text-decoration: none; color: inherit; display: block; diff --git a/server/tests/api/videos/video-abuse.ts b/server/tests/api/videos/video-abuse.ts index 8a8290e14..26bc3783b 100644 --- a/server/tests/api/videos/video-abuse.ts +++ b/server/tests/api/videos/video-abuse.ts @@ -14,7 +14,9 @@ import { setAccessTokensToServers, updateVideoAbuse, uploadVideo, - removeVideo + removeVideo, + createUser, + userLogin } from '../../../../shared/extra-utils/index' import { doubleFollow } from '../../../../shared/extra-utils/server/follows' import { waitJobs } from '../../../../shared/extra-utils/server/jobs' @@ -236,16 +238,56 @@ describe('Test video abuses', function () { await waitJobs(servers) - { - const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken) - expect(res.body.total).to.equal(2) - expect(res.body.data.length).to.equal(2) - expect(res.body.data[0].id).to.equal(abuseServer2.id) + const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken) + expect(res.body.total).to.equal(2, "wrong number of videos returned") + expect(res.body.data.length).to.equal(2, "wrong number of videos returned") + expect(res.body.data[0].id).to.equal(abuseServer2.id, "wrong origin server id for first video") - const abuse: VideoAbuse = res.body.data[1] - expect(abuse.video.deleted).to.be.true - expect(abuse.video.id).to.equal(abuseServer2.video.id) - expect(abuse.video.channel).to.exist + const abuse: VideoAbuse = res.body.data[0] + expect(abuse.video.id).to.equal(abuseServer2.video.id, "wrong video id") + expect(abuse.video.channel).to.exist + expect(abuse.video.deleted).to.be.true + }) + + it('Should include counts of reports from reporter and reportee', async function () { + this.timeout(10000) + + // register a second user to have two reporters/reportees + const user = { username: 'user2', password: 'password' } + await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, ...user }) + const userAccessToken = await userLogin(servers[0], user) + + // upload a third video via this user + const video3Attributes = { + name: 'my second super name for server 1', + description: 'my second super description for server 1' + } + await uploadVideo(servers[0].url, userAccessToken, video3Attributes) + + const res1 = await getVideosList(servers[0].url) + const videos = res1.body.data + const video3 = videos.find(video => video.name === 'my second super name for server 1') + + // resume with the test + const reason3 = 'my super bad reason 3' + await reportVideoAbuse(servers[0].url, servers[0].accessToken, video3.id, reason3) + const reason4 = 'my super bad reason 4' + await reportVideoAbuse(servers[0].url, userAccessToken, servers[0].video.id, reason4) + + const res2 = await getVideoAbusesList(servers[0].url, servers[0].accessToken) + + { + for (const abuse of res2.body.data as VideoAbuse[]) { + if (abuse.video.id === video3.id) { + expect(abuse.count).to.equal(1, "wrong reports count for video 3") + expect(abuse.nth).to.equal(1, "wrong report position in report list for video 3") + expect(abuse.countReportsForReportee).to.equal(1, "wrong reports count for reporter on video 3 abuse") + expect(abuse.countReportsForReporter).to.equal(3, "wrong reports count for reportee on video 3 abuse") + } + if (abuse.video.id === servers[0].video.id) { + expect(abuse.countReportsForReportee).to.equal(3, "wrong reports count for reporter on video 1 abuse") + } + } } }) @@ -265,7 +307,7 @@ describe('Test video abuses', function () { { const res = await getVideoAbusesList(servers[0].url, servers[0].accessToken) - expect(res.body.total).to.equal(3) + expect(res.body.total).to.equal(5) } }) diff --git a/server/typings/models/video/video-abuse.ts b/server/typings/models/video/video-abuse.ts index 54acccdf5..d60f05e4c 100644 --- a/server/typings/models/video/video-abuse.ts +++ b/server/typings/models/video/video-abuse.ts @@ -1,6 +1,6 @@ import { VideoAbuseModel } from '../../../models/video/video-abuse' import { PickWith } from '../../utils' -import { MVideoAccountLightBlacklistAllFiles } from './video' +import { MVideoAccountLightBlacklistAllFiles, MVideo } from './video' import { MAccountDefault, MAccountFormattable } from '../account' type Use = PickWith @@ -16,7 +16,7 @@ export type MVideoAbuseId = Pick export type MVideoAbuseVideo = MVideoAbuse & Pick & - Use<'Video', MVideoAccountLightBlacklistAllFiles> + Use<'Video', MVideo> export type MVideoAbuseAccountVideo = MVideoAbuse &