unoffical wafrn mirror wafrn.net
atproto social-network activitypub
at angular21 115 lines 3.4 kB view raw
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 }