/app/controllers/snippets_controller.rb

https://gitlab.com/rymai/gitlab · Ruby · 167 lines · 126 code · 38 blank · 3 comment · 13 complexity · 51e3dc80ba9ab1d4b687785ad2718d00 MD5 · raw file

  1. # frozen_string_literal: true
  2. class SnippetsController < ApplicationController
  3. include RendersNotes
  4. include ToggleAwardEmoji
  5. include SpammableActions
  6. include SnippetsActions
  7. include RendersBlob
  8. include PreviewMarkdown
  9. include PaginatedCollection
  10. include Gitlab::NoteableMetadata
  11. skip_before_action :verify_authenticity_token,
  12. if: -> { action_name == 'show' && js_request? }
  13. before_action :snippet, only: [:show, :edit, :destroy, :update, :raw]
  14. before_action :authorize_create_snippet!, only: [:new, :create]
  15. before_action :authorize_read_snippet!, only: [:show, :raw]
  16. before_action :authorize_update_snippet!, only: [:edit, :update]
  17. before_action :authorize_admin_snippet!, only: [:destroy]
  18. skip_before_action :authenticate_user!, only: [:index, :show, :raw]
  19. layout 'snippets'
  20. respond_to :html
  21. def index
  22. if params[:username].present?
  23. @user = UserFinder.new(params[:username]).find_by_username!
  24. @snippets = SnippetsFinder.new(current_user, author: @user, scope: params[:scope])
  25. .execute
  26. .page(params[:page])
  27. .inc_author
  28. return if redirect_out_of_range(@snippets)
  29. @noteable_meta_data = noteable_meta_data(@snippets, 'Snippet')
  30. render 'index'
  31. else
  32. redirect_to(current_user ? dashboard_snippets_path : explore_snippets_path)
  33. end
  34. end
  35. def new
  36. @snippet = PersonalSnippet.new
  37. end
  38. def create
  39. create_params = snippet_params.merge(spammable_params)
  40. service_response = Snippets::CreateService.new(nil, current_user, create_params).execute
  41. @snippet = service_response.payload[:snippet]
  42. move_temporary_files if @snippet.valid? && params[:files]
  43. recaptcha_check_with_fallback { render :new }
  44. end
  45. def update
  46. update_params = snippet_params.merge(spammable_params)
  47. service_response = Snippets::UpdateService.new(nil, current_user, update_params).execute(@snippet)
  48. @snippet = service_response.payload[:snippet]
  49. recaptcha_check_with_fallback { render :edit }
  50. end
  51. def show
  52. conditionally_expand_blob(blob)
  53. respond_to do |format|
  54. format.html do
  55. @note = Note.new(noteable: @snippet)
  56. @noteable = @snippet
  57. @discussions = @snippet.discussions
  58. @notes = prepare_notes_for_rendering(@discussions.flat_map(&:notes), @noteable)
  59. render 'show'
  60. end
  61. format.json do
  62. render_blob_json(blob)
  63. end
  64. format.js do
  65. if @snippet.embeddable?
  66. render 'shared/snippets/show'
  67. else
  68. head :not_found
  69. end
  70. end
  71. end
  72. end
  73. def destroy
  74. service_response = Snippets::DestroyService.new(current_user, @snippet).execute
  75. if service_response.success?
  76. redirect_to dashboard_snippets_path, status: :found
  77. elsif service_response.http_status == 403
  78. access_denied!
  79. else
  80. redirect_to snippet_path(@snippet),
  81. status: :found,
  82. alert: service_response.message
  83. end
  84. end
  85. protected
  86. # rubocop: disable CodeReuse/ActiveRecord
  87. def snippet
  88. @snippet ||= PersonalSnippet.inc_relations_for_view.find_by(id: params[:id])
  89. end
  90. # rubocop: enable CodeReuse/ActiveRecord
  91. alias_method :awardable, :snippet
  92. alias_method :spammable, :snippet
  93. def blob
  94. return unless snippet
  95. @blob ||= if Feature.enabled?(:version_snippets, current_user) && !snippet.repository.empty?
  96. snippet.blobs.first
  97. else
  98. snippet.blob
  99. end
  100. end
  101. def spammable_path
  102. snippet_path(@snippet)
  103. end
  104. def authorize_read_snippet!
  105. return if can?(current_user, :read_snippet, @snippet)
  106. if current_user
  107. render_404
  108. else
  109. authenticate_user!
  110. end
  111. end
  112. def authorize_update_snippet!
  113. return render_404 unless can?(current_user, :update_snippet, @snippet)
  114. end
  115. def authorize_admin_snippet!
  116. return render_404 unless can?(current_user, :admin_snippet, @snippet)
  117. end
  118. def authorize_create_snippet!
  119. return render_404 unless can?(current_user, :create_snippet)
  120. end
  121. def snippet_params
  122. params.require(:personal_snippet).permit(:title, :content, :file_name, :private, :visibility_level, :description)
  123. end
  124. def move_temporary_files
  125. params[:files].each do |file|
  126. FileMover.new(file, from_model: current_user, to_model: @snippet).execute
  127. end
  128. end
  129. end