diaspora/app/presenters/post_presenter.rb
Dennis Collinson efa79a4ad7 Refactor Post Presenter
and comment presenter
2012-05-10 12:24:21 -07:00

111 lines
No EOL
3.1 KiB
Ruby

require File.join(File.dirname(__FILE__), '..', '..', 'lib', 'template_picker')
class PostPresenter
attr_accessor :post, :current_user
def initialize(post, current_user = nil)
@post = post
@current_user = current_user
end
def self.collection_json(collection, current_user)
collection.map {|post| PostPresenter.new(post, current_user)}
end
def as_json(options={})
{
:id => @post.id,
:guid => @post.guid,
:text => @post.raw_message,
:public => @post.public,
:created_at => @post.created_at,
:interacted_at => @post.interacted_at,
:comments_count => @post.comments_count,
:likes_count => @post.likes_count,
:reshares_count => @post.reshares_count,
:provider_display_name => @post.provider_display_name,
:post_type => @post.post_type,
:image_url => @post.image_url,
:object_url => @post.object_url,
:nsfw => @post.nsfw,
:favorite => @post.favorite,
:last_three_comments => CommentPresenter.as_collection(@post.last_three_comments),
:author => @post.author.as_api_response(:backbone),
:o_embed_cache => @post.o_embed_cache.try(:as_api_response, :backbone),
:mentioned_people => @post.mentioned_people.as_api_response(:backbone),
:photos => @post.photos.map {|p| p.as_api_response(:backbone)},
:frame_name => @post.frame_name || template_name,
:root => root,
:title => title,
:next_post => next_post_path,
:previous_post => previous_post_path,
:user_like => user_like,
:user_participation => user_participation,
:user_reshare => user_reshare,
}
end
def next_post_path
Rails.application.routes.url_helpers.next_post_path(@post)
end
def previous_post_path
Rails.application.routes.url_helpers.previous_post_path(@post)
end
def user_like
@post.like_for(@current_user).try(:as_api_response, :backbone)
end
def user_participation
@post.participation_for(@current_user).try(:as_api_response, :backbone)
end
def user_reshare
@post.reshare_for(@current_user)
end
def title
@post.text.present? ? @post.text(:plain_text => true) : I18n.translate('posts.presenter.title', :name => @post.author.name)
end
def template_name #kill me, lol, I should be client side
@template_name ||= TemplatePicker.new(@post).template_name
end
def root
PostPresenter.new(@post.root, current_user).as_json if @post.respond_to?(:root)
end
protected
def person
@current_user.person
end
def user_signed_in?
@current_user.present?
end
end
class PostInteractionPresenter
def initialize(post, current_user)
@post = post
@current_user = current_user
end
def as_json(options={})
{
:likes => as_api(@post.likes),
:reshares => as_api(@post.reshares),
:comments => CommentPresenter.as_collection(@post.comments),
:participations => as_api(@post.participations)
}
end
def as_api(collection)
collection.includes(:author => :profile).all.map do |element|
element.as_api_response(:backbone)
end
end
end