mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-23 00:36:21 +00:00
feat: al activar o desactivar un fediblock, vincular con todas las
instancias
This commit is contained in:
parent
15800e1096
commit
1ee41f2d5e
2 changed files with 36 additions and 7 deletions
|
@ -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<String>]
|
||||
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<String>]
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue