From d5f48c60073e8245e1f1cf1cbd8c558da60cdcfc Mon Sep 17 00:00:00 2001 From: f Date: Tue, 27 Feb 2024 16:40:08 -0300 Subject: [PATCH] feat: al actualizar las blocklists, bloquear las instancias en los sitios que las tengan habilitadas --- app/jobs/activity_pub/fediblock_fetch_job.rb | 11 ++++++++- .../activity_pub/fediblock_updated_job.rb | 24 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 app/jobs/activity_pub/fediblock_updated_job.rb diff --git a/app/jobs/activity_pub/fediblock_fetch_job.rb b/app/jobs/activity_pub/fediblock_fetch_job.rb index d6cb4b83..6730cbf0 100644 --- a/app/jobs/activity_pub/fediblock_fetch_job.rb +++ b/app/jobs/activity_pub/fediblock_fetch_job.rb @@ -1,11 +1,20 @@ # frozen_string_literal: true class ActivityPub - # Se encarga de mantener las listas de bloqueo actualizadas + # Se encarga de mantener las listas de bloqueo actualizadas. Luego de + # actualizar el listado de instancias, bloquea las instancias en cada + # sitio que tenga el fediblock habilitado. class FediblockFetchJob < ApplicationJob def perform ActivityPub::Fediblock.find_each do |fediblock| fediblock.process! + + instances_added = fediblock.instances - fediblock.instances_was + + # No hacer nada si no cambió con respecto a la versión anterior + next if instances_added.empty? + + ActivityPub::FediblockUpdatedJob.perform_later(fediblock: fediblock, hostnames: instances_added) rescue ActivityPub::Fediblock::FediblockDownloadError => e ExceptionNotifier.notify_exception(e, data: { fediblock: fediblock.title }) end diff --git a/app/jobs/activity_pub/fediblock_updated_job.rb b/app/jobs/activity_pub/fediblock_updated_job.rb new file mode 100644 index 00000000..007fa25e --- /dev/null +++ b/app/jobs/activity_pub/fediblock_updated_job.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +# Se encarga de mantener sincronizadas las listas de instancias +# de los fediblocks con los sitios que las tengan activadas. +class ActivityPub + class FediblockUpdatedJob < ApplicationJob + # @param :fediblock [ActivityPub::Fediblock] + # @param :instances [Array] + def perform(fediblock:, hostnames:) + instances = ActivityPub::Instance.where(hostname: instances) + + # Todos los sitios con la Social Inbox habilitada + Site.where(id: DeploySocialDistributedPress.pluck(:site_id)).find_each do |site| + # Crea el estado si no existía + fediblock_state = site.fediblock_states.find_or_create_by(fediblock: fediblock) + + # No hace nada con los deshabilitados + next unless fediblock_state.enabled? + + ActivityPub::InstanceModerationJob.perform_later(site: site, hostnames: instances) + end + end + end +end