]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/send/send-announce.ts
Move models to typescript-sequelize
[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'
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 }