milestones_controller.rb 3.88 KB
Newer Older
1 2
# frozen_string_literal: true

3
class Projects::MilestonesController < Projects::ApplicationController
4
  include Gitlab::Utils::StrongMemoize
5 6
  include MilestoneActions

7
  before_action :check_issuables_available!
8
  before_action :milestone, only: [:edit, :update, :destroy, :show, :merge_requests, :participants, :labels, :promote]
9 10

  # Allow read any milestone
11
  before_action :authorize_read_milestone!
12 13

  # Allow admin milestone
14
  before_action :authorize_admin_milestone!, except: [:index, :show, :merge_requests, :participants, :labels, :promote]
15 16 17 18

  respond_to :html

  def index
19
    @sort = params[:sort] || 'due_date_asc'
20
    @milestones = milestones.sort_by_attribute(@sort)
21

22
    respond_to do |format|
23
      format.html do
24
        @project_namespace = @project.namespace.becomes(Namespace)
Felipe Artur's avatar
Felipe Artur committed
25 26 27 28
        # We need to show group milestones in the JSON response
        # so that people can filter by and assign group milestones,
        # but we don't need to show them on the project milestones page itself.
        @milestones = @milestones.for_projects
29
        @milestones = @milestones.page(params[:page])
30
      end
31
      format.json do
32
        render json: @milestones.to_json(methods: :name)
33 34
      end
    end
35 36 37 38 39 40 41 42 43 44 45 46
  end

  def new
    @milestone = @project.milestones.new
    respond_with(@milestone)
  end

  def edit
    respond_with(@milestone)
  end

  def show
47
    @project_namespace = @project.namespace.becomes(Namespace)
48 49 50 51

    respond_to do |format|
      format.html
    end
52 53 54
  end

  def create
55
    @milestone = Milestones::CreateService.new(project, current_user, milestone_params).execute
56

Felipe Artur's avatar
Felipe Artur committed
57
    if @milestone.valid?
58
      redirect_to project_milestone_path(@project, @milestone)
59 60 61 62 63 64
    else
      render "new"
    end
  end

  def update
65
    @milestone = Milestones::UpdateService.new(project, current_user, milestone_params).execute(milestone)
66 67 68

    respond_to do |format|
      format.js
69
      format.html do
70
        if @milestone.valid?
71
          redirect_to project_milestone_path(@project, @milestone)
72 73 74 75 76 77 78
        else
          render :edit
        end
      end
    end
  end

79
  def promote
80
    promoted_milestone = Milestones::PromoteService.new(project, current_user).execute(milestone)
81 82
    flash[:notice] = flash_notice_for(promoted_milestone, project.group)

83 84 85 86 87 88 89 90
    respond_to do |format|
      format.html do
        redirect_to project_milestones_path(project)
      end
      format.json do
        render json: { url: project_milestones_path(project) }
      end
    end
91 92 93 94
  rescue Milestones::PromoteService::PromoteMilestoneError => error
    redirect_to milestone, alert: error.message
  end

95
  def flash_notice_for(milestone, group)
96
    ''.html_safe + "#{milestone.title} promoted to " + view_context.link_to('<u>group milestone</u>'.html_safe, group_milestone_path(group, milestone.iid)) + '.'
97 98
  end

99
  def destroy
100 101
    return access_denied! unless can?(current_user, :admin_milestone, @project)

102
    Milestones::DestroyService.new(project, current_user).execute(milestone)
103 104

    respond_to do |format|
Lin Jen-Shin's avatar
Lin Jen-Shin committed
105
      format.html { redirect_to namespace_project_milestones_path, status: :see_other }
106
      format.js { head :ok }
107 108 109 110 111
    end
  end

  protected

Felipe Artur's avatar
Felipe Artur committed
112
  def milestones
113
    strong_memoize(:milestones) do
Felipe Artur's avatar
Felipe Artur committed
114 115 116 117
      MilestonesFinder.new(search_params).execute
    end
  end

118
  # rubocop: disable CodeReuse/ActiveRecord
119
  def milestone
skv's avatar
skv committed
120
    @milestone ||= @project.milestones.find_by!(iid: params[:id])
121
  end
122
  # rubocop: enable CodeReuse/ActiveRecord
123 124 125 126 127

  def authorize_admin_milestone!
    return render_404 unless can?(current_user, :admin_milestone, @project)
  end

128
  def milestone_params
129
    params.require(:milestone).permit(:title, :description, :start_date, :due_date, :state_event)
130
  end
131 132

  def search_params
133
    if request.format.json? && @project.group && can?(current_user, :read_group, @project.group)
134
      groups = @project.group.self_and_ancestors_ids
135 136
    end

137
    params.permit(:state).merge(project_ids: @project.id, group_ids: groups)
138
  end
139
end