BigW Consortium Gitlab

project_snippets.rb 4.04 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
module API
  # Projects API
  class ProjectSnippets < Grape::API
    before { authenticate! }

    resource :projects do
      helpers do
        def handle_project_member_errors(errors)
          if errors[:project_access].any?
            error!(errors[:project_access], 422)
          end
          not_found!
        end
      end

      # Get a project snippets
      #
      # Parameters:
      #   id (required) - The ID of a project
      # Example Request:
      #   GET /projects/:id/snippets
      get ":id/snippets" do
        present paginate(user_project.snippets), with: Entities::ProjectSnippet
      end

      # Get a project snippet
      #
      # Parameters:
      #   id (required) - The ID of a project
      #   snippet_id (required) - The ID of a project snippet
      # Example Request:
      #   GET /projects/:id/snippets/:snippet_id
      get ":id/snippets/:snippet_id" do
        @snippet = user_project.snippets.find(params[:snippet_id])
        present @snippet, with: Entities::ProjectSnippet
      end

      # Create a new project snippet
      #
      # Parameters:
      #   id (required) - The ID of a project
      #   title (required) - The title of a snippet
      #   file_name (required) - The name of a snippet file
      #   code (required) - The content of a snippet
45
      #   visibility_level (required) - The snippet's visibility
46 47 48
      # Example Request:
      #   POST /projects/:id/snippets
      post ":id/snippets" do
49
        authorize! :create_project_snippet, user_project
50
        required_attributes! [:title, :file_name, :code, :visibility_level]
51

52
        attrs = attributes_for_keys [:title, :file_name, :visibility_level]
53
        attrs[:content] = params[:code] if params[:code].present?
54
        @snippet = CreateSnippetService.new(user_project, current_user,
55
                                            attrs).execute
56

57
        if @snippet.errors.any?
58
          render_validation_error!(@snippet)
59 60
        else
          present @snippet, with: Entities::ProjectSnippet
61 62 63 64 65 66 67 68 69 70 71
        end
      end

      # Update an existing project snippet
      #
      # Parameters:
      #   id (required) - The ID of a project
      #   snippet_id (required) - The ID of a project snippet
      #   title (optional) - The title of a snippet
      #   file_name (optional) - The name of a snippet file
      #   code (optional) - The content of a snippet
72
      #   visibility_level (optional) - The snippet's visibility
73 74 75 76
      # Example Request:
      #   PUT /projects/:id/snippets/:snippet_id
      put ":id/snippets/:snippet_id" do
        @snippet = user_project.snippets.find(params[:snippet_id])
77
        authorize! :update_project_snippet, @snippet
78

79
        attrs = attributes_for_keys [:title, :file_name, :visibility_level]
80 81
        attrs[:content] = params[:code] if params[:code].present?

82 83 84
        UpdateSnippetService.new(user_project, current_user, @snippet,
                                 attrs).execute
        if @snippet.errors.any?
85
          render_validation_error!(@snippet)
86 87
        else
          present @snippet, with: Entities::ProjectSnippet
88 89 90 91 92 93 94 95 96 97 98 99 100
        end
      end

      # Delete a project snippet
      #
      # Parameters:
      #   id (required) - The ID of a project
      #   snippet_id (required) - The ID of a project snippet
      # Example Request:
      #   DELETE /projects/:id/snippets/:snippet_id
      delete ":id/snippets/:snippet_id" do
        begin
          @snippet = user_project.snippets.find(params[:snippet_id])
101
          authorize! :update_project_snippet, @snippet
102 103
          @snippet.destroy
        rescue
104
          not_found!('Snippet')
105 106 107 108 109 110 111 112 113 114 115 116
        end
      end

      # Get a raw project snippet
      #
      # Parameters:
      #   id (required) - The ID of a project
      #   snippet_id (required) - The ID of a project snippet
      # Example Request:
      #   GET /projects/:id/snippets/:snippet_id/raw
      get ":id/snippets/:snippet_id/raw" do
        @snippet = user_project.snippets.find(params[:snippet_id])
117 118

        env['api.format'] = :txt
119 120 121 122 123 124
        content_type 'text/plain'
        present @snippet.content
      end
    end
  end
end