Hide video abuses from muted accounts
This commit is contained in:
parent
3155c8606c
commit
f0a47bc92a
3 changed files with 102 additions and 9 deletions
|
@ -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))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 () {
|
||||||
|
|
Loading…
Reference in a new issue