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