From 46531a0abdd5c860a1a8cdb4b636b9c55bfb115b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 29 Jan 2018 10:52:19 +0100 Subject: [PATCH] Add id to likes/dislikes/comments/shares collections --- server/controllers/activitypub/client.ts | 56 ++++++++++++++++++++ server/helpers/activitypub.ts | 3 +- server/lib/activitypub/url.ts | 22 +++++++- server/models/video/video.ts | 65 ++++++++++++++++++------ 4 files changed, 128 insertions(+), 18 deletions(-) diff --git a/server/controllers/activitypub/client.ts b/server/controllers/activitypub/client.ts index 7b60cc311..55bd85c48 100644 --- a/server/controllers/activitypub/client.ts +++ b/server/controllers/activitypub/client.ts @@ -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 diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts index 97115680c..aa5485850 100644 --- a/server/helpers/activitypub.ts +++ b/server/helpers/activitypub.ts @@ -25,8 +25,9 @@ function activityPubContextify (data: T) { }) } -function activityPubCollection (results: any[]) { +function activityPubCollection (url: string, results: any[]) { return { + id: url, type: 'OrderedCollection', totalItems: results.length, orderedItems: results diff --git a/server/lib/activitypub/url.ts b/server/lib/activitypub/url.ts index 5705afbd6..ba3bf688d 100644 --- a/server/lib/activitypub/url.ts +++ b/server/lib/activitypub/url.ts @@ -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 } diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 8e1acdd44..4e572a16b 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -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 { } } - 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 { } } + 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