1 import { Transaction } from 'sequelize'
2 import { ActivityAudience, ActivityCreate, ActivityFollow, ActivityLike, ActivityUndo } from '../../../../shared/models/activitypub'
3 import { ActorModel } from '../../../models/activitypub/actor'
4 import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
5 import { VideoModel } from '../../../models/video/video'
6 import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
10 getActorsInvolvedInVideo,
12 getObjectFollowersAudience,
13 getOriginVideoAudience,
16 import { createActivityData, createDislikeActivityData } from './send-create'
17 import { followActivityData } from './send-follow'
18 import { likeActivityData } from './send-like'
20 async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
21 const me = actorFollow.ActorFollower
22 const following = actorFollow.ActorFollowing
24 const followUrl = getActorFollowActivityPubUrl(actorFollow)
25 const undoUrl = getUndoActivityPubUrl(followUrl)
27 const object = followActivityData(followUrl, me, following)
28 const data = await undoActivityData(undoUrl, me, object, t)
30 return unicastTo(data, me, following.inboxUrl)
33 async function sendUndoLikeToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
34 const likeUrl = getVideoLikeActivityPubUrl(byActor, video)
35 const undoUrl = getUndoActivityPubUrl(likeUrl)
37 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
38 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
39 const object = await likeActivityData(likeUrl, byActor, video, t)
40 const data = await undoActivityData(undoUrl, byActor, object, t, audience)
42 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
45 async function sendUndoLikeToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
46 const likeUrl = getVideoLikeActivityPubUrl(byActor, video)
47 const undoUrl = getUndoActivityPubUrl(likeUrl)
49 const toActorsFollowers = await getActorsInvolvedInVideo(video, t)
50 const audience = getObjectFollowersAudience(toActorsFollowers)
51 const object = await likeActivityData(likeUrl, byActor, video, t)
52 const data = await undoActivityData(undoUrl, byActor, object, t, audience)
54 const followersException = [ byActor ]
55 return broadcastToFollowers(data, byActor, toActorsFollowers, t, followersException)
58 async function sendUndoDislikeToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
59 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
60 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
62 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
63 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
64 const dislikeActivity = createDislikeActivityData(byActor, video)
65 const object = await createActivityData(undoUrl, byActor, dislikeActivity, t)
67 const data = await undoActivityData(undoUrl, byActor, object, t, audience)
69 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
72 async function sendUndoDislikeToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
73 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
74 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
76 const dislikeActivity = createDislikeActivityData(byActor, video)
77 const object = await createActivityData(undoUrl, byActor, dislikeActivity, t)
79 const data = await undoActivityData(undoUrl, byActor, object, t)
81 const toActorsFollowers = await getActorsInvolvedInVideo(video, t)
83 const followersException = [ byActor ]
84 return broadcastToFollowers(data, byActor, toActorsFollowers, t, followersException)
87 // ---------------------------------------------------------------------------
92 sendUndoLikeToVideoFollowers,
93 sendUndoDislikeToOrigin,
94 sendUndoDislikeToVideoFollowers
97 // ---------------------------------------------------------------------------
99 async function undoActivityData (
102 object: ActivityFollow | ActivityLike | ActivityCreate,
104 audience?: ActivityAudience
105 ): Promise<ActivityUndo> {
107 audience = await getAudience(byActor, t)