X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fvideo-comment.ts;h=6eb865f7f97793c88540c841901a28e88aed128a;hb=257fa0d1a06b0110335ca53fb6cd341b6759fa5a;hp=0d744c526ee74da49a7cc32cfe104857cc8c9bf3;hpb=4635f59d7c3fea4b97029f10886c62fdf38b2084;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/video-comment.ts b/server/lib/video-comment.ts index 0d744c526..6eb865f7f 100644 --- a/server/lib/video-comment.ts +++ b/server/lib/video-comment.ts @@ -1,22 +1,55 @@ +import express from 'express' +import { cloneDeep } from 'lodash' import * as Sequelize from 'sequelize' +import { logger } from '@server/helpers/logger' +import { sequelizeTypescript } from '@server/initializers/database' import { ResultList } from '../../shared/models' -import { VideoCommentThreadTree } from '../../shared/models/videos/video-comment.model' -import { AccountModel } from '../models/account/account' -import { VideoModel } from '../models/video/video' +import { VideoCommentThreadTree } from '../../shared/models/videos/comment/video-comment.model' import { VideoCommentModel } from '../models/video/video-comment' -import { getVideoCommentActivityPubUrl } from './activitypub' -import { sendCreateVideoCommentToOrigin, sendCreateVideoCommentToVideoFollowers } from './activitypub/send' +import { + MAccountDefault, + MComment, + MCommentFormattable, + MCommentOwnerVideo, + MCommentOwnerVideoReply, + MVideoFullLight +} from '../types/models' +import { sendCreateVideoComment, sendDeleteVideoComment } from './activitypub/send' +import { getLocalVideoCommentActivityPubUrl } from './activitypub/url' +import { Hooks } from './plugins/hooks' + +async function removeComment (commentArg: MComment, req: express.Request, res: express.Response) { + let videoCommentInstanceBefore: MCommentOwnerVideo + + await sequelizeTypescript.transaction(async t => { + const comment = await VideoCommentModel.loadByUrlAndPopulateAccountAndVideo(commentArg.url, t) + + videoCommentInstanceBefore = cloneDeep(comment) + + if (comment.isOwned() || comment.Video.isOwned()) { + await sendDeleteVideoComment(comment, t) + } + + comment.markAsDeleted() + + await comment.save({ transaction: t }) + + logger.info('Video comment %d deleted.', comment.id) + }) + + Hooks.runAction('action:api.video-comment.deleted', { comment: videoCommentInstanceBefore, req, res }) +} async function createVideoComment (obj: { - text: string, - inReplyToComment: VideoCommentModel, - video: VideoModel - account: AccountModel + text: string + inReplyToComment: MComment | null + video: MVideoFullLight + account: MAccountDefault }, t: Sequelize.Transaction) { - let originCommentId: number = null - let inReplyToCommentId: number = null + let originCommentId: number | null = null + let inReplyToCommentId: number | null = null - if (obj.inReplyToComment) { + if (obj.inReplyToComment && obj.inReplyToComment !== null) { originCommentId = obj.inReplyToComment.originCommentId || obj.inReplyToComment.id inReplyToCommentId = obj.inReplyToComment.id } @@ -27,26 +60,22 @@ async function createVideoComment (obj: { inReplyToCommentId, videoId: obj.video.id, accountId: obj.account.id, - url: 'fake url' + url: new Date().toISOString() }, { transaction: t, validate: false }) - comment.set('url', getVideoCommentActivityPubUrl(obj.video, comment)) + comment.url = getLocalVideoCommentActivityPubUrl(obj.video, comment) - const savedComment = await comment.save({ transaction: t }) + const savedComment: MCommentOwnerVideoReply = await comment.save({ transaction: t }) savedComment.InReplyToVideoComment = obj.inReplyToComment savedComment.Video = obj.video savedComment.Account = obj.account - if (savedComment.Video.isOwned()) { - await sendCreateVideoCommentToVideoFollowers(savedComment, t) - } else { - await sendCreateVideoCommentToOrigin(savedComment, t) - } + await sendCreateVideoComment(savedComment, t) return savedComment } -function buildFormattedCommentTree (resultList: ResultList): VideoCommentThreadTree { +function buildFormattedCommentTree (resultList: ResultList): VideoCommentThreadTree { // Comments are sorted by id ASC const comments = resultList.data @@ -68,10 +97,8 @@ function buildFormattedCommentTree (resultList: ResultList): } const parentCommentThread = idx[childComment.inReplyToCommentId] - if (!parentCommentThread) { - const msg = `Cannot format video thread tree, parent ${childComment.inReplyToCommentId} not found for child ${childComment.id}` - throw new Error(msg) - } + // Maybe the parent comment was blocked by the admin/user + if (!parentCommentThread) continue parentCommentThread.children.push(childCommentThread) idx[childComment.id] = childCommentThread @@ -83,6 +110,7 @@ function buildFormattedCommentTree (resultList: ResultList): // --------------------------------------------------------------------------- export { + removeComment, createVideoComment, buildFormattedCommentTree }