# 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