1
0
Fork 0

Hide video abuses from muted accounts

This commit is contained in:
Chocobozzz 2019-08-29 14:31:04 +02:00
parent 3155c8606c
commit f0a47bc92a
No known key found for this signature in database
GPG key ID: 583A612D890159BE
3 changed files with 102 additions and 9 deletions

View file

@ -1,7 +1,7 @@
import * as express from 'express' import * as express from 'express'
import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared' import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared'
import { logger } from '../../../helpers/logger' import { logger } from '../../../helpers/logger'
import { getFormattedObjects } from '../../../helpers/utils' import { getFormattedObjects, getServerActor } from '../../../helpers/utils'
import { sequelizeTypescript } from '../../../initializers' import { sequelizeTypescript } from '../../../initializers'
import { import {
asyncMiddleware, asyncMiddleware,
@ -62,7 +62,16 @@ export {
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
async function listVideoAbuses (req: express.Request, res: express.Response) { 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)) return res.json(getFormattedObjects(resultList.data, resultList.total))
} }

View file

@ -7,12 +7,13 @@ import {
isVideoAbuseStateValid isVideoAbuseStateValid
} from '../../helpers/custom-validators/video-abuses' } from '../../helpers/custom-validators/video-abuses'
import { AccountModel } from '../account/account' import { AccountModel } from '../account/account'
import { getSort, throwIfNotValid } from '../utils' import { buildBlockedAccountSQL, getSort, throwIfNotValid } from '../utils'
import { VideoModel } from './video' import { VideoModel } from './video'
import { VideoAbuseState } from '../../../shared' import { VideoAbuseState } from '../../../shared'
import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants' 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 * as Bluebird from 'bluebird'
import { literal, Op } from 'sequelize'
@Table({ @Table({
tableName: 'videoAbuse', tableName: 'videoAbuse',
@ -85,11 +86,25 @@ export class VideoAbuseModel extends Model<VideoAbuseModel> {
return VideoAbuseModel.findOne(query) 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 = { const query = {
offset: start, offset: start,
limit: count, limit: count,
order: getSort(sort), order: getSort(sort),
where: {
reporterAccountId: {
[Op.notIn]: literal('(' + buildBlockedAccountSQL(serverAccountId, userAccountId) + ')')
}
},
include: [ include: [
{ {
model: AccountModel, model: AccountModel,

View file

@ -17,6 +17,12 @@ import {
} from '../../../../shared/extra-utils/index' } from '../../../../shared/extra-utils/index'
import { doubleFollow } from '../../../../shared/extra-utils/server/follows' import { doubleFollow } from '../../../../shared/extra-utils/server/follows'
import { waitJobs } from '../../../../shared/extra-utils/server/jobs' import { waitJobs } from '../../../../shared/extra-utils/server/jobs'
import {
addAccountToServerBlocklist,
addServerToServerBlocklist,
removeAccountFromServerBlocklist,
removeServerFromServerBlocklist
} from '../../../../shared/extra-utils/users/blocklist'
const expect = chai.expect const expect = chai.expect
@ -163,13 +169,76 @@ describe('Test video abuses', function () {
expect(res.body.data[0].moderationComment).to.equal('It is valid') 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 () { it('Should delete the video abuse', async function () {
this.timeout(10000)
await deleteVideoAbuse(servers[1].url, servers[1].accessToken, abuseServer2.video.uuid, abuseServer2.id) await deleteVideoAbuse(servers[1].url, servers[1].accessToken, abuseServer2.video.uuid, abuseServer2.id)
await waitJobs(servers)
{
const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken) const res = await getVideoAbusesList(servers[1].url, servers[1].accessToken)
expect(res.body.total).to.equal(0) expect(res.body.total).to.equal(1)
expect(res.body.data).to.be.an('array') expect(res.body.data.length).to.equal(1)
expect(res.body.data.length).to.equal(0) 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 () { after(async function () {