Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/integrations/group_mention_service.rb')
-rw-r--r--app/services/integrations/group_mention_service.rb59
1 files changed, 59 insertions, 0 deletions
diff --git a/app/services/integrations/group_mention_service.rb b/app/services/integrations/group_mention_service.rb
new file mode 100644
index 00000000000..2389bf33432
--- /dev/null
+++ b/app/services/integrations/group_mention_service.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+# GroupMentionService class
+#
+# Used for sending group mention notifications
+#
+# Ex.
+# Integrations::GroupMentionService.new(mentionable, hook_data: data, is_confidential: true).execute
+#
+module Integrations
+ class GroupMentionService
+ def initialize(mentionable, hook_data:, is_confidential:)
+ @mentionable = mentionable
+ @hook_data = hook_data
+ @is_confidential = is_confidential
+ end
+
+ def execute
+ return ServiceResponse.success if mentionable.nil? || hook_data.nil?
+
+ @hook_data = hook_data.clone
+ # Fake a "group_mention" object kind so integrations can handle this as a separate class of event
+ hook_data[:object_attributes][:object_kind] = hook_data[:object_kind]
+ hook_data[:object_kind] = 'group_mention'
+
+ if confidential?
+ hook_data[:event_type] = 'group_confidential_mention'
+ hook_scope = :group_confidential_mention_hooks
+ else
+ hook_data[:event_type] = 'group_mention'
+ hook_scope = :group_mention_hooks
+ end
+
+ groups = mentionable.referenced_groups(mentionable.author)
+ groups.each do |group|
+ group_hook_data = hook_data.merge(
+ mentioned: {
+ object_kind: 'group',
+ name: group.full_path,
+ url: group.web_url
+ }
+ )
+ group.execute_integrations(group_hook_data, hook_scope)
+ end
+
+ ServiceResponse.success
+ end
+
+ private
+
+ attr_reader :mentionable, :hook_data, :is_confidential
+
+ def confidential?
+ return is_confidential if is_confidential.present?
+
+ mentionable.project.visibility_level != Gitlab::VisibilityLevel::PUBLIC
+ end
+ end
+end