X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmodels%2Fvideo%2Fvideo-comment.ts;h=de27b3d875fb3745682f5a056405162b5298f85f;hb=97816649b793bdd0f3df64631ae0ef7cf3d7461c;hp=fb6078ed889411496331fda3be8118b0fb547b05;hpb=57f6896f67cfc570cf3605dd94b0778101b2d9b9;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/models/video/video-comment.ts b/server/models/video/video-comment.ts index fb6078ed8..de27b3d87 100644 --- a/server/models/video/video-comment.ts +++ b/server/models/video/video-comment.ts @@ -1,9 +1,8 @@ import * as Bluebird from 'bluebird' import { uniq } from 'lodash' -import { FindOptions, Op, Order, ScopeOptions, Sequelize, Transaction } from 'sequelize' +import { FindOptions, Op, Order, ScopeOptions, Sequelize, Transaction, WhereOptions } from 'sequelize' import { AllowNull, - BeforeDestroy, BelongsTo, Column, CreatedAt, @@ -16,7 +15,6 @@ import { 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' @@ -42,11 +40,11 @@ import { 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' +import { buildBlockedAccountSQL, buildBlockedAccountSQLOptimized, buildLocalAccountIdsIn, getCommentSort, throwIfNotValid } from '../utils' import { VideoModel } from './video' import { VideoChannelModel } from './video-channel' -enum ScopeNames { +export enum ScopeNames { WITH_ACCOUNT = 'WITH_ACCOUNT', WITH_ACCOUNT_FOR_API = 'WITH_ACCOUNT_FOR_API', WITH_IN_REPLY_TO = 'WITH_IN_REPLY_TO', @@ -242,51 +240,13 @@ export class VideoCommentModel extends Model { @HasMany(() => VideoCommentAbuseModel, { foreignKey: { - name: 'commentId', + name: 'videoCommentId', 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: { @@ -500,19 +460,20 @@ export class VideoCommentModel extends Model { const serverActor = await getServerActor() const { start, count, videoId, accountId, videoChannelId } = parameters - const accountExclusion = { - [Op.notIn]: Sequelize.literal( - '(' + buildBlockedAccountSQL([ serverActor.Account.id, '"Video->VideoChannel"."accountId"' ]) + ')' - ) + const whereAnd: WhereOptions[] = buildBlockedAccountSQLOptimized( + '"VideoCommentModel"."accountId"', + [ serverActor.Account.id, '"Video->VideoChannel"."accountId"' ] + ) + + if (accountId) { + whereAnd.push({ + [Op.eq]: accountId + }) + } + + const accountWhere = { + [Op.and]: whereAnd } - const accountWhere = accountId - ? { - [Op.and]: { - ...accountExclusion, - [Op.eq]: accountId - } - } - : accountExclusion const videoChannelWhere = videoChannelId ? { id: videoChannelId } : undefined @@ -695,7 +656,7 @@ export class VideoCommentModel extends Model { id: this.id, url: this.url, text: this.text, - threadId: this.originCommentId || this.id, + threadId: this.getThreadId(), inReplyToCommentId: this.inReplyToCommentId || null, videoId: this.videoId, createdAt: this.createdAt,