Fix lint
[oweals/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 }