diaspora/app/models/reshare.rb
Jonne Haß 777e3123d6 Try fetching missing parent of relayables
* Extract post fetching logic from Reshare into
  its own module
* raise proper error message when fetching fails
* raise proper error message when parent is still missing

We can't skip fetch failures or missing parents and
still need to retry them in case we're sent the parent
later on
2014-09-07 10:47:47 +02:00

93 lines
2.5 KiB
Ruby

# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
class Reshare < Post
belongs_to :root, :class_name => 'Post', :foreign_key => :root_guid, :primary_key => :guid
validate :root_must_be_public
validates_presence_of :root, :on => :create
validates_uniqueness_of :root_guid, :scope => :author_id
delegate :author, to: :root, prefix: true
xml_attr :root_diaspora_id
xml_attr :root_guid
before_validation do
self.public = true
end
after_commit :on => :create do
self.root.update_reshares_counter
end
after_destroy do
self.root.update_reshares_counter if self.root.present?
end
def root_diaspora_id
self.root.author.diaspora_handle
end
delegate :o_embed_cache, :open_graph_cache,
:message, :nsfw,
to: :absolute_root, allow_nil: true
def raw_message
absolute_root.try(:raw_message) || super
end
def mentioned_people
absolute_root.try(:mentioned_people) || super
end
def photos
absolute_root.try(:photos) || super
end
def address
absolute_root.try(:location).try(:address)
end
def receive(recipient, sender)
local_reshare = Reshare.where(:guid => self.guid).first
if local_reshare && local_reshare.root.author_id == recipient.person.id
return unless recipient.has_contact_for?(sender)
end
super(recipient, sender)
end
def comment_email_subject
I18n.t('reshares.comment_email_subject', :resharer => author.name, :author => root.author_name)
end
def notification_type(user, person)
Notifications::Reshared if root.author == user.person
end
def absolute_root
@absolute_root ||= self
@absolute_root = @absolute_root.root while @absolute_root.is_a? Reshare
@absolute_root
end
private
def after_parse
if root.blank?
self.root = Diaspora::Fetcher::Single.find_or_fetch_from_remote root_guid, @root_diaspora_id do |fetched_post, author|
# why do we check this?
if fetched_post.diaspora_handle != author.diaspora_handle
raise Diaspora::PostNotFetchable, "Diaspora ID (#{fetched_post.diaspora_handle}) in the root does not match the Diaspora ID (#{author.diaspora_handle}) specified in the reshare!"
end
end
end
end
def root_must_be_public
if self.root && !self.root.public
errors[:base] << "Only posts which are public may be reshared."
return false
end
end
end