# 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 include AASM belongs_to :site belongs_to :object, polymorphic: true 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] } # Encuentra la URI de un objeto # # @return [String, nil] def self.uri_from_object(object) case object when String then object when Hash then 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 # Si un objeto previamente aprobado fue actualizado, volvemos a # pausarlo. event :pause do transitions from: %i[approved rejected], to: :paused end # La actividad se aprueba event :approve do transitions from: %i[paused rejected], to: :approved end # La actividad fue rechazada event :reject do transitions from: %i[paused approved], to: :rejected end # Solo podemos reportarla luego de rechazarla event :report do transitions from: :rejected, to: :reported end end end