]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/send/send-undo.ts
Federate likes/dislikes
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / send / send-undo.ts
1 import { Transaction } from 'sequelize'
2 import { ActivityCreate, ActivityFollow, ActivityLike, ActivityUndo } from '../../../../shared/models/activitypub/activity'
3 import { AccountInstance } from '../../../models'
4 import { AccountFollowInstance } from '../../../models/account/account-follow-interface'
5 import { broadcastToFollowers, getAccountsToForwardVideoAction, unicastTo } from './misc'
6 import { followActivityData } from './send-follow'
7 import { getAccountFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
8 import { VideoInstance } from '../../../models/video/video-interface'
9 import { likeActivityData } from './send-like'
10 import { createActivityData, createDislikeActivityData } from './send-create'
11 import { getServerAccount } from '../../../helpers/utils'
12
13 async function sendUndoFollow (accountFollow: AccountFollowInstance, t: Transaction) {
14 const me = accountFollow.AccountFollower
15 const following = accountFollow.AccountFollowing
16
17 const followUrl = getAccountFollowActivityPubUrl(accountFollow)
18 const undoUrl = getUndoActivityPubUrl(followUrl)
19
20 const object = await followActivityData(followUrl, me, following)
21 const data = await undoActivityData(undoUrl, me, object)
22
23 return unicastTo(data, me, following.inboxUrl, t)
24 }
25
26 async function sendUndoLikeToOrigin (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
27 const likeUrl = getVideoLikeActivityPubUrl(byAccount, video)
28 const undoUrl = getUndoActivityPubUrl(likeUrl)
29
30 const object = await likeActivityData(likeUrl, byAccount, video)
31 const data = await undoActivityData(undoUrl, byAccount, object)
32
33 return unicastTo(data, byAccount, video.VideoChannel.Account.sharedInboxUrl, t)
34 }
35
36 async function sendUndoLikeToVideoFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
37 const likeUrl = getVideoLikeActivityPubUrl(byAccount, video)
38 const undoUrl = getUndoActivityPubUrl(likeUrl)
39
40 const object = await likeActivityData(likeUrl, byAccount, video)
41 const data = await undoActivityData(undoUrl, byAccount, object)
42
43 const accountsToForwardView = await getAccountsToForwardVideoAction(byAccount, video)
44 const serverAccount = await getServerAccount()
45
46 const followersException = [ byAccount ]
47 return broadcastToFollowers(data, serverAccount, accountsToForwardView, t, followersException)
48 }
49
50 async function sendUndoDislikeToOrigin (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
51 const dislikeUrl = getVideoDislikeActivityPubUrl(byAccount, video)
52 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
53
54 const dislikeActivity = createDislikeActivityData(byAccount, video)
55 const object = await createActivityData(undoUrl, byAccount, dislikeActivity)
56
57 const data = await undoActivityData(undoUrl, byAccount, object)
58
59 return unicastTo(data, byAccount, video.VideoChannel.Account.sharedInboxUrl, t)
60 }
61
62 async function sendUndoDislikeToVideoFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
63 const dislikeUrl = getVideoDislikeActivityPubUrl(byAccount, video)
64 const undoUrl = getUndoActivityPubUrl(dislikeUrl)
65
66 const dislikeActivity = createDislikeActivityData(byAccount, video)
67 const object = await createActivityData(undoUrl, byAccount, dislikeActivity)
68
69 const data = await undoActivityData(undoUrl, byAccount, object)
70
71 const accountsToForwardView = await getAccountsToForwardVideoAction(byAccount, video)
72 const serverAccount = await getServerAccount()
73
74 const followersException = [ byAccount ]
75 return broadcastToFollowers(data, serverAccount, accountsToForwardView, t, followersException)
76 }
77
78
79 // ---------------------------------------------------------------------------
80
81 export {
82 sendUndoFollow,
83 sendUndoLikeToOrigin,
84 sendUndoLikeToVideoFollowers,
85 sendUndoDislikeToOrigin,
86 sendUndoDislikeToVideoFollowers
87 }
88
89 // ---------------------------------------------------------------------------
90
91 async function undoActivityData (url: string, byAccount: AccountInstance, object: ActivityFollow | ActivityLike | ActivityCreate) {
92 const activity: ActivityUndo = {
93 type: 'Undo',
94 id: url,
95 actor: byAccount.url,
96 object
97 }
98
99 return activity
100 }