]>
Commit | Line | Data |
---|---|---|
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', | |
112 | id: url, | |
113 | actor: byActor.url, | |
114 | object | |
115 | }, audience) | |
116 | } |