X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fvideo-comment.ts;h=c76570a5df3c0b9697f53f40b59fe145f5f12a46;hb=450de91e22ba1388e14e12ada875c94e0c38f5d3;hp=e3fe26e355d2d8851b0bdf3a5697ed0ab5a0263c;hpb=d3ea89759104e6c14b00443526f2c2a0a13aeb97;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/video-comment.ts b/server/lib/video-comment.ts index e3fe26e35..c76570a5d 100644 --- a/server/lib/video-comment.ts +++ b/server/lib/video-comment.ts @@ -1,37 +1,66 @@ +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 { 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 { MAccountDefault, MComment, 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 (videoCommentInstance: MCommentOwnerVideo) { + const videoCommentInstanceBefore = cloneDeep(videoCommentInstance) + + await sequelizeTypescript.transaction(async t => { + if (videoCommentInstance.isOwned() || videoCommentInstance.Video.isOwned()) { + await sendDeleteVideoComment(videoCommentInstance, t) + } + + videoCommentInstance.markAsDeleted() + + await videoCommentInstance.save({ transaction: t }) + }) + + logger.info('Video comment %d deleted.', videoCommentInstance.id) + + Hooks.runAction('action:api.video-comment.deleted', { comment: videoCommentInstanceBefore }) +} async function createVideoComment (obj: { - text: string, - inReplyToCommentId: number, - video: VideoModel - accountId: number + text: string + inReplyToComment: MComment | null + video: MVideoFullLight + account: MAccountDefault }, t: Sequelize.Transaction) { - let originCommentId: number = null - - if (obj.inReplyToCommentId) { - const repliedComment = await VideoCommentModel.loadById(obj.inReplyToCommentId) - if (!repliedComment) throw new Error('Unknown replied comment.') + let originCommentId: number | null = null + let inReplyToCommentId: number | null = null - originCommentId = repliedComment.originCommentId || repliedComment.id + if (obj.inReplyToComment && obj.inReplyToComment !== null) { + originCommentId = obj.inReplyToComment.originCommentId || obj.inReplyToComment.id + inReplyToCommentId = obj.inReplyToComment.id } const comment = await VideoCommentModel.create({ text: obj.text, originCommentId, - inReplyToCommentId: obj.inReplyToCommentId, + inReplyToCommentId, videoId: obj.video.id, - accountId: obj.accountId, - url: 'fake url' + accountId: obj.account.id, + url: new Date().toISOString() }, { transaction: t, validate: false }) - comment.set('url', getVideoCommentActivityPubUrl(obj.video, comment)) + comment.url = getLocalVideoCommentActivityPubUrl(obj.video, comment) - return comment.save({ transaction: t }) + const savedComment: MCommentOwnerVideoReply = await comment.save({ transaction: t }) + savedComment.InReplyToVideoComment = obj.inReplyToComment + savedComment.Video = obj.video + savedComment.Account = obj.account + + await sendCreateVideoComment(savedComment, t) + + return savedComment } function buildFormattedCommentTree (resultList: ResultList): VideoCommentThreadTree { @@ -56,10 +85,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 @@ -71,6 +98,7 @@ function buildFormattedCommentTree (resultList: ResultList): // --------------------------------------------------------------------------- export { + removeComment, createVideoComment, buildFormattedCommentTree }