]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/send/send-create.ts
Propagate old comment on new follow
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / send / send-create.ts
1 import { Transaction } from 'sequelize'
2 import { ActivityAudience, ActivityCreate } from '../../../../shared/models/activitypub'
3 import { VideoPrivacy } from '../../../../shared/models/videos'
4 import { getServerActor } from '../../../helpers/utils'
5 import { ActorModel } from '../../../models/activitypub/actor'
6 import { VideoModel } from '../../../models/video/video'
7 import { VideoAbuseModel } from '../../../models/video/video-abuse'
8 import { VideoCommentModel } from '../../../models/video/video-comment'
9 import { getVideoAbuseActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoViewActivityPubUrl } from '../url'
10 import {
11 audiencify, broadcastToFollowers, getActorsInvolvedInVideo, getAudience, getObjectFollowersAudience, getOriginVideoAudience,
12 unicastTo
13 } from './misc'
14
15 async function sendCreateVideo (video: VideoModel, t: Transaction) {
16 if (video.privacy === VideoPrivacy.PRIVATE) return undefined
17
18 const byActor = video.VideoChannel.Account.Actor
19 const videoObject = video.toActivityPubObject()
20
21 const audience = await getAudience(byActor, t, video.privacy === VideoPrivacy.PUBLIC)
22 const data = await createActivityData(video.url, byActor, videoObject, t, audience)
23
24 return broadcastToFollowers(data, byActor, [ byActor ], t)
25 }
26
27 async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel, t: Transaction) {
28 const url = getVideoAbuseActivityPubUrl(videoAbuse)
29
30 const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
31 const data = await createActivityData(url, byActor, videoAbuse.toActivityPubObject(), t, audience)
32
33 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl, t)
34 }
35
36 async function sendCreateVideoCommentToOrigin (comment: VideoCommentModel, t: Transaction) {
37 const byActor = comment.Account.Actor
38
39 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(comment.Video, t)
40 const audience = getOriginVideoAudience(comment.Video, actorsInvolvedInVideo)
41
42 const commentObject = comment.toActivityPubObject()
43 const data = await createActivityData(comment.url, byActor, commentObject, t, audience)
44
45 return unicastTo(data, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl, t)
46 }
47
48 async function sendCreateVideoCommentToVideoFollowers (comment: VideoCommentModel, t: Transaction) {
49 const byActor = comment.Account.Actor
50
51 const actorsToForwardView = await getActorsInvolvedInVideo(comment.Video, t)
52 const audience = getObjectFollowersAudience(actorsToForwardView)
53
54 const commentObject = comment.toActivityPubObject()
55 const data = await createActivityData(comment.url, byActor, commentObject, t, audience)
56
57 const followersException = [ byActor ]
58 return broadcastToFollowers(data, byActor, actorsToForwardView, t, followersException)
59 }
60
61 async function sendCreateViewToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
62 const url = getVideoViewActivityPubUrl(byActor, video)
63 const viewActivityData = createViewActivityData(byActor, video)
64
65 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
66 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
67 const data = await createActivityData(url, byActor, viewActivityData, t, audience)
68
69 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl, t)
70 }
71
72 async function sendCreateViewToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
73 const url = getVideoViewActivityPubUrl(byActor, video)
74 const viewActivityData = createViewActivityData(byActor, video)
75
76 const actorsToForwardView = await getActorsInvolvedInVideo(video, t)
77 const audience = getObjectFollowersAudience(actorsToForwardView)
78 const data = await createActivityData(url, byActor, viewActivityData, t, audience)
79
80 // Use the server actor to send the view
81 const serverActor = await getServerActor()
82 const followersException = [ byActor ]
83 return broadcastToFollowers(data, serverActor, actorsToForwardView, t, followersException)
84 }
85
86 async function sendCreateDislikeToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
87 const url = getVideoDislikeActivityPubUrl(byActor, video)
88 const dislikeActivityData = createDislikeActivityData(byActor, video)
89
90 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
91 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
92 const data = await createActivityData(url, byActor, dislikeActivityData, t, audience)
93
94 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl, t)
95 }
96
97 async function sendCreateDislikeToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
98 const url = getVideoDislikeActivityPubUrl(byActor, video)
99 const dislikeActivityData = createDislikeActivityData(byActor, video)
100
101 const actorsToForwardView = await getActorsInvolvedInVideo(video, t)
102 const audience = getObjectFollowersAudience(actorsToForwardView)
103 const data = await createActivityData(url, byActor, dislikeActivityData, t, audience)
104
105 const followersException = [ byActor ]
106 return broadcastToFollowers(data, byActor, actorsToForwardView, t, followersException)
107 }
108
109 async function createActivityData (
110 url: string,
111 byActor: ActorModel,
112 object: any,
113 t: Transaction,
114 audience?: ActivityAudience
115 ): Promise<ActivityCreate> {
116 if (!audience) {
117 audience = await getAudience(byActor, t)
118 }
119
120 return audiencify({
121 type: 'Create',
122 id: url,
123 actor: byActor.url,
124 object: audiencify(object, audience)
125 }, audience)
126 }
127
128 function createDislikeActivityData (byActor: ActorModel, video: VideoModel) {
129 return {
130 type: 'Dislike',
131 actor: byActor.url,
132 object: video.url
133 }
134 }
135
136 function createViewActivityData (byActor: ActorModel, video: VideoModel) {
137 return {
138 type: 'View',
139 actor: byActor.url,
140 object: video.url
141 }
142 }
143
144 // ---------------------------------------------------------------------------
145
146 export {
147 sendCreateVideo,
148 sendVideoAbuse,
149 createActivityData,
150 sendCreateViewToOrigin,
151 sendCreateViewToVideoFollowers,
152 sendCreateDislikeToOrigin,
153 sendCreateDislikeToVideoFollowers,
154 createDislikeActivityData,
155 sendCreateVideoCommentToOrigin,
156 sendCreateVideoCommentToVideoFollowers
157 }