JordanHatch/maslow-redux

View on GitHub
app/controllers/needs_controller.rb

Summary

Maintainability
A
50 mins
Test Coverage
class NeedsController < ApplicationController
  include Concerns::Filterable

  class Http404 < StandardError; end

  rescue_from Http404 do
    render "public/404", :status => 404
  end

  def index
    authorize! :index, Need

    @bookmarks = current_user.bookmarks
    @current_page = needs_path

    respond_to do |format|
      format.html
      format.json
      format.csv do
        send_data NeedsCsvPresenter.new(needs_url, needs).to_csv,
                  filename: 'needs.csv',
                  type: 'text/csv; charset=utf-8'
      end
    end
  end

  def show
    authorize! :read, Need
  end

  def activity
    authorize! :read, Need
  end

  def evidence
    authorize! :read, Need
  end

  def edit
    authorize! :update, Need

    if need.duplicate?
      redirect_to need_url(need.need_id),
                  alert: "Closed needs cannot be edited",
                  status: 303
      return
    end
  end

  def new
    authorize! :create, Need
  end

  def create
    authorize! :create, Need

    need.assign_attributes(need_params)

    if need.save_as(current_user)
      redirect_to redirect_url, notice: "Need created",
        flash: { need_id: need.need_id, goal: need.goal }
    else
      render :new, status: 422
    end
  end

  def update
    authorize! :update, Need

    need.assign_attributes(need_params)

    if need.save_as(current_user)
      redirect_to redirect_url, notice: "Need updated",
        flash: { need_id: need.need_id, goal: need.goal }
    else
      render :edit, status: 422
    end
  end

  def close_as_duplicate
    authorize! :close, Need

    if need.closed?
      redirect_to need_url(need),
                  alert: "This need is already closed",
                  status: 303
      return
    end
  end

  def closed
    authorize! :close, Need

    if need.close_as(current_user, params[:need][:canonical_need_id].to_i)
      redirect_to need_url(need.need_id)
    else
      render :close_as_duplicate, :status => 422
    end
  end

  def reopen
    authorize! :reopen, Need

    if need.reopen_as(current_user)
      redirect_to need_url(need.need_id), notice: "Need re-opened"
    else
      flash[:error] = "There was a problem reopening the need"
      render :show, status: 422
    end
  end

private

  def needs
    @needs ||= filtered_needs.all
  end
  helper_method :needs

  def needs_with_pagination
    @needs_with_pagination ||= needs.page(params[:page])
  end
  helper_method :needs_with_pagination

  def need
    if params.key?(:id)
      @need ||= Need.find_by_id(params[:id])
    else
      @need ||= Need.new
    end
  end
  helper_method :need

  def presenter
    @presenter ||= NeedPresenter.new(need, view_context)
  end
  helper_method :presenter

  def redirect_url
    params["add_new"] ? new_need_path : need_url(need.need_id)
  end

  def need_params
    params.require(:need).permit(:role, :goal, :benefit,
      { proposition_statement_ids: [], team_ids: [] }
    ).tap do |whitelisted|
      permit_fields_for_tags!(whitelisted)
    end
  end

  def permit_fields_for_tags!(whitelisted)
    TagType.all.each do |tag_type|
      key = "tag_ids_of_type_#{tag_type.id}"
      whitelisted[key] = params[:need][key]
    end
  end
end