summaryrefslogtreecommitdiff
path: root/lib/gitlab/hook_data/merge_request_builder.rb
blob: 06ddd65d0755c7dd7c802f4563ea1a2dd60834eb (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
# frozen_string_literal: true

module Gitlab
  module HookData
    class MergeRequestBuilder < BaseBuilder
      def self.safe_hook_attributes
        %i[
          assignee_id
          author_id
          blocking_discussions_resolved
          created_at
          description
          head_pipeline_id
          id
          iid
          last_edited_at
          last_edited_by_id
          merge_commit_sha
          merge_error
          merge_params
          merge_status
          merge_user_id
          merge_when_pipeline_succeeds
          milestone_id
          source_branch
          source_project_id
          state_id
          target_branch
          target_project_id
          time_estimate
          title
          updated_at
          updated_by_id
        ].freeze
      end

      def self.safe_hook_relations
        %i[
          assignees
          labels
          total_time_spent
          time_change
        ].freeze
      end

      alias_method :merge_request, :object

      def build
        attrs = {
          description: absolute_image_urls(merge_request.description),
          url: Gitlab::UrlBuilder.build(merge_request),
          source: merge_request.source_project.try(:hook_attrs),
          target: merge_request.target_project.hook_attrs,
          last_commit: merge_request.diff_head_commit&.hook_attrs,
          work_in_progress: merge_request.work_in_progress?,
          total_time_spent: merge_request.total_time_spent,
          time_change: merge_request.time_change,
          human_total_time_spent: merge_request.human_total_time_spent,
          human_time_change: merge_request.human_time_change,
          human_time_estimate: merge_request.human_time_estimate,
          assignee_ids: merge_request.assignee_ids,
          assignee_id: merge_request.assignee_ids.first, # This key is deprecated
          labels: merge_request.labels_hook_attrs,
          state: merge_request.state, # This key is deprecated
          blocking_discussions_resolved: merge_request.mergeable_discussions_state?
        }

        merge_request.attributes.with_indifferent_access.slice(*self.class.safe_hook_attributes)
          .merge!(attrs)
      end
    end
  end
end