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