snippets.rb 4.93 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
module API
  module V3
    class Snippets < Grape::API
      include PaginationParams

      before { authenticate! }

      resource :snippets do
        helpers do
          def snippets_for_current_user
11
            SnippetsFinder.new(current_user, author: current_user).execute
12 13 14
          end

          def public_snippets
15
            SnippetsFinder.new(current_user, visibility: Snippet::PUBLIC).execute
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
          end
        end

        desc 'Get a snippets list for authenticated user' do
          detail 'This feature was introduced in GitLab 8.15.'
          success ::API::Entities::PersonalSnippet
        end
        params do
          use :pagination
        end
        get do
          present paginate(snippets_for_current_user), with: ::API::Entities::PersonalSnippet
        end

        desc 'List all public snippets current_user has access to' do
          detail 'This feature was introduced in GitLab 8.15.'
          success ::API::Entities::PersonalSnippet
        end
        params do
          use :pagination
        end
        get 'public' do
          present paginate(public_snippets), with: ::API::Entities::PersonalSnippet
        end

        desc 'Get a single snippet' do
          detail 'This feature was introduced in GitLab 8.15.'
          success ::API::Entities::PersonalSnippet
        end
        params do
          requires :id, type: Integer, desc: 'The ID of a snippet'
        end
        get ':id' do
          snippet = snippets_for_current_user.find(params[:id])
          present snippet, with: ::API::Entities::PersonalSnippet
        end

        desc 'Create new snippet' do
          detail 'This feature was introduced in GitLab 8.15.'
          success ::API::Entities::PersonalSnippet
        end
        params do
          requires :title, type: String, desc: 'The title of a snippet'
          requires :file_name, type: String, desc: 'The name of a snippet file'
          requires :content, type: String, desc: 'The content of a snippet'
          optional :visibility_level, type: Integer,
                                      values: Gitlab::VisibilityLevel.values,
                                      default: Gitlab::VisibilityLevel::INTERNAL,
                                      desc: 'The visibility level of the snippet'
        end
        post do
          attrs = declared_params(include_missing: false).merge(request: request, api: true)
          snippet = CreateSnippetService.new(nil, current_user, attrs).execute

          if snippet.persisted?
            present snippet, with: ::API::Entities::PersonalSnippet
          else
            render_validation_error!(snippet)
          end
        end

        desc 'Update an existing snippet' do
          detail 'This feature was introduced in GitLab 8.15.'
          success ::API::Entities::PersonalSnippet
        end
        params do
          requires :id, type: Integer, desc: 'The ID of a snippet'
          optional :title, type: String, desc: 'The title of a snippet'
          optional :file_name, type: String, desc: 'The name of a snippet file'
          optional :content, type: String, desc: 'The content of a snippet'
          optional :visibility_level, type: Integer,
                                      values: Gitlab::VisibilityLevel.values,
                                      desc: 'The visibility level of the snippet'
          at_least_one_of :title, :file_name, :content, :visibility_level
        end
        put ':id' do
          snippet = snippets_for_current_user.find_by(id: params.delete(:id))
          return not_found!('Snippet') unless snippet
94

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
          authorize! :update_personal_snippet, snippet

          attrs = declared_params(include_missing: false)

          UpdateSnippetService.new(nil, current_user, snippet, attrs).execute
          if snippet.persisted?
            present snippet, with: ::API::Entities::PersonalSnippet
          else
            render_validation_error!(snippet)
          end
        end

        desc 'Remove snippet' do
          detail 'This feature was introduced in GitLab 8.15.'
          success ::API::Entities::PersonalSnippet
        end
        params do
          requires :id, type: Integer, desc: 'The ID of a snippet'
        end
        delete ':id' do
          snippet = snippets_for_current_user.find_by(id: params.delete(:id))
          return not_found!('Snippet') unless snippet
117

118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
          authorize! :destroy_personal_snippet, snippet
          snippet.destroy
          no_content!
        end

        desc 'Get a raw snippet' do
          detail 'This feature was introduced in GitLab 8.15.'
        end
        params do
          requires :id, type: Integer, desc: 'The ID of a snippet'
        end
        get ":id/raw" do
          snippet = snippets_for_current_user.find_by(id: params.delete(:id))
          return not_found!('Snippet') unless snippet

          env['api.format'] = :txt
          content_type 'text/plain'
          present snippet.content
        end
      end
    end
  end
end