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