]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/activitypub/process/process-create.ts
Propagate old comment on new follow
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / process / process-create.ts
index 102e54b19c34ad8dba729ddacf62c5958a2306bf..ffd20fe7433622aeaacac65381855c364e349f7c 100644 (file)
@@ -3,7 +3,8 @@ import { ActivityCreate, VideoTorrentObject } from '../../../../shared'
 import { DislikeObject, VideoAbuseObject, ViewObject } from '../../../../shared/models/activitypub/objects'
 import { VideoCommentObject } from '../../../../shared/models/activitypub/objects/video-comment-object'
 import { VideoRateType } from '../../../../shared/models/videos'
-import { logger, retryTransactionWrapper } from '../../../helpers'
+import { retryTransactionWrapper } from '../../../helpers/database-utils'
+import { logger } from '../../../helpers/logger'
 import { sequelizeTypescript } from '../../../initializers'
 import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
 import { ActorModel } from '../../../models/activitypub/actor'
@@ -15,7 +16,7 @@ import { VideoFileModel } from '../../../models/video/video-file'
 import { getOrCreateActorAndServerAndModel } from '../actor'
 import { forwardActivity } from '../send/misc'
 import { generateThumbnailFromUrl } from '../videos'
-import { addVideoShares, videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc'
+import { addVideoComments, addVideoShares, videoActivityObjectToDBAttributes, videoFileActivityUrlToDBAttributes } from './misc'
 
 async function processCreateActivity (activity: ActivityCreate) {
   const activityObject = activity.object
@@ -66,17 +67,25 @@ async function processCreateVideo (
 
   // Process outside the transaction because we could fetch remote data
   if (videoToCreateData.likes && Array.isArray(videoToCreateData.likes.orderedItems)) {
+    logger.info('Adding likes of video %s.', video.uuid)
     await createRates(videoToCreateData.likes.orderedItems, video, 'like')
   }
 
   if (videoToCreateData.dislikes && Array.isArray(videoToCreateData.dislikes.orderedItems)) {
+    logger.info('Adding dislikes of video %s.', video.uuid)
     await createRates(videoToCreateData.dislikes.orderedItems, video, 'dislike')
   }
 
   if (videoToCreateData.shares && Array.isArray(videoToCreateData.shares.orderedItems)) {
+    logger.info('Adding shares of video %s.', video.uuid)
     await addVideoShares(video, videoToCreateData.shares.orderedItems)
   }
 
+  if (videoToCreateData.comments && Array.isArray(videoToCreateData.comments.orderedItems)) {
+    logger.info('Adding comments of video %s.', video.uuid)
+    await addVideoComments(video, videoToCreateData.comments.orderedItems)
+  }
+
   return video
 }
 
@@ -257,31 +266,39 @@ function createVideoComment (byActor: ActorModel, activity: ActivityCreate) {
   if (!byAccount) throw new Error('Cannot create video comment with the non account actor ' + byActor.url)
 
   return sequelizeTypescript.transaction(async t => {
-    const video = await VideoModel.loadByUrl(comment.inReplyTo, t)
+    let video = await VideoModel.loadByUrl(comment.inReplyTo, t)
 
     // This is a new thread
     if (video) {
-      return VideoCommentModel.create({
+      await VideoCommentModel.create({
         url: comment.id,
         text: comment.content,
         originCommentId: null,
         inReplyToComment: null,
         videoId: video.id,
-        actorId: byActor.id
+        accountId: byAccount.id
+      }, { transaction: t })
+    } else {
+      const inReplyToComment = await VideoCommentModel.loadByUrl(comment.inReplyTo, t)
+      if (!inReplyToComment) throw new Error('Unknown replied comment ' + comment.inReplyTo)
+
+      video = await VideoModel.load(inReplyToComment.videoId)
+
+      const originCommentId = inReplyToComment.originCommentId || inReplyToComment.id
+      await VideoCommentModel.create({
+        url: comment.id,
+        text: comment.content,
+        originCommentId,
+        inReplyToCommentId: inReplyToComment.id,
+        videoId: video.id,
+        accountId: byAccount.id
       }, { transaction: t })
     }
 
-    const inReplyToComment = await VideoCommentModel.loadByUrl(comment.inReplyTo, t)
-    if (!inReplyToComment) throw new Error('Unknown replied comment ' + comment.inReplyTo)
-
-    const originCommentId = inReplyToComment.originCommentId || inReplyToComment.id
-    return VideoCommentModel.create({
-      url: comment.id,
-      text: comment.content,
-      originCommentId,
-      inReplyToCommentId: inReplyToComment.id,
-      videoId: inReplyToComment.videoId,
-      actorId: byActor.id
-    }, { transaction: t })
+    if (video.isOwned()) {
+      // Don't resend the activity to the sender
+      const exceptions = [ byActor ]
+      await forwardActivity(activity, t, exceptions)
+    }
   })
 }