]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/video/video-comment.ts
Implement abuses check params
[github/Chocobozzz/PeerTube.git] / server / models / video / video-comment.ts
index 90625d987a9f6436ecf125f3360ee9a8fe544a1b..fb6078ed889411496331fda3be8118b0fb547b05 100644 (file)
@@ -1,7 +1,22 @@
 import * as Bluebird from 'bluebird'
 import { uniq } from 'lodash'
 import { FindOptions, Op, Order, ScopeOptions, Sequelize, Transaction } from 'sequelize'
-import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
+import {
+  AllowNull,
+  BeforeDestroy,
+  BelongsTo,
+  Column,
+  CreatedAt,
+  DataType,
+  ForeignKey,
+  HasMany,
+  Is,
+  Model,
+  Scopes,
+  Table,
+  UpdatedAt
+} from 'sequelize-typescript'
+import { logger } from '@server/helpers/logger'
 import { getServerActor } from '@server/models/application/application'
 import { MAccount, MAccountId, MUserAccountId } from '@server/types/models'
 import { VideoPrivacy } from '@shared/models'
@@ -24,6 +39,7 @@ import {
   MCommentOwnerVideoReply,
   MVideoImmutable
 } from '../../types/models/video'
+import { VideoCommentAbuseModel } from '../abuse/video-comment-abuse'
 import { AccountModel } from '../account/account'
 import { ActorModel, unusedActorAttributesForAPI } from '../activitypub/actor'
 import { buildBlockedAccountSQL, buildLocalAccountIdsIn, getCommentSort, throwIfNotValid } from '../utils'
@@ -224,6 +240,53 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
   })
   Account: AccountModel
 
+  @HasMany(() => VideoCommentAbuseModel, {
+    foreignKey: {
+      name: 'commentId',
+      allowNull: true
+    },
+    onDelete: 'set null'
+  })
+  CommentAbuses: VideoCommentAbuseModel[]
+
+  @BeforeDestroy
+  static async saveEssentialDataToAbuses (instance: VideoCommentModel, options) {
+    const tasks: Promise<any>[] = []
+
+    if (!Array.isArray(instance.CommentAbuses)) {
+      instance.CommentAbuses = await instance.$get('CommentAbuses')
+
+      if (instance.CommentAbuses.length === 0) return undefined
+    }
+
+    if (!instance.Video) {
+      instance.Video = await instance.$get('Video')
+    }
+
+    logger.info('Saving video comment %s for abuse.', instance.url)
+
+    const details = Object.assign(instance.toFormattedJSON(), {
+      Video: {
+        id: instance.Video.id,
+        name: instance.Video.name,
+        uuid: instance.Video.uuid
+      }
+    })
+
+    for (const abuse of instance.CommentAbuses) {
+      abuse.deletedComment = details
+
+      tasks.push(abuse.save({ transaction: options.transaction }))
+    }
+
+    Promise.all(tasks)
+           .catch(err => {
+             logger.error('Some errors when saving details of comment %s in its abuses before destroy hook.', instance.url, { err })
+           })
+
+    return undefined
+  }
+
   static loadById (id: number, t?: Transaction): Bluebird<MComment> {
     const query: FindOptions = {
       where: {