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'
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'
})
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: {