roseweixel/lacquer-lover

View on GitHub
app/controllers/lacquers_controller.rb

Summary

Maintainability
B
4 hrs
Test Coverage
class LacquersController < ApplicationController
  autocomplete :lacquer, :name
  skip_before_action :clear_intended_uri, only: [:autocomplete_name]
  before_action :set_lacquer, only: [:edit, :update]
  before_action :set_current_user, only: [:create, :edit, :update]

  def autocomplete_name
    @lacquers = Lacquer.order(:name).where('lower(name) LIKE ?', "#{params[:term].downcase}%").limit(10)
    respond_to do |format|
      format.json { render json: @lacquers.map(&:name) }
    end
  end

  def create
    lacquer = Lacquer.new(name: params[:lacquer][:name], brand_id: params[:lacquer][:brand_id])
    lacquer.user_added_by_id = params[:lacquer][:user_added_by_id] if params[:lacquer][:user_added_by_id]
    lacquer.save
    if lacquer.errors.any?
      flash[:error] = lacquer.errors.full_messages.to_sentence
    else
      if params[:user_lacquer]
        @user_lacquer = lacquer.user_lacquers.create(user_id: current_user.id)
        params[:user_lacquer][:color_ids].each do |color_id|
          if color_id != ""
            @user_lacquer.colors.push(Color.find(color_id))
          end
        end
        params[:user_lacquer][:finish_ids].each do |finish_id|
          if finish_id != ""
            @user_lacquer.finishes.push(Finish.find(finish_id))
          end
        end
      end
    end
    respond_to do |format|
      format.html { redirect_to :back }
      format.js
    end
  end

  def show
    @lacquer = Lacquer.includes(:reviews, :swatches, :users).find(params[:id])
    if current_user
      @friends_you_can_borrow_this_lacquer_from_right_now = @lacquer.users_who_friend_can_borrow_from(current_user).uniq
      @friends_who_have_this_lacquer = @lacquer.users_who_are_friends_with(current_user)
    end
  end

  def edit
    session[:originated_from_uri] = request.env["HTTP_REFERER"] if request.env["HTTP_REFERER"]
    if !current_user
      flash[:alert] = "You must be signed in to edit a lacquer!"
      redirect_to root_path
    else
      if params[:user_lacquer_id] && UserLacquer.find(params[:user_lacquer_id])
        @user_lacquer = UserLacquer.find(params[:user_lacquer_id])
        if @user_lacquer.user_id != @user.id
          flash[:alert] = "You cannot edit a lacquer that is not in your collection!"
          redirect_to root_path
        end
      elsif !UserLacquer.where(user_id: @user.id, lacquer_id: @lacquer.id).empty?
        @user_lacquer = UserLacquer.where(user_id: @user.id, lacquer_id: @lacquer.id).first
      else
        flash[:alert] = "You cannot edit a lacquer that is not in your collection!"
        redirect_to root_path
      end
      if @user_lacquer
        session[:user_lacquer_id] = params[:user_lacquer_id] || @user_lacquer.id
        @swatch = Swatch.new
      end
    end
  end

  def update
    @user_lacquer = UserLacquer.find(params[:lacquer][:user_lacquer_id])

    if @lacquer.user_added_by_id != @user.id && params[:lacquer][:name] || params[:lacquer][:brand_id]
      flash[:alert] = "You do not have permission to change the name or brand of this lacquer."
      redirect_to(:back)
    else
      if @lacquer.user_added_by_id == @user.id && params[:lacquer][:name]
        @lacquer.update(name: params[:lacquer][:name])
      end
      if current_user.id != @user_lacquer.user_id && (params[:lacquer][:user_lacquer])
        flash[:alert] = "You can only change color or finish tags for your own lacquers."
        redirect_to(:back)
      else
        @lacquer.update(lacquer_params)
        @user_lacquer.update(user_lacquer_params[:user_lacquers_attributes]["0"])

        flash[:notice] = "#{@lacquer.name} successfully updated!"
        if session[:originated_from_uri]
          redirect_uri = session[:originated_from_uri]
          session[:originated_from_uri] = nil
          redirect_to redirect_uri
        else
          redirect_to lacquer_path(@lacquer)
        end
      end
    end
  end

  def search
    @search_term = params[:search_term]
    @results = Lacquer.fuzzy_find_by_name(@search_term).uniq
    render :search_results
  end

  private
    def lacquer_params
      params.require(:lacquer).permit(:swatches_attributes => [:image, :user_id, :delete_image], :reviews_attributes => [:rating, :comments, :user_id])
    end

    def user_lacquer_params
      params.require(:lacquer).permit(:user_lacquers_attributes => [:selected_display_image, :color_ids => [], :finish_ids => []])
    end

    def set_lacquer
      @lacquer = Lacquer.find(params[:id])
    end

end