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'
11 audiencify, broadcastToFollowers, getActorsInvolvedInVideo, getAudience, getObjectFollowersAudience, getOriginVideoAudience,
15 async function sendCreateVideo (video: VideoModel, t: Transaction) {
16 if (video.privacy === VideoPrivacy.PRIVATE) return undefined
18 const byActor = video.VideoChannel.Account.Actor
19 const videoObject = video.toActivityPubObject()
21 const audience = await getAudience(byActor, t, video.privacy === VideoPrivacy.PUBLIC)
22 const data = await createActivityData(video.url, byActor, videoObject, t, audience)
24 return broadcastToFollowers(data, byActor, [ byActor ], t)
27 async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel, t: Transaction) {
28 const url = getVideoAbuseActivityPubUrl(videoAbuse)
30 const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
31 const data = await createActivityData(url, byActor, videoAbuse.toActivityPubObject(), t, audience)
33 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl, t)
36 async function sendCreateVideoCommentToOrigin (comment: VideoCommentModel, t: Transaction) {
37 const byActor = comment.Account.Actor
39 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(comment.Video, t)
40 const audience = getOriginVideoAudience(comment.Video, actorsInvolvedInVideo)
42 const commentObject = comment.toActivityPubObject()
43 const data = await createActivityData(comment.url, byActor, commentObject, t, audience)
45 return unicastTo(data, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl, t)
48 async function sendCreateVideoCommentToVideoFollowers (comment: VideoCommentModel, t: Transaction) {
49 const byActor = comment.Account.Actor
51 const actorsToForwardView = await getActorsInvolvedInVideo(comment.Video, t)
52 const audience = getObjectFollowersAudience(actorsToForwardView)
54 const commentObject = comment.toActivityPubObject()
55 const data = await createActivityData(comment.url, byActor, commentObject, t, audience)
57 const followersException = [ byActor ]
58 return broadcastToFollowers(data, byActor, actorsToForwardView, t, followersException)
61 async function sendCreateViewToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
62 const url = getVideoViewActivityPubUrl(byActor, video)
63 const viewActivityData = createViewActivityData(byActor, video)
65 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
66 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
67 const data = await createActivityData(url, byActor, viewActivityData, t, audience)
69 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl, t)
72 async function sendCreateViewToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
73 const url = getVideoViewActivityPubUrl(byActor, video)
74 const viewActivityData = createViewActivityData(byActor, video)
76 const actorsToForwardView = await getActorsInvolvedInVideo(video, t)
77 const audience = getObjectFollowersAudience(actorsToForwardView)
78 const data = await createActivityData(url, byActor, viewActivityData, t, audience)
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)
86 async function sendCreateDislikeToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
87 const url = getVideoDislikeActivityPubUrl(byActor, video)
88 const dislikeActivityData = createDislikeActivityData(byActor, video)
90 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
91 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
92 const data = await createActivityData(url, byActor, dislikeActivityData, t, audience)
94 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl, t)
97 async function sendCreateDislikeToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
98 const url = getVideoDislikeActivityPubUrl(byActor, video)
99 const dislikeActivityData = createDislikeActivityData(byActor, video)
101 const actorsToForwardView = await getActorsInvolvedInVideo(video, t)
102 const audience = getObjectFollowersAudience(actorsToForwardView)
103 const data = await createActivityData(url, byActor, dislikeActivityData, t, audience)
105 const followersException = [ byActor ]
106 return broadcastToFollowers(data, byActor, actorsToForwardView, t, followersException)
109 async function createActivityData (
114 audience?: ActivityAudience
115 ): Promise<ActivityCreate> {
117 audience = await getAudience(byActor, t)
124 object: audiencify(object, audience)
128 function createDislikeActivityData (byActor: ActorModel, video: VideoModel) {
136 function createViewActivityData (byActor: ActorModel, video: VideoModel) {
144 // ---------------------------------------------------------------------------
150 sendCreateViewToOrigin,
151 sendCreateViewToVideoFollowers,
152 sendCreateDislikeToOrigin,
153 sendCreateDislikeToVideoFollowers,
154 createDislikeActivityData,
155 sendCreateVideoCommentToOrigin,
156 sendCreateVideoCommentToVideoFollowers