labels_controller.rb 4.29 KB
Newer Older
1
class Projects::LabelsController < Projects::ApplicationController
2 3
  include ToggleSubscriptionAction

4
  before_action :check_issuables_available!
5
  before_action :label, only: [:edit, :update, :destroy, :promote]
6
  before_action :find_labels, only: [:index, :set_priorities, :remove_priority, :toggle_subscription]
7
  before_action :authorize_read_label!
8 9 10
  before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
                                                 :generate, :destroy, :remove_priority,
                                                 :set_priorities]
11
  before_action :authorize_admin_group_labels!, only: [:promote]
randx's avatar
randx committed
12 13 14 15

  respond_to :js, :html

  def index
16 17
    @prioritized_labels = @available_labels.prioritized(@project)
    @labels = @available_labels.unprioritized(@project).page(params[:page])
18 19 20 21

    respond_to do |format|
      format.html
      format.json do
22
        render json: LabelSerializer.new.represent_appearance(@available_labels)
23 24
      end
    end
randx's avatar
randx committed
25 26
  end

27 28 29 30 31
  def new
    @label = @project.labels.new
  end

  def create
32
    @label = Labels::CreateService.new(label_params).execute(project: @project)
33 34

    if @label.valid?
35
      respond_to do |format|
36
        format.html { redirect_to project_labels_path(@project) }
37 38
        format.json { render json: @label }
      end
39
    else
40
      respond_to do |format|
41
        format.html { render :new }
42 43
        format.json { render json: { message: @label.errors.messages }, status: 400 }
      end
44 45 46 47 48 49 50
    end
  end

  def edit
  end

  def update
51 52 53
    @label = Labels::UpdateService.new(label_params).execute(@label)

    if @label.valid?
54
      redirect_to project_labels_path(@project)
55
    else
56
      render :edit
57 58 59
    end
  end

60
  def generate
61
    Gitlab::IssuesLabels.generate(@project)
62

63
    if params[:redirect] == 'issues'
64
      redirect_to project_issues_path(@project)
65
    elsif params[:redirect] == 'merge_requests'
66
      redirect_to project_merge_requests_path(@project)
67
    else
68
      redirect_to project_labels_path(@project)
69
    end
70 71
  end

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
72 73
  def destroy
    @label.destroy
74
    @labels = find_labels
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
75

76
    redirect_to project_labels_path(@project),
77 78
                status: 302,
                notice: 'Label was removed'
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
79 80
  end

81
  def remove_priority
82
    respond_to do |format|
83
      label = @available_labels.find(params[:id])
84

85
      if label.unprioritize!(project)
86 87
        format.json { render json: label }
      else
88
        format.json { head :unprocessable_entity }
89 90 91 92
      end
    end
  end

Alfredo Sumaran's avatar
Alfredo Sumaran committed
93
  def set_priorities
94
    Label.transaction do
95 96
      available_labels_ids = @available_labels.where(id: params[:label_ids]).pluck(:id)
      label_ids = params[:label_ids].select { |id| available_labels_ids.include?(id.to_i) }
97

98 99 100
      label_ids.each_with_index do |label_id, index|
        label = @available_labels.find(label_id)
        label.prioritize!(project, index)
101 102 103
      end
    end

104
    respond_to do |format|
105
      format.json { render json: { message: 'success' } }
106 107 108
    end
  end

109 110 111 112 113 114 115
  def promote
    promote_service = Labels::PromoteService.new(@project, @current_user)

    begin
      return render_404 unless promote_service.execute(@label)
      respond_to do |format|
        format.html do
116
          redirect_to(project_labels_path(@project),
117 118 119 120 121 122 123 124 125 126
                      notice: 'Label was promoted to a Group Label')
        end
        format.js
      end
    rescue ActiveRecord::RecordInvalid => e
      Gitlab::AppLogger.error "Failed to promote label \"#{@label.title}\" to group label"
      Gitlab::AppLogger.error e

      respond_to do |format|
        format.html do
127
          redirect_to(project_labels_path(@project),
128 129 130 131 132 133 134
                      notice: 'Failed to promote label due to internal error. Please contact administrators.')
        end
        format.js
      end
    end
  end

randx's avatar
randx committed
135 136
  protected

137
  def label_params
Alfredo Sumaran's avatar
Alfredo Sumaran committed
138
    params.require(:label).permit(:title, :description, :color)
139 140 141
  end

  def label
142
    @label ||= @project.labels.find(params[:id])
143
  end
144 145 146 147

  def subscribable_resource
    @available_labels.find(params[:id])
  end
148

149
  def find_labels
150
    @available_labels ||= LabelsFinder.new(current_user, project_id: @project.id).execute
151 152
  end

153 154 155
  def authorize_admin_labels!
    return render_404 unless can?(current_user, :admin_label, @project)
  end
156

157 158
  def authorize_admin_group_labels!
    return render_404 unless can?(current_user, :admin_label, @project.group)
159
  end
randx's avatar
randx committed
160
end