X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-comment.ts;h=fb6078ed889411496331fda3be8118b0fb547b05;hb=57f6896f67cfc570cf3605dd94b0778101b2d9b9;hp=90625d987a9f6436ecf125f3360ee9a8fe544a1b;hpb=d95d15598847c7f020aa056e7e6e0c02d2bbf732;p=github%2FChocobozzz%2FPeerTube.git 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: {