From 57f6896f67cfc570cf3605dd94b0778101b2d9b9 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 7 Jul 2020 10:57:04 +0200 Subject: Implement abuses check params --- server/models/video/video-comment.ts | 65 +++++++++++++++++++++++++++++++++++- server/models/video/video.ts | 4 +-- 2 files changed, 66 insertions(+), 3 deletions(-) (limited to 'server/models/video') diff --git a/server/models/video/video-comment.ts b/server/models/video/video-comment.ts index 90625d987..fb6078ed8 100644 --- a/server/models/video/video-comment.ts +++ b/server/models/video/video-comment.ts @@ -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 { }) Account: AccountModel + @HasMany(() => VideoCommentAbuseModel, { + foreignKey: { + name: 'commentId', + allowNull: true + }, + onDelete: 'set null' + }) + CommentAbuses: VideoCommentAbuseModel[] + + @BeforeDestroy + static async saveEssentialDataToAbuses (instance: VideoCommentModel, options) { + const tasks: Promise[] = [] + + 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 { const query: FindOptions = { where: { diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 272bba0e1..43609587c 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -803,14 +803,14 @@ export class VideoModel extends Model { static async saveEssentialDataToAbuses (instance: VideoModel, options) { const tasks: Promise[] = [] - logger.info('Saving video abuses details of video %s.', instance.url) - if (!Array.isArray(instance.VideoAbuses)) { instance.VideoAbuses = await instance.$get('VideoAbuses') if (instance.VideoAbuses.length === 0) return undefined } + logger.info('Saving video abuses details of video %s.', instance.url) + const details = instance.toFormattedDetailsJSON() for (const abuse of instance.VideoAbuses) { -- cgit v1.2.3