5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-11-26 15:06:22 +00:00
panel/app/models/instance_moderation.rb

85 lines
2.2 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
# Mantiene el registro de relaciones entre sitios e instancias
class InstanceModeration < ApplicationRecord
include AASM
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') }
scope :paused, -> { where(aasm_state: 'paused') }
scope :blocked, -> { where(aasm_state: 'blocked') }
scope :allowed, -> { where(aasm_state: 'allowed') }
# 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
state :blocked
event :pause do
transitions from: %i[allowed blocked], to: :paused
before do
pause_remotely!
end
end
event :allow do
transitions from: %i[paused blocked], to: :allowed
before do
allow_remotely!
end
end
event :block do
transitions from: %i[paused allowed], to: :blocked
before do
block_remotely!
end
end
end
# Elimina la instancia de todas las listas
#
# @return [Boolean]
def pause_remotely!
raise AASM::InvalidTransition unless
site.social_inbox.blocklist.delete(list: [instance.list_name]).ok? &&
site.social_inbox.allowlist.delete(list: [instance.list_name]).ok?
end
# Deja de permitir la instancia
#
# @return [Boolean]
def block_remotely!
raise AASM::InvalidTransition unless
site.social_inbox.allowlist.delete(list: [instance.list_name]).ok? &&
site.social_inbox.blocklist.post(list: [instance.list_name]).ok?
end
# Permite la instancia
#
# @return [Boolean]
def allow_remotely!
raise AASM::InvalidTransition unless
site.social_inbox.blocklist.delete(list: [instance.list_name]).ok? &&
site.social_inbox.allowlist.post(list: [instance.list_name]).ok?
end
end