# frozen_string_literal: true module Integrations class HangoutsChat < BaseChatNotification field :webhook, section: SECTION_TYPE_CONNECTION, help: 'https://chat.googleapis.com/v1/spaces…', required: true field :notify_only_broken_pipelines, type: :checkbox, section: SECTION_TYPE_CONFIGURATION field :branches_to_be_notified, type: :select, section: SECTION_TYPE_CONFIGURATION, title: -> { s_('Integrations|Branches for which notifications are to be sent') }, choices: -> { branch_choices } def self.title 'Google Chat' end def self.description 'Send notifications from GitLab to a room in Google Chat.' end def self.to_param 'hangouts_chat' end def self.help docs_link = ActionController::Base.helpers.link_to(_('How do I set up a Google Chat webhook?'), Rails.application.routes.url_helpers.help_page_url('user/project/integrations/hangouts_chat'), target: '_blank', rel: 'noopener noreferrer') format( s_('Before enabling this integration, create a webhook for the room in Google Chat where you want to receive ' \ 'notifications from this project. %{docs_link}').html_safe, docs_link: docs_link.html_safe) end def default_channel_placeholder; end def self.supported_events %w[push issue confidential_issue merge_request note confidential_note tag_push pipeline wiki_page] end private def notify(message, _opts) url = webhook.dup key = parse_thread_key(message) url = Gitlab::Utils.add_url_parameters(url, { threadKey: key }) if key payload = { text: parse_simple_text_message(message) } Gitlab::HTTP.post( url, body: payload.to_json, headers: { 'Content-Type' => 'application/json' }, parse: nil ).response end # Returns an appropriate key for threading messages in google chat def parse_thread_key(message) case message when Integrations::ChatMessage::NoteMessage message.target when Integrations::ChatMessage::IssueMessage "issue #{message.project_name}#{Issue.reference_prefix}#{message.issue_iid}" when Integrations::ChatMessage::MergeMessage "merge request #{message.project_name}#{MergeRequest.reference_prefix}#{message.merge_request_iid}" when Integrations::ChatMessage::PushMessage "push #{message.project_name}_#{message.ref}" when Integrations::ChatMessage::PipelineMessage "pipeline #{message.pipeline_id}" when Integrations::ChatMessage::WikiPageMessage "wiki_page #{message.wiki_page_url}" end end def parse_simple_text_message(message) header = message.pretext return header if message.attachments.empty? attachment = message.attachments.first title = format_attachment_title(attachment) body = attachment[:text] [header, title, body].compact.join("\n") end def format_attachment_title(attachment) return attachment[:title] unless attachment[:title_link] "<#{attachment[:title_link]}|#{attachment[:title]}>" end end end