5
0
Fork 0
mirror of https://0xacab.org/sutty/sutty synced 2024-12-01 11:46:21 +00:00
panel/app/models/activity_pub/object.rb

68 lines
1.7 KiB
Ruby
Raw Permalink Normal View History

# frozen_string_literal: true
# Almacena objetos de ActivityPub, como Note, Article, etc.
2024-02-21 15:46:38 +00:00
class ActivityPub
class Object < ApplicationRecord
include ActivityPub::Concerns::JsonLdConcern
before_validation :type_from_content!, unless: :type?
# Los objetos son únicos a toda la base de datos
2024-03-06 20:45:21 +00:00
validates :uri, presence: true, url: true, uniqueness: true
validate :uri_is_content_id?, if: :content?
2024-02-21 15:46:38 +00:00
has_many :activity_pubs, as: :object
# Encontrar le Actor por su relación con el objeto
#
# @return [ActivityPub::Actor,nil]
def actor
ActivityPub::Actor.find_by(uri: actor_uri)
end
# @return [String]
def actor_uri
content['attributedTo']
end
2024-03-07 19:54:09 +00:00
def actor_type?
false
end
def object_type?
true
end
2024-03-18 14:55:38 +00:00
# Poder explorar propiedades remotas
#
# @return [DistributedPress::V1::Social::ReferencedObject]
def referenced(site)
require 'distributed_press/v1/social/referenced_object'
2024-05-02 19:05:35 +00:00
@referenced ||= DistributedPress::V1::Social::ReferencedObject.new(object: content,
dereferencer: site.social_inbox.dereferencer)
2024-03-18 14:55:38 +00:00
end
private
def uri_is_content_id?
2024-05-02 19:05:35 +00:00
return if uri == content['id']
errors.add(:activity_pub_objects, 'El ID del objeto no coincide con su URI')
end
# Encuentra el tipo a partir del contenido, si existe.
#
# XXX: Si el objeto es una actividad, esto siempre va a ser
# Generic
def type_from_content!
self.type =
begin
"ActivityPub::Object::#{content['type'].presence || 'Generic'}".constantize
rescue NameError
ActivityPub::Object::Generic
end
end
2024-02-21 15:46:38 +00:00
end
end