/app/controllers/projects/milestones_controller.rb

https://gitlab.com/Stretch96/gitlab-ce · Ruby · 152 lines · 112 code · 31 blank · 9 comment · 6 complexity · f89a982f11423e3f63fc877a74075977 MD5 · raw file

  1. # frozen_string_literal: true
  2. class Projects::MilestonesController < Projects::ApplicationController
  3. include Gitlab::Utils::StrongMemoize
  4. include MilestoneActions
  5. before_action :check_issuables_available!
  6. before_action :milestone, only: [:edit, :update, :destroy, :show, :merge_requests, :participants, :labels, :promote]
  7. # Allow read any milestone
  8. before_action :authorize_read_milestone!
  9. # Allow admin milestone
  10. before_action :authorize_admin_milestone!, except: [:index, :show, :merge_requests, :participants, :labels]
  11. # Allow to promote milestone
  12. before_action :authorize_promote_milestone!, only: :promote
  13. respond_to :html
  14. def index
  15. @sort = params[:sort] || 'due_date_asc'
  16. @milestones = milestones.sort_by_attribute(@sort)
  17. respond_to do |format|
  18. format.html do
  19. @project_namespace = @project.namespace.becomes(Namespace)
  20. # We need to show group milestones in the JSON response
  21. # so that people can filter by and assign group milestones,
  22. # but we don't need to show them on the project milestones page itself.
  23. @milestones = @milestones.for_projects
  24. @milestones = @milestones.page(params[:page])
  25. end
  26. format.json do
  27. render json: @milestones.to_json(methods: :name)
  28. end
  29. end
  30. end
  31. def new
  32. @milestone = @project.milestones.new
  33. respond_with(@milestone)
  34. end
  35. def edit
  36. respond_with(@milestone)
  37. end
  38. def show
  39. @project_namespace = @project.namespace.becomes(Namespace)
  40. respond_to do |format|
  41. format.html
  42. end
  43. end
  44. def create
  45. @milestone = Milestones::CreateService.new(project, current_user, milestone_params).execute
  46. if @milestone.valid?
  47. redirect_to project_milestone_path(@project, @milestone)
  48. else
  49. render "new"
  50. end
  51. end
  52. def update
  53. @milestone = Milestones::UpdateService.new(project, current_user, milestone_params).execute(milestone)
  54. respond_to do |format|
  55. format.js
  56. format.html do
  57. if @milestone.valid?
  58. redirect_to project_milestone_path(@project, @milestone)
  59. else
  60. render :edit
  61. end
  62. end
  63. end
  64. end
  65. def promote
  66. promoted_milestone = Milestones::PromoteService.new(project, current_user).execute(milestone)
  67. flash[:notice] = flash_notice_for(promoted_milestone, project_group)
  68. respond_to do |format|
  69. format.html do
  70. redirect_to project_milestones_path(project)
  71. end
  72. format.json do
  73. render json: { url: project_milestones_path(project) }
  74. end
  75. end
  76. rescue Milestones::PromoteService::PromoteMilestoneError => error
  77. redirect_to milestone, alert: error.message
  78. end
  79. def flash_notice_for(milestone, group)
  80. ''.html_safe + "#{milestone.title} promoted to " + view_context.link_to('<u>group milestone</u>'.html_safe, group_milestone_path(group, milestone.iid)) + '.'
  81. end
  82. def destroy
  83. return access_denied! unless can?(current_user, :admin_milestone, @project)
  84. Milestones::DestroyService.new(project, current_user).execute(milestone)
  85. respond_to do |format|
  86. format.html { redirect_to namespace_project_milestones_path, status: :see_other }
  87. format.js { head :ok }
  88. end
  89. end
  90. protected
  91. def project_group
  92. strong_memoize(:project_group) do
  93. project.group
  94. end
  95. end
  96. def milestones
  97. strong_memoize(:milestones) do
  98. MilestonesFinder.new(search_params).execute
  99. end
  100. end
  101. # rubocop: disable CodeReuse/ActiveRecord
  102. def milestone
  103. @milestone ||= @project.milestones.find_by!(iid: params[:id])
  104. end
  105. # rubocop: enable CodeReuse/ActiveRecord
  106. def authorize_admin_milestone!
  107. return render_404 unless can?(current_user, :admin_milestone, @project)
  108. end
  109. def authorize_promote_milestone!
  110. return render_404 unless can?(current_user, :admin_milestone, project_group)
  111. end
  112. def milestone_params
  113. params.require(:milestone).permit(:title, :description, :start_date, :due_date, :state_event)
  114. end
  115. def search_params
  116. if request.format.json? && project_group && can?(current_user, :read_group, project_group)
  117. groups = project_group.self_and_ancestors.select(:id)
  118. end
  119. params.permit(:state, :search_title).merge(project_ids: @project.id, group_ids: groups)
  120. end
  121. end