unoffical wafrn mirror
wafrn.net
atproto
social-network
activitypub
1import { Op } from 'sequelize'
2import { FederatedHost, PostHostView, RemoteUserPostView, User } from '../../models/index.js'
3import { completeEnvironment } from '../backendOptions.js'
4import { postToJSONLD } from './postToJSONLD.js'
5import { LdSignature } from './rsa2017.js'
6import _ from 'underscore'
7import { Queue } from 'bullmq'
8import { redisCache } from '../redis.js'
9import { activityPubObject } from '../../interfaces/fediverse/activityPubObject.js'
10
11const sendPostQueue = new Queue('sendPostToInboxes', {
12 connection: completeEnvironment.bullmqConnection,
13 defaultJobOptions: {
14 removeOnComplete: true,
15 attempts: 3,
16 backoff: {
17 type: 'exponential',
18 delay: 1000
19 },
20 removeOnFail: true
21 }
22})
23async function federatePostHasBeenEdited(postToEdit: any) {
24 const user = await User.scope('full').findByPk(postToEdit.userId)
25 if (!user) return
26
27 await redisCache.del('postAndUser:' + postToEdit.id)
28 const postAsJSONLD = await postToJSONLD(postToEdit.id)
29 if (!postAsJSONLD) {
30 return
31 }
32 const objectToSend = {
33 '@context': [`${completeEnvironment.frontendUrl}/contexts/litepub-0.1.jsonld`],
34 actor: `${completeEnvironment.frontendUrl}/fediverse/blog/${user.url.toLowerCase()}`,
35 to: postAsJSONLD.to,
36 cc: postAsJSONLD.cc,
37 bto: [],
38 published: new Date(postToEdit.updatedAt).toISOString(),
39 id: `${completeEnvironment.frontendUrl}/fediverse/post/${postToEdit.id}/update/${new Date(
40 postToEdit.updatedAt
41 ).getTime()}`,
42 object: postAsJSONLD.object,
43 type: 'Update'
44 }
45
46 let serversToSendThePostIds = (
47 await PostHostView.findAll({
48 where: {
49 postId: postToEdit.id
50 }
51 })
52 ).map((elem) => elem.federatedHostId)
53 let serversToSendThePostPromise = FederatedHost.findAll({
54 where: {
55 id: {
56 [Op.in]: serversToSendThePostIds
57 }
58 }
59 })
60 let usersToSendPostId = (
61 await RemoteUserPostView.findAll({
62 where: {
63 postId: postToEdit.id
64 }
65 })
66 ).map((elem) => elem.userId)
67 let usersToSendThePostPromise = User.findAll({
68 where: {
69 id: {
70 [Op.in]: usersToSendPostId
71 }
72 }
73 })
74
75 await Promise.all([serversToSendThePostPromise, usersToSendThePostPromise])
76 let serversToSendThePost = await serversToSendThePostPromise
77 let usersToSendThePost = await usersToSendThePostPromise
78 let urlsToSendPost: string[] = []
79
80 if (serversToSendThePost) {
81 urlsToSendPost = urlsToSendPost.concat(serversToSendThePost.map((server: any) => server.publicInbox))
82 }
83 if (usersToSendThePost) {
84 urlsToSendPost = urlsToSendPost.concat(usersToSendThePost.map((usr: any) => usr.remoteInbox))
85 }
86 if (!user.privateKey) return
87
88 const ldSignature = new LdSignature()
89 const bodySignature = await ldSignature.signRsaSignature2017(
90 objectToSend,
91 user.privateKey,
92 `${completeEnvironment.frontendUrl}/fediverse/blog/${user.url.toLocaleLowerCase()}`,
93 completeEnvironment.instanceUrl,
94 new Date()
95 )
96 for await (const inboxChunk of urlsToSendPost) {
97 await sendPostQueue.add(
98 'editPostChunk',
99 {
100 objectToSend: {
101 ...objectToSend,
102 signature: bodySignature.signature
103 },
104 petitionBy: user.dataValues,
105 inboxList: inboxChunk
106 },
107 {
108 priority: 500,
109 delay: 2500
110 }
111 )
112 }
113}
114
115export { federatePostHasBeenEdited }