summaryrefslogtreecommitdiff
path: root/lib/gitlab/hook_data/merge_request_builder.rb
blob: eaef19c9d04e109f8dc20993c562e3d9d7aeae8a (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
module Gitlab
  module HookData
    class MergeRequestBuilder
      SAFE_HOOK_ATTRIBUTES = %i[
        assignee_id
        author_id
        created_at
        deleted_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
        ref_fetched
        source_branch
        source_project_id
        state
        target_branch
        target_project_id
        time_estimate
        title
        updated_at
        updated_by_id
      ].freeze

      SAFE_HOOK_RELATIONS = %i[
        assignee
        labels
      ].freeze

      attr_accessor :merge_request

      def initialize(merge_request)
        @merge_request = merge_request
      end

      def build
        attrs = {
          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,
          human_total_time_spent: merge_request.human_total_time_spent,
          human_time_estimate: merge_request.human_time_estimate
        }

        merge_request.attributes.with_indifferent_access.slice(*SAFE_HOOK_ATTRIBUTES)
          .merge!(attrs)
      end
    end
  end
end