X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-abuse.ts;h=af7b40d11f9ed215390b1654561ccb97d064314c;hb=453e83ea5d81d203ba34bc43cd5c2c750ba40568;hp=cc7078ae7966541ecea1c3bb79a542af19fc178c;hpb=ba75d268596bc7b289bacf1cc4cb53493d6ad444;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts index cc7078ae7..af7b40d11 100644 --- a/server/models/video/video-abuse.ts +++ b/server/models/video/video-abuse.ts @@ -1,11 +1,18 @@ -import { AfterCreate, AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' +import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript' import { VideoAbuseObject } from '../../../shared/models/activitypub/objects' -import { isVideoAbuseReasonValid } from '../../helpers/custom-validators/videos' -import { CONFIG } from '../../initializers' -import { Emailer } from '../../lib/emailer' +import { VideoAbuse } from '../../../shared/models/videos' +import { + isVideoAbuseModerationCommentValid, + isVideoAbuseReasonValid, + isVideoAbuseStateValid +} from '../../helpers/custom-validators/video-abuses' import { AccountModel } from '../account/account' import { getSort, throwIfNotValid } from '../utils' import { VideoModel } from './video' +import { VideoAbuseState } from '../../../shared' +import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers/constants' +import { MVideoAbuse, MVideoAbuseAccountVideo, MVideoAbuseVideo } from '../../typings/models' +import * as Bluebird from 'bluebird' @Table({ tableName: 'videoAbuse', @@ -21,10 +28,23 @@ import { VideoModel } from './video' export class VideoAbuseModel extends Model { @AllowNull(false) + @Default(null) @Is('VideoAbuseReason', value => throwIfNotValid(value, isVideoAbuseReasonValid, 'reason')) - @Column + @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.REASON.max)) reason: string + @AllowNull(false) + @Default(null) + @Is('VideoAbuseState', value => throwIfNotValid(value, isVideoAbuseStateValid, 'state')) + @Column + state: VideoAbuseState + + @AllowNull(true) + @Default(null) + @Is('VideoAbuseModerationComment', value => throwIfNotValid(value, isVideoAbuseModerationCommentValid, 'moderationComment', true)) + @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.MODERATION_COMMENT.max)) + moderationComment: string + @CreatedAt createdAt: Date @@ -55,16 +75,21 @@ export class VideoAbuseModel extends Model { }) Video: VideoModel - @AfterCreate - static sendEmailNotification (instance: VideoAbuseModel) { - return Emailer.Instance.addVideoAbuseReport(instance.videoId) + static loadByIdAndVideoId (id: number, videoId: number): Bluebird { + const query = { + where: { + id, + videoId + } + } + return VideoAbuseModel.findOne(query) } static listForApi (start: number, count: number, sort: string) { const query = { offset: start, limit: count, - order: [ getSort(sort) ], + order: getSort(sort), include: [ { model: AccountModel, @@ -83,33 +108,34 @@ export class VideoAbuseModel extends Model { }) } - toFormattedJSON () { - let reporterServerHost - - if (this.Account.Actor.Server) { - reporterServerHost = this.Account.Actor.Server.host - } else { - // It means it's our video - reporterServerHost = CONFIG.WEBSERVER.HOST - } - + toFormattedJSON (this: MVideoAbuseAccountVideo): VideoAbuse { return { id: this.id, reason: this.reason, - reporterUsername: this.Account.name, - reporterServerHost, - videoId: this.Video.id, - videoUUID: this.Video.uuid, - videoName: this.Video.name, + reporterAccount: this.Account.toFormattedJSON(), + state: { + id: this.state, + label: VideoAbuseModel.getStateLabel(this.state) + }, + moderationComment: this.moderationComment, + video: { + id: this.Video.id, + uuid: this.Video.uuid, + name: this.Video.name + }, createdAt: this.createdAt } } - toActivityPubObject (): VideoAbuseObject { + toActivityPubObject (this: MVideoAbuseVideo): VideoAbuseObject { return { type: 'Flag' as 'Flag', content: this.reason, object: this.Video.url } } + + private static getStateLabel (id: number) { + return VIDEO_ABUSE_STATES[id] || 'Unknown' + } }