]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/video/video-abuse.ts
Stronger model typings
[github/Chocobozzz/PeerTube.git] / server / models / video / video-abuse.ts
index cc7078ae7966541ecea1c3bb79a542af19fc178c..af7b40d11f9ed215390b1654561ccb97d064314c 100644 (file)
@@ -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<VideoAbuseModel> {
 
   @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<VideoAbuseModel> {
   })
   Video: VideoModel
 
-  @AfterCreate
-  static sendEmailNotification (instance: VideoAbuseModel) {
-    return Emailer.Instance.addVideoAbuseReport(instance.videoId)
+  static loadByIdAndVideoId (id: number, videoId: number): Bluebird<MVideoAbuse> {
+    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<VideoAbuseModel> {
       })
   }
 
-  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'
+  }
 }