mysociety/alaveteli

View on GitHub
app/controllers/alaveteli_pro/draft_info_request_batches_controller.rb

Summary

Maintainability
A
45 mins
Test Coverage
class AlaveteliPro::DraftInfoRequestBatchesController < ApplicationController
  include AlaveteliPro::BatchRequest

  def create
    @draft = current_user.draft_info_request_batches.create(draft_params)
    respond_or_redirect(@draft)
  end

  def update
    @draft = current_user.draft_info_request_batches.find(params[:id])
    @draft.update(draft_params_multiple_bodies)
    if params[:preview]
      redirect_to preview_new_alaveteli_pro_info_request_batch_path(draft_id: @draft.id)
    else
      redirect_to new_alaveteli_pro_info_request_batch_path(draft_id: @draft.id),
                  notice: _("Your draft has been saved!")
    end
  end

  def update_bodies
    @draft = current_user.draft_info_request_batches.
      find_by(id: update_bodies_params[:draft_id])
    case update_bodies_params[:action]
    when 'add-all'
      @draft ||= current_user.draft_info_request_batches.create
      requestable = PublicBody.with_tag(category_tag).select(&:is_requestable?)
      @draft.public_bodies << requestable
    when 'add'
      public_body = PublicBody.find(update_bodies_params[:public_body_id])
      @draft ||= current_user.draft_info_request_batches.create
      @draft.public_bodies << public_body
    when 'remove'
      public_body = PublicBody.find(update_bodies_params[:public_body_id])
      raise ActiveRecord::RecordNotFound unless @draft

      @draft.public_bodies.delete(public_body)
      @draft.destroy! if @draft.public_bodies.empty?
    end
    respond_or_redirect(@draft)
  end

  private

  def respond_or_redirect(_draft)
    @query = params[:authority_query]
    @page = params[:page]
    if request.xhr?
      respond_with_partial(@draft, @query, @page)
    else
      redirect_after_create_or_update_bodies(@draft, @query, @page)
    end
  end

  def redirect_after_create_or_update_bodies(draft, query, page)
    redirect_params = { mode: mode,
                        category_tag: category_tag }

    if query
      redirect_params[:authority_query] = query
      redirect_params[:page] = page
    end

    if draft.persisted?
      redirect_params[:draft_id] = draft.id
      flash[:notice] = _('Your Batch Request has been saved!')
    end

    path =
      alaveteli_pro_batch_request_authority_searches_path(redirect_params)

    redirect_to path
  end

  def respond_with_partial(draft, query, page)
    render partial: 'summary',
           layout: false,
           locals: { draft: draft,
                     query: query,
                     page: page,
                     mode: mode,
                     category_tag: category_tag }
  end

  # #create and #update accept an array of public_body_ids, whereas
  # #update_bodies only take a single body to add or remove, hence the two
  # different params.
  def draft_params
    params.require(:alaveteli_pro_draft_info_request_batch).
      permit(:title, :body, :embargo_duration, :public_body_ids )
  end

  def draft_params_multiple_bodies
    params.require(:alaveteli_pro_draft_info_request_batch).
      permit(:title, :body, :embargo_duration, public_body_ids: [])
  end

  def update_bodies_params
    params.require(:alaveteli_pro_draft_info_request_batch).
      permit(:draft_id, :public_body_id, :action)
  end
end