]>
Commit | Line | Data |
---|---|---|
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 | } |