Optimize view endpoint
authorChocobozzz <me@florianbigard.com>
Tue, 4 Feb 2020 15:14:33 +0000 (16:14 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 4 Feb 2020 15:18:01 +0000 (16:18 +0100)
server/controllers/activitypub/client.ts
server/controllers/api/videos/index.ts
server/lib/activitypub/audience.ts
server/lib/activitypub/send/send-view.ts
server/lib/activitypub/send/utils.ts
server/models/activitypub/actor.ts

index 9a5fd6084cc4b6ebeaf2af7712faec4d9205a566..395cfa0d5f126bd5276913c519058f1ba89d862a 100644 (file)
@@ -1,4 +1,3 @@
-// Intercept ActivityPub client requests
 import * as express from 'express'
 import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos'
 import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub'
@@ -37,10 +36,12 @@ import { buildDislikeActivity } from '../../lib/activitypub/send/send-dislike'
 import { videoPlaylistElementAPGetValidator, videoPlaylistsGetValidator } from '../../middlewares/validators/videos/video-playlists'
 import { VideoPlaylistModel } from '../../models/video/video-playlist'
 import { VideoPlaylistPrivacy } from '../../../shared/models/videos/playlist/video-playlist-privacy.model'
-import { MAccountId, MActorId, MVideo, MVideoAPWithoutCaption, MVideoId } from '@server/typings/models'
+import { MAccountId, MActorId, MVideoAPWithoutCaption, MVideoId } from '@server/typings/models'
 
 const activityPubClientRouter = express.Router()
 
+// Intercept ActivityPub client requests
+
 activityPubClientRouter.get('/accounts?/:name',
   executeIfActivityPub,
   asyncMiddleware(localAccountValidator),
index 1d61f84278e794f7de67164db5d6d2f23ee558d0..eb46ea01f5d0bbc78d14a633f5096296221fbf69 100644 (file)
@@ -135,7 +135,7 @@ videosRouter.get('/:id',
   asyncMiddleware(getVideo)
 )
 videosRouter.post('/:id/views',
-  asyncMiddleware(videosGetValidator),
+  asyncMiddleware(videosCustomGetValidator('only-immutable-attributes')),
   asyncMiddleware(viewVideo)
 )
 
@@ -458,7 +458,7 @@ async function getVideo (req: express.Request, res: express.Response) {
 }
 
 async function viewVideo (req: express.Request, res: express.Response) {
-  const videoInstance = res.locals.videoAll
+  const videoInstance = res.locals.onlyImmutableVideo
 
   const ip = req.ip
   const exists = await Redis.Instance.doesVideoIPViewExist(ip, videoInstance.uuid)
index 39caeef7b78fc7a1f390f15310350695864fae14..9933ae2b5cd8b9176495475a74620fbf90c2d6fc 100644 (file)
@@ -4,19 +4,11 @@ import { ACTIVITY_PUB } from '../../initializers/constants'
 import { ActorModel } from '../../models/activitypub/actor'
 import { VideoModel } from '../../models/video/video'
 import { VideoShareModel } from '../../models/video/video-share'
-import {
-  MActorFollowersUrl,
-  MActorLight,
-  MCommentOwner,
-  MCommentOwnerVideo,
-  MVideo,
-  MVideoAccountLight,
-  MVideoId
-} from '../../typings/models'
-
-function getRemoteVideoAudience (video: MVideoAccountLight, actorsInvolvedInVideo: MActorFollowersUrl[]): ActivityAudience {
+import { MActorFollowersUrl, MActorLight, MActorUrl, MCommentOwner, MCommentOwnerVideo, MVideoId } from '../../typings/models'
+
+function getRemoteVideoAudience (accountActor: MActorUrl, actorsInvolvedInVideo: MActorFollowersUrl[]): ActivityAudience {
   return {
-    to: [ video.VideoChannel.Account.Actor.url ],
+    to: [ accountActor.url ],
     cc: actorsInvolvedInVideo.map(a => a.followersUrl)
   }
 }
index 47482b9a99ce8b81d20d9908ed6a7b6a5f4d452a..1f864ea5237d4b55c2a5a06a8185d8f3313be634 100644 (file)
@@ -5,9 +5,9 @@ import { getVideoLikeActivityPubUrl } from '../url'
 import { sendVideoRelatedActivity } from './utils'
 import { audiencify, getAudience } from '../audience'
 import { logger } from '../../../helpers/logger'
-import { MActorAudience, MVideoAccountLight, MVideoUrl } from '@server/typings/models'
+import { MActorAudience, MVideoImmutable, MVideoUrl } from '@server/typings/models'
 
-async function sendView (byActor: ActorModel, video: MVideoAccountLight, t: Transaction) {
+async function sendView (byActor: ActorModel, video: MVideoImmutable, t: Transaction) {
   logger.info('Creating job to send view of %s.', video.url)
 
   const activityBuilder = (audience: ActivityAudience) => {
index 9436daf1713aad59ae062a2d1f96824477c59b6c..b57bae8fdfa67c9f10b572d7966060c783e86cce 100644 (file)
@@ -7,12 +7,12 @@ import { JobQueue } from '../../job-queue'
 import { getActorsInvolvedInVideo, getAudienceFromFollowersOf, getRemoteVideoAudience } from '../audience'
 import { getServerActor } from '../../../helpers/utils'
 import { afterCommitIfTransaction } from '../../../helpers/database-utils'
-import { MActorWithInboxes, MActor, MActorId, MActorLight, MVideo, MVideoAccountLight, MVideoId } from '../../../typings/models'
+import { MActor, MActorId, MActorLight, MActorWithInboxes, MVideoAccountLight, MVideoId, MVideoImmutable } from '../../../typings/models'
 import { ContextType } from '@server/helpers/activitypub'
 
 async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAudience) => Activity, options: {
   byActor: MActorLight
-  video: MVideoAccountLight
+  video: MVideoImmutable | MVideoAccountLight
   transaction?: Transaction
   contextType?: ContextType
 }) {
@@ -22,11 +22,13 @@ async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAud
 
   // Send to origin
   if (video.isOwned() === false) {
-    const audience = getRemoteVideoAudience(video, actorsInvolvedInVideo)
+    const accountActor = (video as MVideoAccountLight).VideoChannel?.Account?.Actor || await ActorModel.loadAccountActorByVideoId(video.id)
+
+    const audience = getRemoteVideoAudience(accountActor, actorsInvolvedInVideo)
     const activity = activityBuilder(audience)
 
     return afterCommitIfTransaction(transaction, () => {
-      return unicastTo(activity, byActor, video.VideoChannel.Account.Actor.getSharedInbox(), contextType)
+      return unicastTo(activity, byActor, accountActor.getSharedInbox(), contextType)
     })
   }
 
index 9e8303a7b0c9c2633e0151b880335dffd139a976..e547d2c0c19b00cfd932d318bf4e492675c96e64 100644 (file)
@@ -462,6 +462,36 @@ export class ActorModel extends Model<ActorModel> {
     }, { where, transaction })
   }
 
+  static loadAccountActorByVideoId (videoId: number): Bluebird<MActor> {
+    const query = {
+      include: [
+        {
+          attributes: [ 'id' ],
+          model: AccountModel.unscoped(),
+          required: true,
+          include: [
+            {
+              attributes: [ 'id', 'accountId' ],
+              model: VideoChannelModel.unscoped(),
+              required: true,
+              include: [
+                {
+                  attributes: [ 'id', 'channelId' ],
+                  model: VideoModel.unscoped(),
+                  where: {
+                    id: videoId
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      ]
+    }
+
+    return ActorModel.unscoped().findOne(query)
+  }
+
   getSharedInbox (this: MActorWithInboxes) {
     return this.sharedInboxUrl || this.inboxUrl
   }