]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/send/send-undo.ts
Fix cc field in classic audience
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / send / send-undo.ts
1 import { Transaction } from 'sequelize'
2 import {
3 ActivityAnnounce,
4 ActivityAudience,
5 ActivityCreate,
6 ActivityFollow,
7 ActivityLike,
8 ActivityUndo
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 {
15 audiencify,
16 broadcastToFollowers,
17 getActorsInvolvedInVideo,
18 getAudience,
19 getObjectFollowersAudience,
20 getOriginVideoAudience,
21 unicastTo
22 } from './misc'
23 import { createActivityData, createDislikeActivityData } from './send-create'
24 import { followActivityData } from './send-follow'
25 import { likeActivityData } from './send-like'
26 import { VideoShareModel } from '../../../models/video/video-share'
27 import { buildVideoAnnounce } from './send-announce'
28
29 async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
30 const me = actorFollow.ActorFollower
31 const following = actorFollow.ActorFollowing
32
33 const followUrl = getActorFollowActivityPubUrl(actorFollow)
34 const undoUrl = getUndoActivityPubUrl(followUrl)
35
36 const object = followActivityData(followUrl, me, following)
37 const data = await undoActivityData(undoUrl, me, object, t)
38
39 return unicastTo(data, me, following.inboxUrl)
40 }
41
42 async function sendUndoLike (byActor: ActorModel, video: VideoModel, t: Transaction) {
43 const likeUrl = getVideoLikeActivityPubUrl(byActor, video)
44 const undoUrl = getUndoActivityPubUrl(likeUrl)
45
46 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
47 const object = await likeActivityData(likeUrl, byActor, video, t)
48
49 // Send to origin
50 if (video.isOwned() === false) {
51 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
52 const data = await undoActivityData(undoUrl, byActor, object, t, audience)
53
54 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
55 }
56
57 const audience = getObjectFollowersAudience(actorsInvolvedInVideo)
58 const data = await undoActivityData(undoUrl, byActor, object, t, audience)
59
60 const followersException = [ byActor ]
61 return broadcastToFollowers(data, byActor, actorsInvolvedInVideo, t, followersException)
62 }
63
64 async function sendUndoDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
65 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
66 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
67
68 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
69 const dislikeActivity = createDislikeActivityData(byActor, video)
70 const object = await createActivityData(dislikeUrl, byActor, dislikeActivity, t)
71
72 if (video.isOwned() === false) {
73 const audience = getOriginVideoAudience(video, actorsInvolvedInVideo)
74 const data = await undoActivityData(undoUrl, byActor, object, t, audience)
75
76 return unicastTo(data, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
77 }
78
79 const data = await undoActivityData(undoUrl, byActor, object, t)
80
81 const followersException = [ byActor ]
82 return broadcastToFollowers(data, byActor, actorsInvolvedInVideo, t, followersException)
83 }
84
85 async function sendUndoAnnounce (byActor: ActorModel, videoShare: VideoShareModel, video: VideoModel, t: Transaction) {
86 const undoUrl = getUndoActivityPubUrl(videoShare.url)
87
88 const actorsInvolvedInVideo = await getActorsInvolvedInVideo(video, t)
89 const object = await buildVideoAnnounce(byActor, videoShare, video, t)
90 const data = await undoActivityData(undoUrl, byActor, object, t)
91
92 const followersException = [ byActor ]
93 return broadcastToFollowers(data, byActor, actorsInvolvedInVideo, t, followersException)
94 }
95
96 // ---------------------------------------------------------------------------
97
98 export {
99 sendUndoFollow,
100 sendUndoLike,
101 sendUndoDislike,
102 sendUndoAnnounce
103 }
104
105 // ---------------------------------------------------------------------------
106
107 async function undoActivityData (
108 url: string,
109 byActor: ActorModel,
110 object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce,
111 t: Transaction,
112 audience?: ActivityAudience
113 ): Promise<ActivityUndo> {
114 if (!audience) {
115 audience = await getAudience(byActor, t)
116 }
117
118 return audiencify({
119 type: 'Undo' as 'Undo',
120 id: url,
121 actor: byActor.url,
122 object
123 }, audience)
124 }