Hide video abuses from muted accounts
authorChocobozzz <me@florianbigard.com>
Thu, 29 Aug 2019 12:31:04 +0000 (14:31 +0200)
committerChocobozzz <me@florianbigard.com>
Thu, 29 Aug 2019 12:31:04 +0000 (14:31 +0200)
server/controllers/api/videos/abuse.ts
server/models/video/video-abuse.ts
server/tests/api/videos/video-abuse.ts

index 39c841ffe1271fd874e74b1ac056887e7836a100..4ae899b7e7e91f5e64ed18ab169e60fb28bc5334 100644 (file)
@@ -1,7 +1,7 @@
 import * as express from 'express'
 import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared'
 import { logger } from '../../../helpers/logger'
-import { getFormattedObjects } from '../../../helpers/utils'
+import { getFormattedObjects, getServerActor } from '../../../helpers/utils'
 import { sequelizeTypescript } from '../../../initializers'
 import {
   asyncMiddleware,
@@ -62,7 +62,16 @@ export {
 // ---------------------------------------------------------------------------
 
 async function listVideoAbuses (req: express.Request, res: express.Response) {
-  const resultList = await VideoAbuseModel.listForApi(req.query.start, req.query.count, req.query.sort)
+  const user = res.locals.oauth.token.user
+  const serverActor = await getServerActor()
+
+  const resultList = await VideoAbuseModel.listForApi({
+    start: req.query.start,
+    count: req.query.count,
+    sort: req.query.sort,
+    serverAccountId: serverActor.Account.id,
+    user
+  })
 
   return res.json(getFormattedObjects(resultList.data, resultList.total))
 }
index 6ef1a915d85c9a4b5d5649949e8c3e1dd2f57200..3636db18de73c125e02fbf5c0831c98b2d6a524c 100644 (file)
@@ -7,12 +7,13 @@ import {
   isVideoAbuseStateValid
 } from '../../helpers/custom-validators/video-abuses'
 import { AccountModel } from '../account/account'
-import { getSort, throwIfNotValid } from '../utils'
+import { buildBlockedAccountSQL, getSort, throwIfNotValid } from '../utils'
 import { VideoModel } from './video'
 import { VideoAbuseState } from '../../../shared'
 import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants'
-import { MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models'
+import { MUserAccountId, MVideoAbuse, MVideoAbuseFormattable, MVideoAbuseVideo } from '../../typings/models'
 import * as Bluebird from 'bluebird'
+import { literal, Op } from 'sequelize'
 
 @Table({
   tableName: 'videoAbuse',
@@ -85,11 +86,25 @@ export class VideoAbuseModel extends Model<VideoAbuseModel> {
     return VideoAbuseModel.findOne(query)
   }
 
-  static listForApi (start: number, count: number, sort: string) {
+  static listForApi (parameters: {
+    start: number,
+    count: number,
+    sort: string,
+    serverAccountId: number
+    user?: MUserAccountId
+  }) {
+    const { start, count, sort, user, serverAccountId } = parameters
+    const userAccountId = user ? user.Account.id : undefined
+
     const query = {
       offset: start,
       limit: count,
       order: getSort(sort),
+      where: {
+        reporterAccountId: {
+          [Op.notIn]: literal('(' + buildBlockedAccountSQL(serverAccountId, userAccountId) + ')')
+        }
+      },
       include: [
         {
           model: AccountModel,
index a2f3ee16177b414285db25b3c4172d0b4a7ebae2..0cd6f22c76252b7e69d2616700055d8ada20c088 100644 (file)
@@ -17,6 +17,12 @@ import {
 } from '../../../../shared/extra-utils/index'
 import { doubleFollow } from '../../../../shared/extra-utils/server/follows'
 import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
+import {
+  addAccountToServerBlocklist,
+  addServerToServerBlocklist,
+  removeAccountFromServerBlocklist,
+  removeServerFromServerBlocklist
+} from '../../../../shared/extra-utils/users/blocklist'
 
 const expect = chai.expect
 
@@ -163,13 +169,76 @@ describe('Test video abuses', function () {
     expect(res.body.data[0].moderationComment).to.equal('It is valid')
   })
 
+  it('Should hide video abuses from blocked accounts', async function () {
+    this.timeout(10000)
+
+    {
+      await reportVideoAbuse(servers[1].url, servers[1].accessToken, servers[0].video.uuid, 'will mute this')
+      await waitJobs(servers)
+
+      const res = await getVideoAbusesList(servers[0].url, servers[0].accessToken)
+      expect(res.body.total).to.equal(3)
+    }
+
+    const accountToBlock = 'root@localhost:' + servers[1].port
+
+    {
+      await addAccountToServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, accountToBlock)
+
+      const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
+      expect(res.body.total).to.equal(2)
+
+      const abuse = res.body.data.find(a => a.reason === 'will mute this')
+      expect(abuse).to.be.undefined
+    }
+
+    {
+      await removeAccountFromServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, accountToBlock)
+
+      const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
+      expect(res.body.total).to.equal(3)
+    }
+  })
+
+  it('Should hide video abuses from blocked servers', async function () {
+    const serverToBlock = servers[1].host
+
+    {
+      await addServerToServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, servers[1].host)
+
+      const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
+      expect(res.body.total).to.equal(2)
+
+      const abuse = res.body.data.find(a => a.reason === 'will mute this')
+      expect(abuse).to.be.undefined
+    }
+
+    {
+      await removeServerFromServerBlocklist(servers[ 0 ].url, servers[ 0 ].accessToken, serverToBlock)
+
+      const res = await getVideoAbusesList(servers[ 0 ].url, servers[ 0 ].accessToken)
+      expect(res.body.total).to.equal(3)
+    }
+  })
+
   it('Should delete the video abuse', async function () {
+    this.timeout(10000)
+
     await deleteVideoAbuse(servers[1].url, servers[1].accessToken, abuseServer2.video.uuid, abuseServer2.id)
 
-    const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken)
-    expect(res.body.total).to.equal(0)
-    expect(res.body.data).to.be.an('array')
-    expect(res.body.data.length).to.equal(0)
+    await waitJobs(servers)
+
+    {
+      const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken)
+      expect(res.body.total).to.equal(1)
+      expect(res.body.data.length).to.equal(1)
+      expect(res.body.data[0].id).to.not.equal(abuseServer2.id)
+    }
+
+    {
+      const res = await getVideoAbusesList(servers[0].url, servers[0].accessToken)
+      expect(res.body.total).to.equal(3)
+    }
   })
 
   after(async function () {