volontariat/voluntary_ranking

View on GitHub
app/controllers/api/v1/user_ranking_items_controller.rb

Summary

Maintainability
A
2 hrs
Test Coverage
class Api::V1::UserRankingItemsController < ActionController::Base
  include Voluntary::V1::BaseController
  include Concerns::Controller::BaseRankingItemsController
  
  respond_to :json
  
  def index
    options = {}
    
    if ranking.present?
      options[:json] = if params[:user_id].present? || params[:user_name].present?
        user.ranking_items
      else
        UserRankingItem
      end
      
      if params[:thing_name].present?
        options[:json] = options[:json].where(
          thing_id: Thing.where('LOWER(name) = ?', params[:thing_name].downcase).first.id
        )
      end
      
      options[:json] = options[:json].order('position').where(ranking_id: ranking.id).includes(:thing)
      options[:json] = options[:json].paginate(page: params[:page], per_page: 10)
      
      options[:meta] = { 
        pagination: {
          total_pages: options[:json].total_pages, current_page: options[:json].current_page,
          previous_page: options[:json].previous_page, next_page: options[:json].next_page
        }
      }
    else
      options[:json] = []
      options[:meta] = { pagination: { total_pages: 0, current_page: 0, previous_page: 0, next_page: 0 } }
    end
    
    respond_with do |format|
      format.json { render options }
    end
  end
  
  def create
    raise CanCan::AccessDenied if current_user.blank?
    
    respond_to do |format|
      format.json { render json: current_user.add_ranking_item(params[:user_ranking_item]) }
    end
  end
  
  def update
    user_ranking_item = current_user.ranking_items.find(params[:id])
    user_ranking_item.update_stars params[:user_ranking_item][:stars]
    respond_with user_ranking_item
  end
  
  def move
    user_ranking_item = UserRankingItem.find(params[:id])
    
    raise CanCan::AccessDenied unless can? :update, user_ranking_item
    
    user_ranking_item.set_position(params[:position].to_i)
    respond_with user_ranking_item
  end
  
  def move_to_page
    user_ranking_item = UserRankingItem.find(params[:id])
    
    raise CanCan::AccessDenied unless can? :update, user_ranking_item
    
    user_ranking_item.move_to_top_of_page(params[:page])
    
    respond_to do |format|
      format.json { render json: user_ranking_item }
    end
  end
  
  def destroy
    current_user.ranking_items.find(params[:id]).destroy!
    
    render nothing: true
  end
  
  private
  
  def user
    if @user
      @user
    elsif params[:user_id].present?
      @user = User.find(params[:user_id])
    elsif params[:user_name].present?
      @user = User.where('LOWER(name) = ?', params[:user_name].downcase).first
    end
  end
end