merge_requests.rb 5.2 KB
Newer Older
1
module API
V
Valeriy Sizov 已提交
2
  # MergeRequest API
V
Valeriy Sizov 已提交
3 4
  class MergeRequests < Grape::API
    before { authenticate! }
5
    before { Thread.current[:current_user] = current_user }
V
Valeriy Sizov 已提交
6

H
Hiroyuki Sato 已提交
7
    resource :projects do
8
      helpers do
9 10 11
        def handle_merge_request_errors!(errors)
          if errors[:project_access].any?
            error!(errors[:project_access], 422)
12 13
          elsif errors[:branch_conflict].any?
            error!(errors[:branch_conflict], 422)
14
          end
15
          not_found!
16
        end
I
Izaak Alpert 已提交
17 18 19 20 21 22 23 24

        def not_fork?(target_project_id, user_project)
          target_project_id.nil? || target_project_id == user_project.id.to_s
        end

        def target_matches_fork(target_project_id,user_project)
          user_project.forked? && user_project.forked_from_project.id.to_s == target_project_id
        end
25 26
      end

V
Valeriy Sizov 已提交
27
      # List merge requests
28
      #
V
Valeriy Sizov 已提交
29
      # Parameters:
30
      #   id (required) - The ID of a project
V
Valeriy Sizov 已提交
31 32
      #
      # Example:
V
Valeriy Sizov 已提交
33
      #   GET /projects/:id/merge_requests
V
Valeriy Sizov 已提交
34
      #
V
Valeriy Sizov 已提交
35
      get ":id/merge_requests" do
V
Valeriy Sizov 已提交
36
        authorize! :read_merge_request, user_project
37

V
Valeriy Sizov 已提交
38
        present paginate(user_project.merge_requests), with: Entities::MergeRequest
V
Valeriy Sizov 已提交
39
      end
40

V
Valeriy Sizov 已提交
41
      # Show MR
42
      #
V
Valeriy Sizov 已提交
43
      # Parameters:
44
      #   id (required)               - The ID of a project
V
Valeriy Sizov 已提交
45
      #   merge_request_id (required) - The ID of MR
46
      #
V
Valeriy Sizov 已提交
47
      # Example:
V
Valeriy Sizov 已提交
48
      #   GET /projects/:id/merge_request/:merge_request_id
V
Valeriy Sizov 已提交
49
      #
V
Valeriy Sizov 已提交
50
      get ":id/merge_request/:merge_request_id" do
V
Valeriy Sizov 已提交
51
        merge_request = user_project.merge_requests.find(params[:merge_request_id])
52

V
Valeriy Sizov 已提交
53
        authorize! :read_merge_request, merge_request
54

V
Valeriy Sizov 已提交
55
        present merge_request, with: Entities::MergeRequest
V
Valeriy Sizov 已提交
56 57
      end

V
Valeriy Sizov 已提交
58 59 60 61
      # Create MR
      #
      # Parameters:
      #
I
Izaak Alpert 已提交
62
      #   id (required)            - The ID of a project - this will be the source of the merge request
V
Valeriy Sizov 已提交
63 64
      #   source_branch (required) - The source branch
      #   target_branch (required) - The target branch
I
Izaak Alpert 已提交
65
      #   target_project           - The target project of the merge request defaults to the :id of the project
V
Valeriy Sizov 已提交
66 67
      #   assignee_id              - Assignee user ID
      #   title (required)         - Title of MR
68
      #
V
Valeriy Sizov 已提交
69
      # Example:
V
Valeriy Sizov 已提交
70
      #   POST /projects/:id/merge_requests
V
Valeriy Sizov 已提交
71
      #
V
Valeriy Sizov 已提交
72
      post ":id/merge_requests" do
V
Valeriy Sizov 已提交
73
        authorize! :write_merge_request, user_project
74
        required_attributes! [:source_branch, :target_branch, :title]
I
Izaak Alpert 已提交
75
        attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id]
V
Valeriy Sizov 已提交
76
        merge_request = user_project.merge_requests.new(attrs)
V
Valeriy Sizov 已提交
77
        merge_request.author = current_user
I
Izaak Alpert 已提交
78
        merge_request.source_project = user_project
I
Izaak Alpert 已提交
79
        target_project_id = attrs[:target_project_id]
I
Izaak Alpert 已提交
80
        if not_fork?(target_project_id, user_project)
I
Izaak Alpert 已提交
81
          merge_request.target_project = user_project
I
Izaak Alpert 已提交
82 83 84 85 86 87
        else
          if target_matches_fork(target_project_id,user_project)
            merge_request.target_project = Project.find_by_id(attrs[:target_project_id])
          else
            render_api_error!('(Bad Request) Specified target project that is not the source project, or the source fork of the project.', 400)
          end
I
Izaak Alpert 已提交
88
        end
I
Izaak Alpert 已提交
89

V
Valeriy Sizov 已提交
90 91 92 93
        if merge_request.save
          merge_request.reload_code
          present merge_request, with: Entities::MergeRequest
        else
94
          handle_merge_request_errors! merge_request.errors
V
Valeriy Sizov 已提交
95
        end
V
Valeriy Sizov 已提交
96 97
      end

V
Valeriy Sizov 已提交
98 99 100
      # Update MR
      #
      # Parameters:
101
      #   id (required)               - The ID of a project
V
Valeriy Sizov 已提交
102 103 104 105 106
      #   merge_request_id (required) - ID of MR
      #   source_branch               - The source branch
      #   target_branch               - The target branch
      #   assignee_id                 - Assignee user ID
      #   title                       - Title of MR
A
Andrew8xx8 已提交
107
      #   state_event                 - Status of MR. (close|reopen|merge)
V
Valeriy Sizov 已提交
108
      # Example:
V
Valeriy Sizov 已提交
109
      #   PUT /projects/:id/merge_request/:merge_request_id
V
Valeriy Sizov 已提交
110
      #
V
Valeriy Sizov 已提交
111
      put ":id/merge_request/:merge_request_id" do
A
Andrew8xx8 已提交
112
        attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event]
V
Valeriy Sizov 已提交
113
        merge_request = user_project.merge_requests.find(params[:merge_request_id])
114

V
Valeriy Sizov 已提交
115
        authorize! :modify_merge_request, merge_request
116

V
Valeriy Sizov 已提交
117 118 119 120 121
        if merge_request.update_attributes attrs
          merge_request.reload_code
          merge_request.mark_as_unchecked
          present merge_request, with: Entities::MergeRequest
        else
122
          handle_merge_request_errors! merge_request.errors
V
Valeriy Sizov 已提交
123
        end
V
Valeriy Sizov 已提交
124 125
      end

V
Valeriy Sizov 已提交
126 127 128
      # Post comment to merge request
      #
      # Parameters:
129
      #   id (required) - The ID of a project
V
Valeriy Sizov 已提交
130 131
      #   merge_request_id (required) - ID of MR
      #   note (required) - Text of comment
132
      # Examples:
V
Valeriy Sizov 已提交
133
      #   POST /projects/:id/merge_request/:merge_request_id/comments
V
Valeriy Sizov 已提交
134
      #
135
      post ":id/merge_request/:merge_request_id/comments" do
136
        required_attributes! [:note]
137

138 139 140
        merge_request = user_project.merge_requests.find(params[:merge_request_id])
        note = merge_request.notes.new(note: params[:note], project_id: user_project.id)
        note.author = current_user
V
Valeriy Sizov 已提交
141

142
        if note.save
143
          present note, with: Entities::MRNote
144 145 146 147 148
        else
          not_found!
        end
      end

V
Valeriy Sizov 已提交
149 150 151
    end
  end
end