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