From 1ee41f2d5e9de7dc78f79c7afcb574ff2fa79648 Mon Sep 17 00:00:00 2001 From: f Date: Wed, 28 Feb 2024 16:04:37 -0300 Subject: [PATCH] feat: al activar o desactivar un fediblock, vincular con todas las instancias --- app/models/fediblock_state.rb | 28 +++++++++++++++++++++------- app/models/instance_moderation.rb | 15 +++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/app/models/fediblock_state.rb b/app/models/fediblock_state.rb index 8045e23e..13e31cb2 100644 --- a/app/models/fediblock_state.rb +++ b/app/models/fediblock_state.rb @@ -1,6 +1,12 @@ # frozen_string_literal: true -# Relación entre Fediblocks y Sites +# Relación entre Fediblocks y Sites. +# +# Cuando se habilita un Fediblock, tenemos que asociar todas sus +# instancias con el sitio y bloquearlas. Cuando se deshabilita, la +# relación ya está creada y se va actualizando. +# +# @see ActivityPub::FediblockUpdatedJob class FediblockState < ApplicationRecord include AASM @@ -22,6 +28,15 @@ class FediblockState < ApplicationRecord before do enable_remotely! + + # Al actualizar el estado en masa garantizamos que las + # instancias que ya existen queden sincronizadas con el bloqueo + # en masa que acabamos de hacer. + instance_moderations.block_all! + + # Luego esta tarea crea las que falten e ignora las que ya se + # bloquearon. + ActivityPub::InstanceModerationJob.perform_later(site: site, hostnames: fediblock.hostnames) end end @@ -35,18 +50,17 @@ class FediblockState < ApplicationRecord before do disable_remotely! + + instance_moderations.pause_all! end end end private - # Obtiene todos los IDs de instancias para poder obtener el estado de - # moderación en el sitio. - # - # @return [Array] - def instance_ids - ActivityPub::Instance.where(hostname: fediblock.instances).pluck(:id) + # Todas las instancias de moderación de este sitio + def instance_moderations + site.instance_moderations.where(instance_id: fediblock.instances.pluck(:id)) end # @return [Array] diff --git a/app/models/instance_moderation.rb b/app/models/instance_moderation.rb index 735ec387..d9f74527 100644 --- a/app/models/instance_moderation.rb +++ b/app/models/instance_moderation.rb @@ -7,6 +7,21 @@ class InstanceModeration < ApplicationRecord belongs_to :site belongs_to :instance, class_name: 'ActivityPub::Instance' + # Traer todas las instancias bloqueables, según la máquina de estados, + # todas las que no estén bloqueadas ya. + scope :may_block, -> { where.not(aasm_state: 'blocked') } + scope :may_pause, -> { where.not(aasm_state: 'paused') } + + # Bloquear instancias en masa + def self.block_all! + self.may_block.update_all(aasm_state: 'blocked', updated_at: Time.now) + end + + # Pausar instancias en masa + def self.pause_all! + self.may_pause.update_all(aasm_state: 'paused', updated_at: Time.now) + end + aasm do state :paused, initial: true state :allowed