summaryrefslogtreecommitdiff
path: root/lib/api/project_snippets.rb
blob: ce1bf0d26d2a56ff53d5522b429c52cac8391242 (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
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

        def snippets_for_current_user
          finder_params = { filter: :by_project, project: user_project }
          SnippetsFinder.new.execute(current_user, finder_params)
        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(snippets_for_current_user), 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 = snippets_for_current_user.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
      #   visibility_level (required) - The snippet's visibility
      # Example Request:
      #   POST /projects/:id/snippets
      post ":id/snippets" do
        authorize! :create_project_snippet, user_project
        required_attributes! [:title, :file_name, :code, :visibility_level]

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

        if @snippet.errors.any?
          render_validation_error!(@snippet)
        else
          present @snippet, with: Entities::ProjectSnippet
        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
      #   visibility_level (optional) - The snippet's visibility
      # Example Request:
      #   PUT /projects/:id/snippets/:snippet_id
      put ":id/snippets/:snippet_id" do
        @snippet = snippets_for_current_user.find(params[:snippet_id])
        authorize! :update_project_snippet, @snippet

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

        UpdateSnippetService.new(user_project, current_user, @snippet,
                                 attrs).execute
        if @snippet.errors.any?
          render_validation_error!(@snippet)
        else
          present @snippet, with: Entities::ProjectSnippet
        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 = snippets_for_current_user.find(params[:snippet_id])
          authorize! :update_project_snippet, @snippet
          @snippet.destroy
        rescue
          not_found!('Snippet')
        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 = snippets_for_current_user.find(params[:snippet_id])

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