Add id to likes/dislikes/comments/shares collections

This commit is contained in:
Chocobozzz 2018-01-29 10:52:19 +01:00
parent c88593f72f
commit 46531a0abd
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
4 changed files with 128 additions and 18 deletions

View 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

View 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

View 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
}

View 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