5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-23 04:46:21 +00:00

feat: al activar o desactivar un fediblock, vincular con todas las

instancias
This commit is contained in:
f 2024-02-28 16:04:37 -03:00
parent 15800e1096
commit 1ee41f2d5e
No known key found for this signature in database
2 changed files with 36 additions and 7 deletions

View file

@ -1,6 +1,12 @@
# frozen_string_literal: true # 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 class FediblockState < ApplicationRecord
include AASM include AASM
@ -22,6 +28,15 @@ class FediblockState < ApplicationRecord
before do before do
enable_remotely! 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
end end
@ -35,18 +50,17 @@ class FediblockState < ApplicationRecord
before do before do
disable_remotely! disable_remotely!
instance_moderations.pause_all!
end end
end end
end end
private private
# Obtiene todos los IDs de instancias para poder obtener el estado de # Todas las instancias de moderación de este sitio
# moderación en el sitio. def instance_moderations
# site.instance_moderations.where(instance_id: fediblock.instances.pluck(:id))
# @return [Array<String>]
def instance_ids
ActivityPub::Instance.where(hostname: fediblock.instances).pluck(:id)
end end
# @return [Array<String>] # @return [Array<String>]

View file

@ -7,6 +7,21 @@ class InstanceModeration < ApplicationRecord
belongs_to :site belongs_to :site
belongs_to :instance, class_name: 'ActivityPub::Instance' 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 aasm do
state :paused, initial: true state :paused, initial: true
state :allowed state :allowed