]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/lib/activitypub/send-request.ts
ce9a96f1464a98559f7a86e14fcc37e787f16f77
[github/Chocobozzz/PeerTube.git] / server / lib / activitypub / send-request.ts
1 import * as Sequelize from 'sequelize'
2
3 import { database as db } from '../../initializers'
4 import {
5 AccountInstance,
6 VideoInstance,
7 VideoChannelInstance
8 } from '../../models'
9 import { httpRequestJobScheduler } from '../jobs'
10 import { signObject, activityPubContextify } from '../../helpers'
11 import { Activity } from '../../../shared'
12
13 function sendCreateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) {
14 const videoChannelObject = videoChannel.toActivityPubObject()
15 const data = createActivityData(videoChannel.url, videoChannel.Account, videoChannelObject)
16
17 return broadcastToFollowers(data, videoChannel.Account, t)
18 }
19
20 function sendUpdateVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) {
21 const videoChannelObject = videoChannel.toActivityPubObject()
22 const data = updateActivityData(videoChannel.url, videoChannel.Account, videoChannelObject)
23
24 return broadcastToFollowers(data, videoChannel.Account, t)
25 }
26
27 function sendDeleteVideoChannel (videoChannel: VideoChannelInstance, t: Sequelize.Transaction) {
28 const data = deleteActivityData(videoChannel.url, videoChannel.Account)
29
30 return broadcastToFollowers(data, videoChannel.Account, t)
31 }
32
33 function sendAddVideo (video: VideoInstance, t: Sequelize.Transaction) {
34 const videoObject = video.toActivityPubObject()
35 const data = addActivityData(video.url, video.VideoChannel.Account, video.VideoChannel.url, videoObject)
36
37 return broadcastToFollowers(data, video.VideoChannel.Account, t)
38 }
39
40 function sendUpdateVideo (video: VideoInstance, t: Sequelize.Transaction) {
41 const videoObject = video.toActivityPubObject()
42 const data = updateActivityData(video.url, video.VideoChannel.Account, videoObject)
43
44 return broadcastToFollowers(data, video.VideoChannel.Account, t)
45 }
46
47 function sendDeleteVideo (video: VideoInstance, t: Sequelize.Transaction) {
48 const data = deleteActivityData(video.url, video.VideoChannel.Account)
49
50 return broadcastToFollowers(data, video.VideoChannel.Account, t)
51 }
52
53 function sendDeleteAccount (account: AccountInstance, t: Sequelize.Transaction) {
54 const data = deleteActivityData(account.url, account)
55
56 return broadcastToFollowers(data, account, t)
57 }
58
59 // ---------------------------------------------------------------------------
60
61 export {
62 sendCreateVideoChannel,
63 sendUpdateVideoChannel,
64 sendDeleteVideoChannel,
65 sendAddVideo,
66 sendUpdateVideo,
67 sendDeleteVideo,
68 sendDeleteAccount
69 }
70
71 // ---------------------------------------------------------------------------
72
73 async function broadcastToFollowers (data: any, fromAccount: AccountInstance, t: Sequelize.Transaction) {
74 const result = await db.Account.listFollowerUrlsForApi(fromAccount.id, 0)
75
76 const jobPayload = {
77 uris: result.data,
78 body: data
79 }
80
81 return httpRequestJobScheduler.createJob(t, 'httpRequestBroadcastHandler', jobPayload)
82 }
83
84 function buildSignedActivity (byAccount: AccountInstance, data: Object) {
85 const activity = activityPubContextify(data)
86
87 return signObject(byAccount, activity) as Promise<Activity>
88 }
89
90 async function getPublicActivityTo (account: AccountInstance) {
91 const inboxUrls = await account.getFollowerSharedInboxUrls()
92
93 return inboxUrls.concat('https://www.w3.org/ns/activitystreams#Public')
94 }
95
96 async function createActivityData (url: string, byAccount: AccountInstance, object: any) {
97 const to = await getPublicActivityTo(byAccount)
98 const base = {
99 type: 'Create',
100 id: url,
101 actor: byAccount.url,
102 to,
103 object
104 }
105
106 return buildSignedActivity(byAccount, base)
107 }
108
109 async function updateActivityData (url: string, byAccount: AccountInstance, object: any) {
110 const to = await getPublicActivityTo(byAccount)
111 const base = {
112 type: 'Update',
113 id: url,
114 actor: byAccount.url,
115 to,
116 object
117 }
118
119 return buildSignedActivity(byAccount, base)
120 }
121
122 async function deleteActivityData (url: string, byAccount: AccountInstance) {
123 const base = {
124 type: 'Delete',
125 id: url,
126 actor: byAccount.url
127 }
128
129 return buildSignedActivity(byAccount, base)
130 }
131
132 async function addActivityData (url: string, byAccount: AccountInstance, target: string, object: any) {
133 const to = await getPublicActivityTo(byAccount)
134 const base = {
135 type: 'Add',
136 id: url,
137 actor: byAccount.url,
138 to,
139 object,
140 target
141 }
142
143 return buildSignedActivity(byAccount, base)
144 }