5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-23 00:36:21 +00:00
panel/app/jobs/activity_pub/fetch_job.rb

48 lines
1.6 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
# Obtiene o actualiza el contenido de un objeto, usando las credenciales
# del sitio.
#
# XXX: Esto usa las credenciales del sitio para volver el objeto
# disponible para todo el CMS. Asumimos que el objeto devuelto es el
# mismo para todo el mundo y las credenciales solo son para
# autenticación.
2024-02-21 15:46:38 +00:00
class ActivityPub
class FetchJob < ApplicationJob
self.priority = 50
def perform(site:, object_id:)
2024-02-21 15:46:38 +00:00
ActivityPub::Object.transaction do
object = ::ActivityPub::Object.find(object_id)
return if object.blank?
return if object.activity_pubs.where(aasm_state: 'removed').count.positive?
2024-02-21 15:46:38 +00:00
response = site.social_inbox.dereferencer.get(uri: object.uri)
2024-02-21 15:46:38 +00:00
# @todo Fallar cuando la respuesta no funcione?
return unless response.ok?
# Ignorar si ya la caché fue revalidada y ya teníamos el
# contenido
return if response.hit? && object.content.present?
current_type = object.type
2024-02-21 17:07:11 +00:00
content = FastJsonparser.parse(response.body)
2024-03-18 18:46:03 +00:00
object.update!(content: content, type: ActivityPub::Object.type_from(content).name)
2024-03-16 20:53:29 +00:00
return if current_type == object.type
object = ::ActivityPub::Object.find(object_id)
2024-03-18 18:46:03 +00:00
# Actualiza la mención
object.actor&.save! if object.actor_type?
2024-03-16 20:53:29 +00:00
# Arreglar las relaciones con actividades también
2024-03-18 18:46:03 +00:00
ActivityPub.where(object_id: object.id).update_all(object_type: object.type, updated_at: Time.now)
rescue FastJsonparser::ParseError => e
ExceptionNotifier.notify_exception(e, data: { site: site.name, body: response.body })
2024-02-21 15:46:38 +00:00
end
end
end
end