aboutsummaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/controllers/activitypub/client.ts56
-rw-r--r--server/helpers/activitypub.ts3
-rw-r--r--server/lib/activitypub/url.ts22
-rw-r--r--server/models/video/video.ts65
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',
36 executeIfActivityPub(asyncMiddleware(videosGetValidator)), 36 executeIfActivityPub(asyncMiddleware(videosGetValidator)),
37 executeIfActivityPub(asyncMiddleware(videoController)) 37 executeIfActivityPub(asyncMiddleware(videoController))
38) 38)
39activityPubClientRouter.get('/videos/watch/:id/announces',
40 executeIfActivityPub(asyncMiddleware(videosGetValidator)),
41 executeIfActivityPub(asyncMiddleware(videoAnnouncesController))
42)
39activityPubClientRouter.get('/videos/watch/:id/announces/:accountId', 43activityPubClientRouter.get('/videos/watch/:id/announces/:accountId',
40 executeIfActivityPub(asyncMiddleware(videosShareValidator)), 44 executeIfActivityPub(asyncMiddleware(videosShareValidator)),
41 executeIfActivityPub(asyncMiddleware(videoAnnounceController)) 45 executeIfActivityPub(asyncMiddleware(videoAnnounceController))
42) 46)
47activityPubClientRouter.get('/videos/watch/:id/likes',
48 executeIfActivityPub(asyncMiddleware(videosGetValidator)),
49 executeIfActivityPub(asyncMiddleware(videoLikesController))
50)
51activityPubClientRouter.get('/videos/watch/:id/dislikes',
52 executeIfActivityPub(asyncMiddleware(videosGetValidator)),
53 executeIfActivityPub(asyncMiddleware(videoDislikesController))
54)
55activityPubClientRouter.get('/videos/watch/:id/comments',
56 executeIfActivityPub(asyncMiddleware(videosGetValidator)),
57 executeIfActivityPub(asyncMiddleware(videoCommentsController))
58)
43activityPubClientRouter.get('/videos/watch/:videoId/comments/:commentId', 59activityPubClientRouter.get('/videos/watch/:videoId/comments/:commentId',
44 executeIfActivityPub(asyncMiddleware(videoCommentGetValidator)), 60 executeIfActivityPub(asyncMiddleware(videoCommentGetValidator)),
45 executeIfActivityPub(asyncMiddleware(videoCommentController)) 61 executeIfActivityPub(asyncMiddleware(videoCommentController))
@@ -105,6 +121,46 @@ async function videoAnnounceController (req: express.Request, res: express.Respo
105 return res.json(activityPubContextify(object)) 121 return res.json(activityPubContextify(object))
106} 122}
107 123
124async function videoAnnouncesController (req: express.Request, res: express.Response, next: express.NextFunction) {
125 const video: VideoModel = res.locals.video
126
127 // We need more attributes
128 const videoAll = await VideoModel.loadAndPopulateAll(video.id)
129 const object = videoAll.toAnnouncesActivityPubObject()
130
131 return res.json(activityPubContextify(object))
132}
133
134async function videoLikesController (req: express.Request, res: express.Response, next: express.NextFunction) {
135 const video: VideoModel = res.locals.video
136
137 // We need more attributes
138 const videoAll = await VideoModel.loadAndPopulateAll(video.id)
139 const { likesObject } = videoAll.toRatesActivityPubObjects()
140
141 return res.json(activityPubContextify(likesObject))
142}
143
144async function videoDislikesController (req: express.Request, res: express.Response, next: express.NextFunction) {
145 const video: VideoModel = res.locals.video
146
147 // We need more attributes
148 const videoAll = await VideoModel.loadAndPopulateAll(video.id)
149 const { dislikesObject } = videoAll.toRatesActivityPubObjects()
150
151 return res.json(activityPubContextify(dislikesObject))
152}
153
154async function videoCommentsController (req: express.Request, res: express.Response, next: express.NextFunction) {
155 const video: VideoModel = res.locals.video
156
157 // We need more attributes
158 const videoAll = await VideoModel.loadAndPopulateAll(video.id)
159 const commentsObject = videoAll.toCommentsActivityPubObject()
160
161 return res.json(activityPubContextify(commentsObject))
162}
163
108async function videoChannelController (req: express.Request, res: express.Response, next: express.NextFunction) { 164async function videoChannelController (req: express.Request, res: express.Response, next: express.NextFunction) {
109 const videoChannel: VideoChannelModel = res.locals.videoChannel 165 const videoChannel: VideoChannelModel = res.locals.videoChannel
110 166
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 <T> (data: T) {
25 }) 25 })
26} 26}
27 27
28function activityPubCollection (results: any[]) { 28function activityPubCollection (url: string, results: any[]) {
29 return { 29 return {
30 id: url,
30 type: 'OrderedCollection', 31 type: 'OrderedCollection',
31 totalItems: results.length, 32 totalItems: results.length,
32 orderedItems: results 33 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)
37 return byActor.url + '/dislikes/' + video.id 37 return byActor.url + '/dislikes/' + video.id
38} 38}
39 39
40function getVideoSharesActivityPubUrl (video: VideoModel) {
41 return video.url + '/announces'
42}
43
44function getVideoCommentsActivityPubUrl (video: VideoModel) {
45 return video.url + '/comments'
46}
47
48function getVideoLikesActivityPubUrl (video: VideoModel) {
49 return video.url + '/likes'
50}
51
52function getVideoDislikesActivityPubUrl (video: VideoModel) {
53 return video.url + '/dislikes'
54}
55
40function getActorFollowActivityPubUrl (actorFollow: ActorFollowModel) { 56function getActorFollowActivityPubUrl (actorFollow: ActorFollowModel) {
41 const me = actorFollow.ActorFollower 57 const me = actorFollow.ActorFollower
42 const following = actorFollow.ActorFollowing 58 const following = actorFollow.ActorFollowing
@@ -81,5 +97,9 @@ export {
81 getVideoLikeActivityPubUrl, 97 getVideoLikeActivityPubUrl,
82 getVideoDislikeActivityPubUrl, 98 getVideoDislikeActivityPubUrl,
83 getVideoCommentActivityPubUrl, 99 getVideoCommentActivityPubUrl,
84 getDeleteActivityPubUrl 100 getDeleteActivityPubUrl,
101 getVideoSharesActivityPubUrl,
102 getVideoCommentsActivityPubUrl,
103 getVideoLikesActivityPubUrl,
104 getVideoDislikesActivityPubUrl
85} 105}
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 {
58 VIDEO_LICENCES, 58 VIDEO_LICENCES,
59 VIDEO_PRIVACIES 59 VIDEO_PRIVACIES
60} from '../../initializers' 60} from '../../initializers'
61import {
62 getVideoCommentsActivityPubUrl,
63 getVideoDislikesActivityPubUrl,
64 getVideoLikesActivityPubUrl,
65 getVideoSharesActivityPubUrl
66} from '../../lib/activitypub'
61import { sendDeleteVideo } from '../../lib/activitypub/send' 67import { sendDeleteVideo } from '../../lib/activitypub/send'
62import { AccountModel } from '../account/account' 68import { AccountModel } from '../account/account'
63import { AccountVideoRateModel } from '../account/account-video-rate' 69import { AccountVideoRateModel } from '../account/account-video-rate'
@@ -958,30 +964,19 @@ export class VideoModel extends Model<VideoModel> {
958 } 964 }
959 } 965 }
960 966
961 likesObject = activityPubCollection(likes) 967 const res = this.toRatesActivityPubObjects()
962 dislikesObject = activityPubCollection(dislikes) 968 likesObject = res.likesObject
969 dislikesObject = res.dislikesObject
963 } 970 }
964 971
965 let sharesObject 972 let sharesObject
966 if (Array.isArray(this.VideoShares)) { 973 if (Array.isArray(this.VideoShares)) {
967 const shares: string[] = [] 974 sharesObject = this.toAnnouncesActivityPubObject()
968
969 for (const videoShare of this.VideoShares) {
970 shares.push(videoShare.url)
971 }
972
973 sharesObject = activityPubCollection(shares)
974 } 975 }
975 976
976 let commentsObject 977 let commentsObject
977 if (Array.isArray(this.VideoComments)) { 978 if (Array.isArray(this.VideoComments)) {
978 const comments: string[] = [] 979 commentsObject = this.toCommentsActivityPubObject()
979
980 for (const videoComment of this.VideoComments) {
981 comments.push(videoComment.url)
982 }
983
984 commentsObject = activityPubCollection(comments)
985 } 980 }
986 981
987 const url = [] 982 const url = []
@@ -1058,6 +1053,44 @@ export class VideoModel extends Model<VideoModel> {
1058 } 1053 }
1059 } 1054 }
1060 1055
1056 toAnnouncesActivityPubObject () {
1057 const shares: string[] = []
1058
1059 for (const videoShare of this.VideoShares) {
1060 shares.push(videoShare.url)
1061 }
1062
1063 return activityPubCollection(getVideoSharesActivityPubUrl(this), shares)
1064 }
1065
1066 toCommentsActivityPubObject () {
1067 const comments: string[] = []
1068
1069 for (const videoComment of this.VideoComments) {
1070 comments.push(videoComment.url)
1071 }
1072
1073 return activityPubCollection(getVideoCommentsActivityPubUrl(this), comments)
1074 }
1075
1076 toRatesActivityPubObjects () {
1077 const likes: string[] = []
1078 const dislikes: string[] = []
1079
1080 for (const rate of this.AccountVideoRates) {
1081 if (rate.type === 'like') {
1082 likes.push(rate.Account.Actor.url)
1083 } else if (rate.type === 'dislike') {
1084 dislikes.push(rate.Account.Actor.url)
1085 }
1086 }
1087
1088 const likesObject = activityPubCollection(getVideoLikesActivityPubUrl(this), likes)
1089 const dislikesObject = activityPubCollection(getVideoDislikesActivityPubUrl(this), dislikes)
1090
1091 return { likesObject, dislikesObject }
1092 }
1093
1061 getTruncatedDescription () { 1094 getTruncatedDescription () {
1062 if (!this.description) return null 1095 if (!this.description) return null
1063 1096