1 import { Transaction } from 'sequelize'
9 } from '../../../../shared/models/activitypub'
10 import { ActorModel } from '../../../models/activitypub/actor'
11 import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
12 import { VideoModel } from '../../../models/video/video'
13 import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
14 import { broadcastToFollowers, unicastTo } from './utils'
15 import { audiencify, getActorsInvolvedInVideo, getAudience, getObjectFollowersAudience, getVideoAudience } from '../audience'
16 import { createActivityData, createDislikeActivityData } from './send-create'
17 import { followActivityData } from './send-follow'
18 import { likeActivityData } from './send-like'
19 import { VideoShareModel } from '../../../models/video/video-share'
20 import { buildVideoAnnounce } from './send-announce'
22 async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
23 const me = actorFollow.ActorFollower
24 const following = actorFollow.ActorFollowing
26 const followUrl = getActorFollowActivityPubUrl(actorFollow)
27 const undoUrl = getUndoActivityPubUrl(followUrl)
29 const object = followActivityData(followUrl, me, following)
30 const data = undoActivityData(undoUrl, me, object)
32 return unicastTo(data, me, following.inboxUrl)
35 async function sendUndoLike (byActor: ActorModel, video: VideoModel, t: Transaction) {
36 const likeUrl = getVideoLikeActivityPubUrl(byActor, video)
37 const undoUrl = getUndoActivityPubUrl(likeUrl)
39 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
40 const object = likeActivityData(likeUrl, byActor, video)
43 if (video.isOwned() === false) {
44 const audience = getVideoAudience(video, actorsInvolvedInVideo)
45 const data = undoActivityData(undoUrl, byActor, object, audience)
47 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
50 const audience = getObjectFollowersAudience(actorsInvolvedInVideo)
51 const data = undoActivityData(undoUrl, byActor, object, audience)
53 const followersException = [ byActor ]
54 return broadcastToFollowers(data, byActor, actorsInvolvedInVideo, t, followersException)
57 async function sendUndoDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
58 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
59 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
61 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
62 const dislikeActivity = createDislikeActivityData(byActor, video)
63 const object = createActivityData(dislikeUrl, byActor, dislikeActivity)
65 if (video.isOwned() === false) {
66 const audience = getVideoAudience(video, actorsInvolvedInVideo)
67 const data = undoActivityData(undoUrl, byActor, object, audience)
69 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
72 const data = undoActivityData(undoUrl, byActor, object)
74 const followersException = [ byActor ]
75 return broadcastToFollowers(data, byActor, actorsInvolvedInVideo, t, followersException)
78 async function sendUndoAnnounce (byActor: ActorModel, videoShare: VideoShareModel, video: VideoModel, t: Transaction) {
79 const undoUrl = getUndoActivityPubUrl(videoShare.url)
81 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
82 const object = await buildVideoAnnounce(byActor, videoShare, video, t)
83 const data = undoActivityData(undoUrl, byActor, object)
85 const followersException = [ byActor ]
86 return broadcastToFollowers(data, byActor, actorsInvolvedInVideo, t, followersException)
89 // ---------------------------------------------------------------------------
98 // ---------------------------------------------------------------------------
100 function undoActivityData (
103 object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce,
104 audience?: ActivityAudience
106 if (!audience) audience = getAudience(byActor)
110 type: 'Undo' as 'Undo',