1# frozen_string_literal: true
2
3module TriggerableHooks
4  AVAILABLE_TRIGGERS = {
5    repository_update_hooks:  :repository_update_events,
6    push_hooks:               :push_events,
7    tag_push_hooks:           :tag_push_events,
8    issue_hooks:              :issues_events,
9    confidential_note_hooks:  :confidential_note_events,
10    confidential_issue_hooks: :confidential_issues_events,
11    note_hooks:               :note_events,
12    merge_request_hooks:      :merge_requests_events,
13    job_hooks:                :job_events,
14    pipeline_hooks:           :pipeline_events,
15    wiki_page_hooks:          :wiki_page_events,
16    deployment_hooks:         :deployment_events,
17    feature_flag_hooks:       :feature_flag_events,
18    release_hooks:            :releases_events,
19    member_hooks:             :member_events,
20    subgroup_hooks:           :subgroup_events
21  }.freeze
22
23  extend ActiveSupport::Concern
24
25  class_methods do
26    attr_reader :triggers
27
28    def hooks_for(trigger)
29      callable_scopes = triggers.keys + [:all]
30      return none unless callable_scopes.include?(trigger)
31
32      executable.public_send(trigger) # rubocop:disable GitlabSecurity/PublicSend
33    end
34
35    def select_active(hooks_scope, data)
36      executable.select do |hook|
37        ActiveHookFilter.new(hook).matches?(hooks_scope, data)
38      end
39    end
40
41    private
42
43    def triggerable_hooks(hooks)
44      triggers = AVAILABLE_TRIGGERS.slice(*hooks)
45      @triggers = triggers
46
47      triggers.each do |trigger, event|
48        scope trigger, -> { where(event => true) }
49      end
50    end
51  end
52end
53