5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-22 23:56:22 +00:00
panel/app/models/fediblock_state.rb

87 lines
2.6 KiB
Ruby
Raw Normal View History

2024-02-27 16:43:46 +00:00
# frozen_string_literal: true
# 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
2024-02-27 16:43:46 +00:00
class FediblockState < ApplicationRecord
include AASM
belongs_to :site
belongs_to :fediblock, class_name: 'ActivityPub::Fediblock'
# El efecto secundario de esta máquina de estados es modificar el
# estado de moderación de cada instancia en el sitio. Nos salteamos
# los hooks de los eventos individuales.
aasm do
# Aunque queramos las listas habilitadas por defecto, tenemos que
# habilitarlas luego de crearlas para poder generar la lista de
# bloqueo en la Social Inbox.
state :disabled, initial: true
state :enabled
event :enable do
transitions from: :disabled, to: :enabled
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)
2024-02-27 16:43:46 +00:00
end
end
# Al deshabilitar, las listas pasan a modo pausa.
#
# @todo No cambiar el estado si se habían habilitado manualmente,
# pero esto implica que tenemos que encontrar las que sí y quitarlas
# de list_names
event :disable do
transitions from: :enabled, to: :disabled
before do
disable_remotely!
instance_moderations.pause_all!
2024-02-27 16:43:46 +00:00
end
end
end
private
# Todas las instancias de moderación de este sitio
def instance_moderations
site.instance_moderations.where(instance_id: fediblock.instances.pluck(:id))
2024-02-27 16:43:46 +00:00
end
# @return [Array<String>]
def list_names
@list_names ||= fediblock.instances.map do |instance|
"@*@#{instance}"
end
end
# Al deshabilitar, las instancias pasan a ser analizadas caso por caso
def disable_remotely!
raise AASM::InvalidTransition unless
site.social_inbox.blocklist.delete(list: list_names).ok? &&
site.social_inbox.allowlist.delete(list: list_names).ok?
end
# Al habilitar, se bloquean todas las instancias de la lista
def enable_remotely!
raise AASM::InvalidTransition unless
site.social_inbox.blocklist.post(list: list_names).ok? &&
site.social_inbox.allowlist.delete(list: list_names).ok?
end
end