]>
Commit | Line | Data |
---|---|---|
54141398 | 1 | import { Transaction } from 'sequelize' |
0f320037 C |
2 | import { |
3 | ActivityAnnounce, | |
4 | ActivityAudience, | |
1e7eb25f | 5 | ActivityCreate, ActivityDislike, |
0f320037 C |
6 | ActivityFollow, |
7 | ActivityLike, | |
8 | ActivityUndo | |
9 | } from '../../../../shared/models/activitypub' | |
50d6de9c C |
10 | import { ActorModel } from '../../../models/activitypub/actor' |
11 | import { ActorFollowModel } from '../../../models/activitypub/actor-follow' | |
3fd3ab2d | 12 | import { VideoModel } from '../../../models/video/video' |
50d6de9c | 13 | import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url' |
a2377d15 C |
14 | import { broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils' |
15 | import { audiencify, getAudience } from '../audience' | |
1e7eb25f | 16 | import { buildCreateActivity } from './send-create' |
c48e82b5 C |
17 | import { buildFollowActivity } from './send-follow' |
18 | import { buildLikeActivity } from './send-like' | |
0f320037 | 19 | import { VideoShareModel } from '../../../models/video/video-share' |
c48e82b5 | 20 | import { buildAnnounceWithVideoAudience } from './send-announce' |
8e0fd45e | 21 | import { logger } from '../../../helpers/logger' |
c48e82b5 | 22 | import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy' |
1e7eb25f | 23 | import { buildDislikeActivity } from './send-dislike' |
54141398 | 24 | |
50d6de9c C |
25 | async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) { |
26 | const me = actorFollow.ActorFollower | |
27 | const following = actorFollow.ActorFollowing | |
54141398 | 28 | |
06a05d5f C |
29 | // Same server as ours |
30 | if (!following.serverId) return | |
31 | ||
8e0fd45e C |
32 | logger.info('Creating job to send an unfollow request to %s.', following.url) |
33 | ||
50d6de9c | 34 | const followUrl = getActorFollowActivityPubUrl(actorFollow) |
54141398 C |
35 | const undoUrl = getUndoActivityPubUrl(followUrl) |
36 | ||
c48e82b5 C |
37 | const followActivity = buildFollowActivity(followUrl, me, following) |
38 | const undoActivity = undoActivityData(undoUrl, me, followActivity) | |
54141398 | 39 | |
c48e82b5 | 40 | return unicastTo(undoActivity, me, following.inboxUrl) |
54141398 C |
41 | } |
42 | ||
a2377d15 C |
43 | async function sendUndoAnnounce (byActor: ActorModel, videoShare: VideoShareModel, video: VideoModel, t: Transaction) { |
44 | logger.info('Creating job to undo announce %s.', videoShare.url) | |
8e0fd45e | 45 | |
a2377d15 | 46 | const undoUrl = getUndoActivityPubUrl(videoShare.url) |
0032ebe9 | 47 | |
a2377d15 C |
48 | const { activity: announceActivity, actorsInvolvedInVideo } = await buildAnnounceWithVideoAudience(byActor, videoShare, video, t) |
49 | const undoActivity = undoActivityData(undoUrl, byActor, announceActivity) | |
0032ebe9 | 50 | |
a2377d15 C |
51 | const followersException = [ byActor ] |
52 | return broadcastToFollowers(undoActivity, byActor, actorsInvolvedInVideo, t, followersException) | |
53 | } | |
0032ebe9 | 54 | |
a2377d15 C |
55 | async function sendUndoLike (byActor: ActorModel, video: VideoModel, t: Transaction) { |
56 | logger.info('Creating job to undo a like of video %s.', video.url) | |
0032ebe9 | 57 | |
a2377d15 C |
58 | const likeUrl = getVideoLikeActivityPubUrl(byActor, video) |
59 | const likeActivity = buildLikeActivity(likeUrl, byActor, video) | |
0032ebe9 | 60 | |
a2377d15 | 61 | return sendUndoVideoRelatedActivity({ byActor, video, url: likeUrl, activity: likeActivity, transaction: t }) |
0032ebe9 C |
62 | } |
63 | ||
07197db4 | 64 | async function sendUndoDislike (byActor: ActorModel, video: VideoModel, t: Transaction) { |
8e0fd45e C |
65 | logger.info('Creating job to undo a dislike of video %s.', video.url) |
66 | ||
50d6de9c | 67 | const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video) |
5c6d985f | 68 | const dislikeActivity = buildDislikeActivity(dislikeUrl, byActor, video) |
0032ebe9 | 69 | |
1e7eb25f | 70 | return sendUndoVideoRelatedActivity({ byActor, video, url: dislikeUrl, activity: dislikeActivity, transaction: t }) |
c48e82b5 C |
71 | } |
72 | ||
73 | async function sendUndoCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel, t: Transaction) { | |
74 | logger.info('Creating job to undo cache file %s.', redundancyModel.url) | |
75 | ||
09209296 C |
76 | const videoId = redundancyModel.getVideo().id |
77 | const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId) | |
c48e82b5 C |
78 | const createActivity = buildCreateActivity(redundancyModel.url, byActor, redundancyModel.toActivityPubObject()) |
79 | ||
a2377d15 | 80 | return sendUndoVideoRelatedActivity({ byActor, video, url: redundancyModel.url, activity: createActivity, transaction: t }) |
0f320037 C |
81 | } |
82 | ||
54141398 C |
83 | // --------------------------------------------------------------------------- |
84 | ||
85 | export { | |
0032ebe9 | 86 | sendUndoFollow, |
07197db4 | 87 | sendUndoLike, |
0f320037 | 88 | sendUndoDislike, |
c48e82b5 C |
89 | sendUndoAnnounce, |
90 | sendUndoCacheFile | |
54141398 C |
91 | } |
92 | ||
93 | // --------------------------------------------------------------------------- | |
94 | ||
2186386c | 95 | function undoActivityData ( |
63c93323 | 96 | url: string, |
50d6de9c | 97 | byActor: ActorModel, |
1e7eb25f | 98 | object: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce, |
63c93323 | 99 | audience?: ActivityAudience |
2186386c C |
100 | ): ActivityUndo { |
101 | if (!audience) audience = getAudience(byActor) | |
102 | ||
103 | return audiencify( | |
104 | { | |
105 | type: 'Undo' as 'Undo', | |
106 | id: url, | |
107 | actor: byActor.url, | |
108 | object | |
109 | }, | |
110 | audience | |
111 | ) | |
54141398 | 112 | } |
a2377d15 C |
113 | |
114 | async function sendUndoVideoRelatedActivity (options: { | |
115 | byActor: ActorModel, | |
116 | video: VideoModel, | |
117 | url: string, | |
1e7eb25f | 118 | activity: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce, |
a2377d15 C |
119 | transaction: Transaction |
120 | }) { | |
121 | const activityBuilder = (audience: ActivityAudience) => { | |
122 | const undoUrl = getUndoActivityPubUrl(options.url) | |
123 | ||
124 | return undoActivityData(undoUrl, options.byActor, options.activity, audience) | |
125 | } | |
126 | ||
127 | return sendVideoRelatedActivity(activityBuilder, options) | |
128 | } |