Add links from user-edit
authorRigel Kent <sendmemail@rigelk.eu>
Tue, 21 Apr 2020 07:52:21 +0000 (09:52 +0200)
committerRigel Kent <par@rigelk.eu>
Fri, 1 May 2020 14:41:02 +0000 (16:41 +0200)
client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
client/src/app/+admin/users/user-edit/user-edit.component.html
client/src/sass/include/_mixins.scss
server/tests/api/videos/video-abuse.ts
server/typings/models/video/video-abuse.ts

index f04efa9fcb4b570af6fe96b7f59135c09b308966..e87163c4f80d9ae6d51791679f2a93fdb3c2860c 100644 (file)
@@ -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
   }
index 5303d60964865b492607c6bc9e568e2749a5e475..df9f24749197a84d1597bdfa99f0c4ae7879fe77 100644 (file)
       </a>
     </div>
     <div>
-      <a>
+      <a [routerLink]="[ '/admin/moderation/video-abuses/list' ]" [queryParams]="{ 'search': user?.account.displayName }">
         <div class="dashboard-num">{{ user.videoAbusesCount }}</div>
         <div class="dashboard-label" i18n>Incriminated in reports</div>
       </a>
     </div>
     <div>
-      <a>
+      <a [routerLink]="[ '/admin/moderation/video-abuses/list' ]" [queryParams]="{ 'search': user?.account.displayName }">
         <div class="dashboard-num">{{ user.videoAbusesAcceptedCount }} / {{ user.videoAbusesCreatedCount }}</div>
         <div class="dashboard-label" i18n>Authored reports accepted</div>
       </a>
index adeee758eda6a0a6b022933df7860880966951b0..a6d1abd6d913e1c44e283607fc7d1cf10b4a65e7 100644 (file)
     margin-bottom: 10px;
 
     & > a {
+      @include disable-default-a-behaviour;
+
       text-decoration: none;
       color: inherit;
       display: block;
index 8a8290e145d8ddd66abd71eb77647fc488abae80..26bc3783bbfb6c60a90042c6abcbc7abefd076cd 100644 (file)
@@ -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[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)
 
-      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
+    // 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)
     }
   })
 
index 54acccdf5a7290581bc270ab4ce06ba4a1c60a4b..d60f05e4cd21413b1e1e06749d0856f2147a2afd 100644 (file)
@@ -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<K extends keyof VideoAbuseModel, M> = PickWith<VideoAbuseModel, K, M>
@@ -16,7 +16,7 @@ export type MVideoAbuseId = Pick<VideoAbuseModel, 'id'>
 export type MVideoAbuseVideo =
   MVideoAbuse &
   Pick<VideoAbuseModel, 'toActivityPubObject'> &
-  Use<'Video', MVideoAccountLightBlacklistAllFiles>
+  Use<'Video', MVideo>
 
 export type MVideoAbuseAccountVideo =
   MVideoAbuse &