Skip to content
Extraits de code Groupes Projets
posts_controller.rb 4,13 ko
Newer Older
  #   Copyright (c) 2010-2011, Diaspora Inc.  This file is
maxwell's avatar
maxwell a validé
#   licensed under the Affero General Public License version 3 or later.  See
#   the COPYRIGHT file.

require Rails.root.join("app", "presenters", "post_presenter")

maxwell's avatar
maxwell a validé
class PostsController < ApplicationController
Maxwell Salzberg's avatar
Maxwell Salzberg a validé
  before_filter :authenticate_user!, :except => [:show, :iframe, :oembed]
  before_filter :set_format_if_malformed_from_status_net, :only => :show
  before_filter :find_post, :only => [:show, :next, :previous]
Dennis Collinson's avatar
Dennis Collinson a validé
  layout 'post'

  respond_to :html,
             :mobile,
             :json,
             :xml

Dennis Collinson's avatar
Dennis Collinson a validé
  def new
    @feature_flag = FeatureFlagger.new(current_user, current_user.person) #I should be a global before filter so @feature_flag is accessible
    redirect_to "/stream" and return unless @feature_flag.new_publisher?
    render :text => "", :layout => true
maxwell's avatar
maxwell a validé
  def show
    return log_and_redirect_back unless @post

    mark_corresponding_notification_read if user_signed_in?
    respond_to do |format|
Dennis Collinson's avatar
Dennis Collinson a validé
      format.html{ gon.post = ExtremePostPresenter.new(@post, current_user); render 'posts/show.html.haml' }
      format.xml{ render :xml => @post.to_diaspora_xml }
      format.mobile{render 'posts/show.mobile.haml', :layout => "application"}
Dennis Collinson's avatar
Dennis Collinson a validé
      format.json{ render :json => ExtremePostPresenter.new(@post, current_user) }
  def iframe
    render :text => post_iframe_url(params[:id]), :layout => false
  end

Maxwell Salzberg's avatar
Maxwell Salzberg a validé
  def oembed
    post_id = OEmbedPresenter.id_from_url(params.delete(:url))
    post = find_by_guid_or_id_with_current_user(post_id) 
    if post.present?
      oembed = OEmbedPresenter.new(post, params.slice(:format, :maxheight, :minheight))
      render :json => oembed
    else
      render :nothing => true, :status => 404
    end
Maxwell Salzberg's avatar
Maxwell Salzberg a validé
  end

  def destroy
    @post = current_user.posts.where(:id => params[:id]).first
    if @post
      current_user.retract(@post)
      respond_to do |format|
        format.js {render 'destroy'}
        format.json { render :nothing => true, :status => 204 }
        format.all {redirect_to stream_path}
maxwell's avatar
maxwell a validé
      end
maxwell's avatar
maxwell a validé
    else
      Rails.logger.info "event=post_destroy status=failure user=#{current_user.diaspora_handle} reason='User does not own post'"
      render :nothing => true, :status => 404
Raphael's avatar
Raphael a validé
    end
maxwell's avatar
maxwell a validé
  end
danielgrippi's avatar
danielgrippi a validé
  def update
    @post = current_user.posts.find(params[:id])
    if @post
      @post.favorite = !@post.favorite
      @post.save
      render :nothing => true, :status => 202
    end
  end

    next_post = visible_posts_from_author.newer(@post)

    respond_to do |format|
      format.html{ redirect_to post_path(next_post) }
Dennis Collinson's avatar
Dennis Collinson a validé
      format.json{ render :json => ExtremePostPresenter.new(next_post, current_user)}
    previous_post = visible_posts_from_author.older(@post)

    respond_to do |format|
      format.html{ redirect_to post_path(previous_post) }
Dennis Collinson's avatar
Dennis Collinson a validé
      format.json{ render :json => ExtremePostPresenter.new(previous_post, current_user)}
Dennis Collinson's avatar
Dennis Collinson a validé
  protected

  def log_and_redirect_back #preserving old functionality, but this should probably be removed
    user_id = (user_signed_in? ? current_user : nil)
    Rails.logger.info(":event => :link_to_nonexistent_post, :ref => #{request.env['HTTP_REFERER']}, :user_id => #{user_id}, :post_id => #{params[:id]}")
    flash[:error] = I18n.t('posts.show.not_found')
    redirect_to :back
  end

  def find_post
    @post = find_by_guid_or_id_with_current_user(params[:id])
  end

  def visible_posts_from_author
    Post.visible_from_author(@post.author, current_user)
  end

Maxwell Salzberg's avatar
Maxwell Salzberg a validé
  def find_by_guid_or_id_with_current_user(id)
    key = id.to_s.length <= 8 ? :id : :guid
    if user_signed_in?
      current_user.find_visible_shareable_by_id(Post, id, :key => key)
    else
      Post.where(key => id, :public => true).includes(:author, :comments => :author).first
    end
  end

  def set_format_if_malformed_from_status_net
   request.format = :html if request.format == 'application/html+xml'
  end

  def mark_corresponding_notification_read
    if notification = Notification.where(:recipient_id => current_user.id, :target_id => @post.id).first
      notification.unread = false
      notification.save
maxwell's avatar
maxwell a validé
end