Add id to likes/dislikes/comments/shares collections
authorChocobozzz <me@florianbigard.com>
Mon, 29 Jan 2018 09:52:19 +0000 (10:52 +0100)
committerChocobozzz <me@florianbigard.com>
Mon, 29 Jan 2018 09:52:19 +0000 (10:52 +0100)
server/controllers/activitypub/client.ts
server/helpers/activitypub.ts
server/lib/activitypub/url.ts
server/models/video/video.ts

index 7b60cc311a1726116e686af8d4d287e9dbeaf3ce..55bd85c48f752d0f45dfb1b89b82065b7b39c284 100644 (file)
@@ -36,10 +36,26 @@ activityPubClientRouter.get('/videos/watch/:id',
   executeIfActivityPub(asyncMiddleware(videosGetValidator)),
   executeIfActivityPub(asyncMiddleware(videoController))
 )
+activityPubClientRouter.get('/videos/watch/:id/announces',
+  executeIfActivityPub(asyncMiddleware(videosGetValidator)),
+  executeIfActivityPub(asyncMiddleware(videoAnnouncesController))
+)
 activityPubClientRouter.get('/videos/watch/:id/announces/:accountId',
   executeIfActivityPub(asyncMiddleware(videosShareValidator)),
   executeIfActivityPub(asyncMiddleware(videoAnnounceController))
 )
+activityPubClientRouter.get('/videos/watch/:id/likes',
+  executeIfActivityPub(asyncMiddleware(videosGetValidator)),
+  executeIfActivityPub(asyncMiddleware(videoLikesController))
+)
+activityPubClientRouter.get('/videos/watch/:id/dislikes',
+  executeIfActivityPub(asyncMiddleware(videosGetValidator)),
+  executeIfActivityPub(asyncMiddleware(videoDislikesController))
+)
+activityPubClientRouter.get('/videos/watch/:id/comments',
+  executeIfActivityPub(asyncMiddleware(videosGetValidator)),
+  executeIfActivityPub(asyncMiddleware(videoCommentsController))
+)
 activityPubClientRouter.get('/videos/watch/:videoId/comments/:commentId',
   executeIfActivityPub(asyncMiddleware(videoCommentGetValidator)),
   executeIfActivityPub(asyncMiddleware(videoCommentController))
@@ -105,6 +121,46 @@ async function videoAnnounceController (req: express.Request, res: express.Respo
   return res.json(activityPubContextify(object))
 }
 
+async function videoAnnouncesController (req: express.Request, res: express.Response, next: express.NextFunction) {
+  const video: VideoModel = res.locals.video
+
+  // We need more attributes
+  const videoAll = await VideoModel.loadAndPopulateAll(video.id)
+  const object = videoAll.toAnnouncesActivityPubObject()
+
+  return res.json(activityPubContextify(object))
+}
+
+async function videoLikesController (req: express.Request, res: express.Response, next: express.NextFunction) {
+  const video: VideoModel = res.locals.video
+
+  // We need more attributes
+  const videoAll = await VideoModel.loadAndPopulateAll(video.id)
+  const { likesObject } = videoAll.toRatesActivityPubObjects()
+
+  return res.json(activityPubContextify(likesObject))
+}
+
+async function videoDislikesController (req: express.Request, res: express.Response, next: express.NextFunction) {
+  const video: VideoModel = res.locals.video
+
+  // We need more attributes
+  const videoAll = await VideoModel.loadAndPopulateAll(video.id)
+  const { dislikesObject } = videoAll.toRatesActivityPubObjects()
+
+  return res.json(activityPubContextify(dislikesObject))
+}
+
+async function videoCommentsController (req: express.Request, res: express.Response, next: express.NextFunction) {
+  const video: VideoModel = res.locals.video
+
+  // We need more attributes
+  const videoAll = await VideoModel.loadAndPopulateAll(video.id)
+  const commentsObject = videoAll.toCommentsActivityPubObject()
+
+  return res.json(activityPubContextify(commentsObject))
+}
+
 async function videoChannelController (req: express.Request, res: express.Response, next: express.NextFunction) {
   const videoChannel: VideoChannelModel = res.locals.videoChannel
 
index 97115680cd129383ed27eaf6cc6a934863a2add3..aa5485850dbfbc8c939879d8fbc966aca6486f98 100644 (file)
@@ -25,8 +25,9 @@ function activityPubContextify <T> (data: T) {
   })
 }
 
-function activityPubCollection (results: any[]) {
+function activityPubCollection (url: string, results: any[]) {
   return {
+    id: url,
     type: 'OrderedCollection',
     totalItems: results.length,
     orderedItems: results
index 5705afbd62ff8ebdbe938439fe406205b47ad216..ba3bf688d634d036f0877eab1d8c865f78da9a9e 100644 (file)
@@ -37,6 +37,22 @@ function getVideoDislikeActivityPubUrl (byActor: ActorModel, video: VideoModel)
   return byActor.url + '/dislikes/' + video.id
 }
 
+function getVideoSharesActivityPubUrl (video: VideoModel) {
+  return video.url + '/announces'
+}
+
+function getVideoCommentsActivityPubUrl (video: VideoModel) {
+  return video.url + '/comments'
+}
+
+function getVideoLikesActivityPubUrl (video: VideoModel) {
+  return video.url + '/likes'
+}
+
+function getVideoDislikesActivityPubUrl (video: VideoModel) {
+  return video.url + '/dislikes'
+}
+
 function getActorFollowActivityPubUrl (actorFollow: ActorFollowModel) {
   const me = actorFollow.ActorFollower
   const following = actorFollow.ActorFollowing
@@ -81,5 +97,9 @@ export {
   getVideoLikeActivityPubUrl,
   getVideoDislikeActivityPubUrl,
   getVideoCommentActivityPubUrl,
-  getDeleteActivityPubUrl
+  getDeleteActivityPubUrl,
+  getVideoSharesActivityPubUrl,
+  getVideoCommentsActivityPubUrl,
+  getVideoLikesActivityPubUrl,
+  getVideoDislikesActivityPubUrl
 }
index 8e1acdd44e6d17e9385790c8e2f227bc943d5407..4e572a16b5f9ef62fcfb43dc8298bff5d4942249 100644 (file)
@@ -58,6 +58,12 @@ import {
   VIDEO_LICENCES,
   VIDEO_PRIVACIES
 } from '../../initializers'
+import {
+  getVideoCommentsActivityPubUrl,
+  getVideoDislikesActivityPubUrl,
+  getVideoLikesActivityPubUrl,
+  getVideoSharesActivityPubUrl
+} from '../../lib/activitypub'
 import { sendDeleteVideo } from '../../lib/activitypub/send'
 import { AccountModel } from '../account/account'
 import { AccountVideoRateModel } from '../account/account-video-rate'
@@ -958,30 +964,19 @@ export class VideoModel extends Model<VideoModel> {
         }
       }
 
-      likesObject = activityPubCollection(likes)
-      dislikesObject = activityPubCollection(dislikes)
+      const res = this.toRatesActivityPubObjects()
+      likesObject = res.likesObject
+      dislikesObject = res.dislikesObject
     }
 
     let sharesObject
     if (Array.isArray(this.VideoShares)) {
-      const shares: string[] = []
-
-      for (const videoShare of this.VideoShares) {
-        shares.push(videoShare.url)
-      }
-
-      sharesObject = activityPubCollection(shares)
+      sharesObject = this.toAnnouncesActivityPubObject()
     }
 
     let commentsObject
     if (Array.isArray(this.VideoComments)) {
-      const comments: string[] = []
-
-      for (const videoComment of this.VideoComments) {
-        comments.push(videoComment.url)
-      }
-
-      commentsObject = activityPubCollection(comments)
+      commentsObject = this.toCommentsActivityPubObject()
     }
 
     const url = []
@@ -1058,6 +1053,44 @@ export class VideoModel extends Model<VideoModel> {
     }
   }
 
+  toAnnouncesActivityPubObject () {
+    const shares: string[] = []
+
+    for (const videoShare of this.VideoShares) {
+      shares.push(videoShare.url)
+    }
+
+    return activityPubCollection(getVideoSharesActivityPubUrl(this), shares)
+  }
+
+  toCommentsActivityPubObject () {
+    const comments: string[] = []
+
+    for (const videoComment of this.VideoComments) {
+      comments.push(videoComment.url)
+    }
+
+    return activityPubCollection(getVideoCommentsActivityPubUrl(this), comments)
+  }
+
+  toRatesActivityPubObjects () {
+    const likes: string[] = []
+    const dislikes: string[] = []
+
+    for (const rate of this.AccountVideoRates) {
+      if (rate.type === 'like') {
+        likes.push(rate.Account.Actor.url)
+      } else if (rate.type === 'dislike') {
+        dislikes.push(rate.Account.Actor.url)
+      }
+    }
+
+    const likesObject = activityPubCollection(getVideoLikesActivityPubUrl(this), likes)
+    const dislikesObject = activityPubCollection(getVideoDislikesActivityPubUrl(this), dislikes)
+
+    return { likesObject, dislikesObject }
+  }
+
   getTruncatedDescription () {
     if (!this.description) return null