summaryrefslogtreecommitdiff
path: root/lib/api/v3/snippets.rb
blob: 85613c8ed84fdff70432904577534a6a001020c5 (plain)
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
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
module API
  module V3
    class Snippets < Grape::API
      include PaginationParams

      before { authenticate! }

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

          def public_snippets
            SnippetsFinder.new(current_user, visibility: Snippet::PUBLIC).execute
          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

          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

          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