Fix delete comment federation
[oweals/peertube.git] / server / lib / activitypub / send / send-undo.ts
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'
7 import {
8   audiencify,
9   broadcastToFollowers,
10   getActorsInvolvedInVideo,
11   getAudience,
12   getObjectFollowersAudience,
13   getOriginVideoAudience,
14   unicastTo
15 } from './misc'
16 import { createActivityData, createDislikeActivityData } from './send-create'
17 import { followActivityData } from './send-follow'
18 import { likeActivityData } from './send-like'
19
20 async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
21   const me = actorFollow.ActorFollower
22   const following = actorFollow.ActorFollowing
23
24   const followUrl = getActorFollowActivityPubUrl(actorFollow)
25   const undoUrl = getUndoActivityPubUrl(followUrl)
26
27   const object = followActivityData(followUrl, me, following)
28   const data = await undoActivityData(undoUrl, me, object, t)
29
30   return unicastTo(data, me, following.inboxUrl)
31 }
32
33 async function sendUndoLikeToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
34   const likeUrl = getVideoLikeActivityPubUrl(byActor, video)
35   const undoUrl = getUndoActivityPubUrl(likeUrl)
36
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)
41
42   return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
43 }
44
45 async function sendUndoLikeToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
46   const likeUrl = getVideoLikeActivityPubUrl(byActor, video)
47   const undoUrl = getUndoActivityPubUrl(likeUrl)
48
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)
53
54   const followersException = [ byActor ]
55   return broadcastToFollowers(data, byActor, toActorsFollowers, t, followersException)
56 }
57
58 async function sendUndoDislikeToOrigin (byActor: ActorModel, video: VideoModel, t: Transaction) {
59   const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
60   const undoUrl = getUndoActivityPubUrl(dislikeUrl)
61
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)
66
67   const data = await undoActivityData(undoUrl, byActor, object, t, audience)
68
69   return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
70 }
71
72 async function sendUndoDislikeToVideoFollowers (byActor: ActorModel, video: VideoModel, t: Transaction) {
73   const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
74   const undoUrl = getUndoActivityPubUrl(dislikeUrl)
75
76   const dislikeActivity = createDislikeActivityData(byActor, video)
77   const object = await createActivityData(undoUrl, byActor, dislikeActivity, t)
78
79   const data = await undoActivityData(undoUrl, byActor, object, t)
80
81   const toActorsFollowers = await getActorsInvolvedInVideo(video, t)
82
83   const followersException = [ byActor ]
84   return broadcastToFollowers(data, byActor, toActorsFollowers, t, followersException)
85 }
86
87 // ---------------------------------------------------------------------------
88
89 export {
90   sendUndoFollow,
91   sendUndoLikeToOrigin,
92   sendUndoLikeToVideoFollowers,
93   sendUndoDislikeToOrigin,
94   sendUndoDislikeToVideoFollowers
95 }
96
97 // ---------------------------------------------------------------------------
98
99 async function undoActivityData (
100   url: string,
101   byActor: ActorModel,
102   object: ActivityFollow | ActivityLike | ActivityCreate,
103   t: Transaction,
104   audience?: ActivityAudience
105 ): Promise<ActivityUndo> {
106   if (!audience) {
107     audience = await getAudience(byActor, t)
108   }
109
110   return audiencify({
111     type: 'Undo' as 'Undo',
112     id: url,
113     actor: byActor.url,
114     object
115   }, audience)
116 }