studpad/studpad

View on GitHub
app/controllers/posts_controller.rb

Summary

Maintainability
A
3 hrs
Test Coverage
class PostsController < ApplicationController
  before_action :find_post, except: [:create, :index]
  skip_before_filter :require_login, :index

  def create
    @post = current_user.posts.create post_params
    @post.bind_tags(params[:post][:tags])
    @post.attachment_ids = params[:post][:attachment_ids]
    params[:post][:text_elements].each do |position, element|
      case element['type']
      when 'text'
        @post.text_elements.create text_type: 'text',
          text: element[:text],
          position: position
      when 'image'
        @post.text_elements.create text_type: 'image',
          image: Attachment.find(element['data']['id']).file,
          position: position
      when 'divider'
        @post.text_elements.create text_type: 'divider',
          position: position
      else
        raise 'Undefined text type'
      end
    end

    render nothing: true
  end

  def change_categories
    @post.category_ids = params[:category_ids]
    puts @post.update_attributes recommended: params[:recommended],
      visible: params[:visible]
    render nothing: true
  end

  def show
    respond_to do |format|
      format.html { }
      format.json {
        @posts = [@post]
        render 'posts/index'
      }
    end
  end

  def destroy
    @post.destroy
    render nothing: true
  end

  def like
    voted = current_user.voted_for? @post
    if voted
      @post.unliked_by current_user
      Notification.like.where(
        who: current_user,
        user: @post.user,
        post: @post).destroy_all
    else
      @post.liked_by current_user
      Notification.like.create!(
        who: current_user,
        user: @post.user,
        post: @post)
    end
    render nothing: true
  end

  def basket
    current_user.get_basket.toggle_add(@post)
    render nothing: true
  end

  def update
    @post.update_attributes post_params
    @post.bind_tags(params[:post][:tags])
    @post.attachment_ids = params[:post][:attachment_ids]
    element_ids = params[:post][:text_elements].values.map{|e| e[:id]}.compact
    @post.text_element_ids = element_ids
    params[:post][:text_elements].each do |position, element|
      case element['type']
      when 'text'
        if element[:id]
          @post.text_elements.find(element[:id]).update_attributes text_type: 'text',
            text: element[:text],
            position: position
        else
          @post.text_elements.create text_type: 'text',
            text: element[:text],
            position: position
        end
      when 'image'
        if element[:id]
          @post.text_elements.find(element[:id]).update_attributes position: position
        else
          @post.text_elements.create text_type: 'image',
            image: Attachment.find(element['data']['id']).file,
            position: position
        end
      when 'divider'
        if element[:id]
          @post.text_elements.find(element[:id]).update_attributes position: position
        else
          @post.text_elements.create text_type: 'divider', position: position
        end
      else
        raise 'Undefined text type'
      end
    end

    render nothing: true
  end

  def index
    @posts = Post.for_user(current_user).limit(params[:count])
    render :index, formats: :json
  end

  private
    def post_params
      params.require(:post).permit(
        :title, :post_type, :group_id, :city_id,
        :youtube_id, :attachment_ids,
        photo_ids: [],
        linkdata: [:title, :domain, :description, :url, :image_url])
    end

    def find_post
      authorize @post = Post.find(params[:id])
    end
end