# frozen_string_literal: true # = ActivityPub = # # El registro de actividades recibidas y su estado. Cuando recibimos # una actividad, puede estar destinada a varies actores dentro de Sutty, # con lo que generamos una cola para cada une. # # @see {https://www.w3.org/TR/activitypub/#client-to-server-interactions} class ActivityPub < ApplicationRecord IGNORED_EVENTS = %i[remove] IGNORED_STATES = %i[removed] include AASM belongs_to :instance belongs_to :site belongs_to :object, polymorphic: true belongs_to :actor belongs_to :remote_flag, optional: true, class_name: 'ActivityPub::RemoteFlag' has_many :activities validates :site_id, presence: true validates :object_id, presence: true validates :aasm_state, presence: true, inclusion: { in: %w[paused approved rejected reported removed] } accepts_nested_attributes_for :remote_flag # Encuentra la URI de un objeto # # @return [String, nil] def self.uri_from_object(object) case object when Array then uri_from_object(object.first) when String then object when Hash then (object['id'] || object[:id]) end end aasm do # Todavía no hay una decisión sobre el objeto state :paused, initial: true # Le usuarie aprobó el objeto state :approved # Le usuarie rechazó el objeto state :rejected # Le usuarie reportó el objeto state :reported # Le actore eliminó el objeto state :removed # Recibir una acción de eliminación, eliminar el contenido de la # base de datos. Esto elimina el contenido para todos los sitios # porque estamos respetando lo que pidió le actore. event :remove do transitions to: :removed before do object.update(content: {}) unless object.content.empty? end end # La actividad se aprueba, informándole a la Social Inbox que está # aprobada. También recibimos la aprobación via # webhook a modo de confirmación. event :approve do transitions from: %i[paused], to: :approved before do allow_remotely! end end # La actividad fue rechazada event :reject do transitions from: %i[paused approved], to: :rejected before do reject_remotely! end end # Solo podemos reportarla luego de rechazarla event :report do transitions from: :rejected, to: :reported before do ActivityPub::RemoteFlagJob.perform_later(remote_flag: remote_flag) if remote_flag.waiting? end end end # Definir eventos en masa include AasmEventsConcern def reject_remotely! raise unless site.social_inbox.inbox.reject(id: object.uri).ok? end def allow_remotely! raise unless site.social_inbox.inbox.accept(id: object.uri).ok? end end