/lib/api/project_snippets.rb

https://gitlab.com/vicvega/gitlab-ce · Ruby · 129 lines · 67 code · 13 blank · 49 comment · 5 complexity · 6d10e1e269a3b1a9f7c3e77421be3b26 MD5 · raw file

  1. module API
  2. # Projects API
  3. class ProjectSnippets < Grape::API
  4. before { authenticate! }
  5. resource :projects do
  6. helpers do
  7. def handle_project_member_errors(errors)
  8. if errors[:project_access].any?
  9. error!(errors[:project_access], 422)
  10. end
  11. not_found!
  12. end
  13. def snippets_for_current_user
  14. finder_params = { filter: :by_project, project: user_project }
  15. SnippetsFinder.new.execute(current_user, finder_params)
  16. end
  17. end
  18. # Get a project snippets
  19. #
  20. # Parameters:
  21. # id (required) - The ID of a project
  22. # Example Request:
  23. # GET /projects/:id/snippets
  24. get ":id/snippets" do
  25. present paginate(snippets_for_current_user), with: Entities::ProjectSnippet
  26. end
  27. # Get a project snippet
  28. #
  29. # Parameters:
  30. # id (required) - The ID of a project
  31. # snippet_id (required) - The ID of a project snippet
  32. # Example Request:
  33. # GET /projects/:id/snippets/:snippet_id
  34. get ":id/snippets/:snippet_id" do
  35. @snippet = snippets_for_current_user.find(params[:snippet_id])
  36. present @snippet, with: Entities::ProjectSnippet
  37. end
  38. # Create a new project snippet
  39. #
  40. # Parameters:
  41. # id (required) - The ID of a project
  42. # title (required) - The title of a snippet
  43. # file_name (required) - The name of a snippet file
  44. # code (required) - The content of a snippet
  45. # visibility_level (required) - The snippet's visibility
  46. # Example Request:
  47. # POST /projects/:id/snippets
  48. post ":id/snippets" do
  49. authorize! :create_project_snippet, user_project
  50. required_attributes! [:title, :file_name, :code, :visibility_level]
  51. attrs = attributes_for_keys [:title, :file_name, :visibility_level]
  52. attrs[:content] = params[:code] if params[:code].present?
  53. @snippet = CreateSnippetService.new(user_project, current_user,
  54. attrs).execute
  55. if @snippet.errors.any?
  56. render_validation_error!(@snippet)
  57. else
  58. present @snippet, with: Entities::ProjectSnippet
  59. end
  60. end
  61. # Update an existing project snippet
  62. #
  63. # Parameters:
  64. # id (required) - The ID of a project
  65. # snippet_id (required) - The ID of a project snippet
  66. # title (optional) - The title of a snippet
  67. # file_name (optional) - The name of a snippet file
  68. # code (optional) - The content of a snippet
  69. # visibility_level (optional) - The snippet's visibility
  70. # Example Request:
  71. # PUT /projects/:id/snippets/:snippet_id
  72. put ":id/snippets/:snippet_id" do
  73. @snippet = snippets_for_current_user.find(params[:snippet_id])
  74. authorize! :update_project_snippet, @snippet
  75. attrs = attributes_for_keys [:title, :file_name, :visibility_level]
  76. attrs[:content] = params[:code] if params[:code].present?
  77. UpdateSnippetService.new(user_project, current_user, @snippet,
  78. attrs).execute
  79. if @snippet.errors.any?
  80. render_validation_error!(@snippet)
  81. else
  82. present @snippet, with: Entities::ProjectSnippet
  83. end
  84. end
  85. # Delete a project snippet
  86. #
  87. # Parameters:
  88. # id (required) - The ID of a project
  89. # snippet_id (required) - The ID of a project snippet
  90. # Example Request:
  91. # DELETE /projects/:id/snippets/:snippet_id
  92. delete ":id/snippets/:snippet_id" do
  93. begin
  94. @snippet = snippets_for_current_user.find(params[:snippet_id])
  95. authorize! :update_project_snippet, @snippet
  96. @snippet.destroy
  97. rescue
  98. not_found!('Snippet')
  99. end
  100. end
  101. # Get a raw project snippet
  102. #
  103. # Parameters:
  104. # id (required) - The ID of a project
  105. # snippet_id (required) - The ID of a project snippet
  106. # Example Request:
  107. # GET /projects/:id/snippets/:snippet_id/raw
  108. get ":id/snippets/:snippet_id/raw" do
  109. @snippet = snippets_for_current_user.find(params[:snippet_id])
  110. env['api.format'] = :txt
  111. content_type 'text/plain'
  112. present @snippet.content
  113. end
  114. end
  115. end
  116. end