]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/send/send-announce.ts
Put activity pub sends inside transactions
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / send / send-announce.ts
1 import { Transaction } from 'sequelize'
2 import { ActivityAdd } from '../../../../shared/index'
3 import { ActivityAnnounce, ActivityAudience, ActivityCreate } from '../../../../shared/models/activitypub/activity'
4 import { AccountInstance, VideoInstance } from '../../../models'
5 import { VideoChannelInstance } from '../../../models/video/video-channel-interface'
6 import { getAnnounceActivityPubUrl } from '../url'
7 import {
8 broadcastToFollowers,
9 getAccountsInvolvedInVideo,
10 getAccountsInvolvedInVideoChannel,
11 getAudience,
12 getObjectFollowersAudience,
13 getOriginVideoAudience,
14 getOriginVideoChannelAudience,
15 unicastTo
16 } from './misc'
17 import { addActivityData } from './send-add'
18 import { createActivityData } from './send-create'
19
20 async function buildVideoAnnounceToFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
21 const url = getAnnounceActivityPubUrl(video.url, byAccount)
22
23 const videoChannel = video.VideoChannel
24 const announcedActivity = await addActivityData(url, videoChannel.Account, video, videoChannel.url, video.toActivityPubObject(), t)
25
26 const accountsToForwardView = await getAccountsInvolvedInVideo(video, t)
27 const audience = getObjectFollowersAudience(accountsToForwardView)
28 const data = await announceActivityData(url, byAccount, announcedActivity, t, audience)
29
30 return data
31 }
32
33 async function sendVideoAnnounceToFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
34 const data = await buildVideoAnnounceToFollowers(byAccount, video, t)
35
36 return broadcastToFollowers(data, byAccount, [ byAccount ], t)
37 }
38
39 async function sendVideoAnnounceToOrigin (byAccount: AccountInstance, video: VideoInstance, t: Transaction) {
40 const url = getAnnounceActivityPubUrl(video.url, byAccount)
41
42 const videoChannel = video.VideoChannel
43 const announcedActivity = await addActivityData(url, videoChannel.Account, video, videoChannel.url, video.toActivityPubObject(), t)
44
45 const accountsInvolvedInVideo = await getAccountsInvolvedInVideo(video, t)
46 const audience = getOriginVideoAudience(video, accountsInvolvedInVideo)
47 const data = await createActivityData(url, byAccount, announcedActivity, t, audience)
48
49 return unicastTo(data, byAccount, videoChannel.Account.sharedInboxUrl, t)
50 }
51
52 async function buildVideoChannelAnnounceToFollowers (byAccount: AccountInstance, videoChannel: VideoChannelInstance, t: Transaction) {
53 const url = getAnnounceActivityPubUrl(videoChannel.url, byAccount)
54 const announcedActivity = await createActivityData(url, videoChannel.Account, videoChannel.toActivityPubObject(), t)
55
56 const accountsToForwardView = await getAccountsInvolvedInVideoChannel(videoChannel, t)
57 const audience = getObjectFollowersAudience(accountsToForwardView)
58 const data = await announceActivityData(url, byAccount, announcedActivity, t, audience)
59
60 return data
61 }
62
63 async function sendVideoChannelAnnounceToFollowers (byAccount: AccountInstance, videoChannel: VideoChannelInstance, t: Transaction) {
64 const data = await buildVideoChannelAnnounceToFollowers(byAccount, videoChannel, t)
65
66 return broadcastToFollowers(data, byAccount, [ byAccount ], t)
67 }
68
69 async function sendVideoChannelAnnounceToOrigin (byAccount: AccountInstance, videoChannel: VideoChannelInstance, t: Transaction) {
70 const url = getAnnounceActivityPubUrl(videoChannel.url, byAccount)
71 const announcedActivity = await createActivityData(url, videoChannel.Account, videoChannel.toActivityPubObject(), t)
72
73 const accountsInvolvedInVideo = await getAccountsInvolvedInVideoChannel(videoChannel, t)
74 const audience = getOriginVideoChannelAudience(videoChannel, accountsInvolvedInVideo)
75 const data = await createActivityData(url, byAccount, announcedActivity, t, audience)
76
77 return unicastTo(data, byAccount, videoChannel.Account.sharedInboxUrl, t)
78 }
79
80 async function announceActivityData (
81 url: string,
82 byAccount: AccountInstance,
83 object: ActivityCreate | ActivityAdd,
84 t: Transaction,
85 audience?: ActivityAudience
86 ) {
87 if (!audience) {
88 audience = await getAudience(byAccount, t)
89 }
90
91 const activity: ActivityAnnounce = {
92 type: 'Announce',
93 to: audience.to,
94 cc: audience.cc,
95 id: url,
96 actor: byAccount.url,
97 object
98 }
99
100 return activity
101 }
102
103 // ---------------------------------------------------------------------------
104
105 export {
106 sendVideoAnnounceToFollowers,
107 sendVideoChannelAnnounceToFollowers,
108 sendVideoAnnounceToOrigin,
109 sendVideoChannelAnnounceToOrigin,
110 announceActivityData,
111 buildVideoAnnounceToFollowers,
112 buildVideoChannelAnnounceToFollowers
113 }