1 import { Transaction } from 'sequelize'
8 } from '../../../../shared/models/activitypub/activity'
9 import { AccountInstance } from '../../../models'
10 import { AccountFollowInstance } from '../../../models/account/account-follow-interface'
11 import { VideoInstance } from '../../../models/video/video-interface'
12 import { getAccountFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
13 import { broadcastToFollowers, getAccountsInvolvedInVideo, getAudience, getVideoFollowersAudience, unicastTo } from './misc'
14 import { createActivityData, createDislikeActivityData } from './send-create'
15 import { followActivityData } from './send-follow'
16 import { likeActivityData } from './send-like'
18 async function sendUndoFollow (accountFollow: AccountFollowInstance, t: Transaction) {
19 const me = accountFollow.AccountFollower
20 const following = accountFollow.AccountFollowing
22 const followUrl = getAccountFollowActivityPubUrl(accountFollow)
23 const undoUrl = getUndoActivityPubUrl(followUrl)
25 const object = await followActivityData(followUrl, me, following)
26 const data = await undoActivityData(undoUrl, me, object)
28 return unicastTo(data, me, following.inboxUrl, t)
31 async function sendUndoLikeToOrigin (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
32 const likeUrl = getVideoLikeActivityPubUrl(byAccount, video)
33 const undoUrl = getUndoActivityPubUrl(likeUrl)
35 const object = await likeActivityData(likeUrl, byAccount, video)
36 const data = await undoActivityData(undoUrl, byAccount, object)
38 return unicastTo(data, byAccount, video.VideoChannel.Account.sharedInboxUrl, t)
41 async function sendUndoLikeToVideoFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
42 const likeUrl = getVideoLikeActivityPubUrl(byAccount, video)
43 const undoUrl = getUndoActivityPubUrl(likeUrl)
45 const toAccountsFollowers = await getAccountsInvolvedInVideo(video)
46 const audience = getVideoFollowersAudience(toAccountsFollowers)
47 const object = await likeActivityData(likeUrl, byAccount, video)
48 const data = await undoActivityData(undoUrl, byAccount, object, audience)
50 const followersException = [ byAccount ]
51 return broadcastToFollowers(data, byAccount, toAccountsFollowers, t, followersException)
54 async function sendUndoDislikeToOrigin (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
55 const dislikeUrl = getVideoDislikeActivityPubUrl(byAccount, video)
56 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
58 const dislikeActivity = createDislikeActivityData(byAccount, video)
59 const object = await createActivityData(undoUrl, byAccount, dislikeActivity)
61 const data = await undoActivityData(undoUrl, byAccount, object)
63 return unicastTo(data, byAccount, video.VideoChannel.Account.sharedInboxUrl, t)
66 async function sendUndoDislikeToVideoFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
67 const dislikeUrl = getVideoDislikeActivityPubUrl(byAccount, video)
68 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
70 const dislikeActivity = createDislikeActivityData(byAccount, video)
71 const object = await createActivityData(undoUrl, byAccount, dislikeActivity)
73 const data = await undoActivityData(undoUrl, byAccount, object)
75 const toAccountsFollowers = await getAccountsInvolvedInVideo(video)
77 const followersException = [ byAccount ]
78 return broadcastToFollowers(data, byAccount, toAccountsFollowers, t, followersException)
81 // ---------------------------------------------------------------------------
86 sendUndoLikeToVideoFollowers,
87 sendUndoDislikeToOrigin,
88 sendUndoDislikeToVideoFollowers
91 // ---------------------------------------------------------------------------
93 async function undoActivityData (
95 byAccount: AccountInstance,
96 object: ActivityFollow | ActivityLike | ActivityCreate,
97 audience?: ActivityAudience
100 audience = await getAudience(byAccount)
103 const activity: ActivityUndo = {
106 actor: byAccount.url,