problems_controller.rb 4.17 KB
##
# Manage problems
#
# List of actions available :
# MEMBER => :show, :edit, :update, :create, :destroy, :resolve, :unresolve, :create_issue, :unlink_issue
# COLLECTION => :index, :all, :destroy_several, :resolve_several, :unresolve_several, :merge_several, :unmerge_several, :search
class ProblemsController < ApplicationController
  include ProblemsSearcher

  before_action :need_selected_problem, only: [
    :resolve_several, :unresolve_several, :unmerge_several
  ]

  expose(:app_scope) do
    params[:app_id] ? App.where(_id: params[:app_id]) : App.all
  end

  expose(:app) do
    AppDecorator.new app_scope.find(params[:app_id])
  end

  expose(:problem) do
    ProblemDecorator.new app.problems.find(params[:id])
  end

  expose(:all_errs) do
    params[:all_errs]
  end

  expose(:params_environement) do
    params[:environment]
  end

  expose(:problems) do
    pro = Problem.
      for_apps(app_scope).
      in_env(params_environement).
      all_else_unresolved(all_errs).
      ordered_by(params_sort, params_order)

    if request.format == :html
      pro.page(params[:page]).per(current_user.per_page)
    else
      pro
    end
  end

  def index; end

  def show
    @notices = problem.object.notices.reverse_ordered.
      page(params[:notice]).per(1)
    @notice  = NoticeDecorator.new @notices.first
    @comment = Comment.new
  end

  def close_issue
    issue = Issue.new(problem: problem, user: current_user)
    flash[:error] = issue.errors.full_messages.join(', ') unless issue.close

    redirect_to app_problem_path(app, problem)
  end

  def create_issue
    issue = Issue.new(problem: problem, user: current_user)
    issue.body = render_to_string(*issue.render_body_args)

    flash[:error] = issue.errors.full_messages.join(', ') unless issue.save

    redirect_to app_problem_path(app, problem)
  end

  def unlink_issue
    problem.update_attribute :issue_link, nil
    redirect_to app_problem_path(app, problem)
  end

  def resolve
    problem.resolve!
    flash[:success] = 'Great news everyone! The error has been resolved.'
    redirect_to :back
  rescue ActionController::RedirectBackError
    redirect_to app_path(app)
  end

  def resolve_several
    selected_problems.each(&:resolve!)
    flash[:success] = "Great news everyone! #{I18n.t(:n_errs_have, count: selected_problems.count)} been resolved."
    redirect_to :back
  end

  def unresolve_several
    selected_problems.each(&:unresolve!)
    flash[:success] = "#{I18n.t(:n_errs_have, count: selected_problems.count)} been unresolved."
    redirect_to :back
  end

  ##
  # Action to merge several Problem in One problem
  #
  # @param [ Array<String> ] :problems the list of problem ids
  #
  def merge_several
    if selected_problems.length < 2
      flash[:notice] = I18n.t('controllers.problems.flash.need_two_errors_merge')
    else
      ProblemMerge.new(selected_problems).merge
      flash[:notice] = I18n.t('controllers.problems.flash.merge_several.success', nb: selected_problems.count)
    end
    redirect_to :back
  end

  def unmerge_several
    all = selected_problems.map(&:unmerge!).flatten
    flash[:success] = "#{I18n.t(:n_errs_have, count: all.length)} been unmerged."
    redirect_to :back
  end

  def destroy_several
    nb_problem_destroy = ProblemDestroy.execute(selected_problems)
    flash[:notice] = "#{I18n.t(:n_errs_have, count: nb_problem_destroy)} been deleted."
    redirect_to :back
  end

  def destroy_all
    nb_problem_destroy = ProblemDestroy.execute(app.problems)
    flash[:success] = "#{I18n.t(:n_errs_have, count: nb_problem_destroy)} been deleted."
    redirect_to :back
  rescue ActionController::RedirectBackError
    redirect_to app_path(app)
  end

  def search
    ps = Problem.search(params[:search]).for_apps(app_scope).in_env(params[:environment]).all_else_unresolved(params[:all_errs]).ordered_by(params_sort, params_order)
    self.problems = ps.page(params[:page]).per(current_user.per_page)
    respond_to do |format|
      format.html { render :index }
      format.js
    end
  end

  ##
  # Redirect :back if no errors selected
  #
  protected def need_selected_problem
    return if err_ids.any?

    flash[:notice] = I18n.t('controllers.problems.flash.no_select_problem')
    redirect_to :back
  end
end