/app/controllers/projects/labels_controller.rb

https://gitlab.com/artofhuman/gitlab-ce · Ruby · 181 lines · 145 code · 33 blank · 3 comment · 7 complexity · ad57d1de57e5d4d0644456fd128142e4 MD5 · raw file

  1. # frozen_string_literal: true
  2. class Projects::LabelsController < Projects::ApplicationController
  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. before_action :authorize_admin_labels!, only: [:new, :create, :edit, :update,
  9. :generate, :destroy, :remove_priority,
  10. :set_priorities]
  11. before_action :authorize_admin_group_labels!, only: [:promote]
  12. respond_to :js, :html
  13. def index
  14. @prioritized_labels = @available_labels.prioritized(@project)
  15. @labels = @available_labels.unprioritized(@project).page(params[:page])
  16. respond_to do |format|
  17. format.html
  18. format.json do
  19. render json: LabelSerializer.new.represent_appearance(@available_labels)
  20. end
  21. end
  22. end
  23. def new
  24. @label = @project.labels.new
  25. end
  26. def create
  27. @label = Labels::CreateService.new(label_params).execute(project: @project)
  28. if @label.valid?
  29. respond_to do |format|
  30. format.html { redirect_to project_labels_path(@project) }
  31. format.json { render json: @label }
  32. end
  33. else
  34. respond_to do |format|
  35. format.html { render :new }
  36. format.json { render json: { message: @label.errors.messages }, status: :bad_request }
  37. end
  38. end
  39. end
  40. def edit
  41. end
  42. def update
  43. @label = Labels::UpdateService.new(label_params).execute(@label)
  44. if @label.valid?
  45. redirect_to project_labels_path(@project)
  46. else
  47. render :edit
  48. end
  49. end
  50. def generate
  51. Gitlab::IssuesLabels.generate(@project)
  52. if params[:redirect] == 'issues'
  53. redirect_to project_issues_path(@project)
  54. elsif params[:redirect] == 'merge_requests'
  55. redirect_to project_merge_requests_path(@project)
  56. else
  57. redirect_to project_labels_path(@project)
  58. end
  59. end
  60. def destroy
  61. @label.destroy
  62. @labels = find_labels
  63. redirect_to project_labels_path(@project),
  64. status: 302,
  65. notice: 'Label was removed'
  66. end
  67. def remove_priority
  68. respond_to do |format|
  69. label = @available_labels.find(params[:id])
  70. if label.unprioritize!(project)
  71. format.json { render json: label }
  72. else
  73. format.json { head :unprocessable_entity }
  74. end
  75. end
  76. end
  77. # rubocop: disable CodeReuse/ActiveRecord
  78. def set_priorities
  79. Label.transaction do
  80. available_labels_ids = @available_labels.where(id: params[:label_ids]).pluck(:id)
  81. label_ids = params[:label_ids].select { |id| available_labels_ids.include?(id.to_i) }
  82. label_ids.each_with_index do |label_id, index|
  83. label = @available_labels.find(label_id)
  84. label.prioritize!(project, index)
  85. end
  86. end
  87. respond_to do |format|
  88. format.json { render json: { message: 'success' } }
  89. end
  90. end
  91. # rubocop: enable CodeReuse/ActiveRecord
  92. def promote
  93. promote_service = Labels::PromoteService.new(@project, @current_user)
  94. begin
  95. return render_404 unless promote_service.execute(@label)
  96. flash[:notice] = flash_notice_for(@label, @project.group)
  97. respond_to do |format|
  98. format.html do
  99. redirect_to(project_labels_path(@project), status: :see_other)
  100. end
  101. format.json do
  102. render json: { url: project_labels_path(@project) }
  103. end
  104. end
  105. rescue ActiveRecord::RecordInvalid => e
  106. Gitlab::AppLogger.error "Failed to promote label \"#{@label.title}\" to group label"
  107. Gitlab::AppLogger.error e
  108. respond_to do |format|
  109. format.html do
  110. redirect_to(project_labels_path(@project),
  111. notice: 'Failed to promote label due to internal error. Please contact administrators.')
  112. end
  113. format.js
  114. end
  115. end
  116. end
  117. def flash_notice_for(label, group)
  118. ''.html_safe + "#{label.title} promoted to " + view_context.link_to('<u>group label</u>'.html_safe, group_labels_path(group)) + '.'
  119. end
  120. protected
  121. def label_params
  122. params.require(:label).permit(:title, :description, :color)
  123. end
  124. def label
  125. @label ||= @project.labels.find(params[:id])
  126. end
  127. def subscribable_resource
  128. @available_labels.find(params[:id])
  129. end
  130. def find_labels
  131. @available_labels ||=
  132. LabelsFinder.new(current_user,
  133. project_id: @project.id,
  134. include_ancestor_groups: params[:include_ancestor_groups],
  135. search: params[:search],
  136. subscribed: params[:subscribed],
  137. sort: sort).execute
  138. end
  139. def sort
  140. @sort ||= params[:sort] || 'name_asc'
  141. end
  142. def authorize_admin_labels!
  143. return render_404 unless can?(current_user, :admin_label, @project)
  144. end
  145. def authorize_admin_group_labels!
  146. return render_404 unless can?(current_user, :admin_label, @project.group)
  147. end
  148. end