summaryrefslogtreecommitdiff
path: root/app/models/project_services
diff options
context:
space:
mode:
authorTiago Botelho <tiagonbotelho@hotmail.com>2017-04-04 16:10:21 +0100
committerTiago Botelho <tiagonbotelho@hotmail.com>2017-04-06 19:47:07 +0100
commit1f404065ca602593dc18aa051515fd88132ddfdf (patch)
treee1fb01a2584c2137ad603500fc22652ab099bb46 /app/models/project_services
parent05f69ef21246f1a2c0b83540d3e205c9e4d77819 (diff)
downloadgitlab-ce-1f404065ca602593dc18aa051515fd88132ddfdf.tar.gz
adds relevant tests
Diffstat (limited to 'app/models/project_services')
-rw-r--r--app/models/project_services/chat_message/base_message.rb16
-rw-r--r--app/models/project_services/chat_message/issue_message.rb34
-rw-r--r--app/models/project_services/chat_message/merge_message.rb41
-rw-r--r--app/models/project_services/chat_message/note_message.rb79
-rw-r--r--app/models/project_services/chat_message/pipeline_message.rb35
-rw-r--r--app/models/project_services/chat_message/push_message.rb48
-rw-r--r--app/models/project_services/chat_message/wiki_page_message.rb30
-rw-r--r--app/models/project_services/chat_notification_service.rb20
-rw-r--r--app/models/project_services/microsoft_teams_service.rb35
9 files changed, 154 insertions, 184 deletions
diff --git a/app/models/project_services/chat_message/base_message.rb b/app/models/project_services/chat_message/base_message.rb
index 0f0657998c7..7621a5fa2d8 100644
--- a/app/models/project_services/chat_message/base_message.rb
+++ b/app/models/project_services/chat_message/base_message.rb
@@ -2,14 +2,24 @@ require 'slack-notifier'
module ChatMessage
class BaseMessage
- attr_reader :markdown_format
+ attr_reader :markdown
+ attr_reader :user_name
+ attr_reader :user_avatar
+ attr_reader :project_name
+ attr_reader :project_url
def initialize(params)
- @markdown_format = params[:markdown_format] || false
+ @markdown = params[:markdown] || false
+ @project_name = params.dig(:project, :path_with_namespace) || params[:project_name]
+ @project_url = params.dig(:project, :web_url) || params[:project_url]
+ @user_name = params.dig(:user, :username) || params[:user_name]
+ @user_avatar = params.dig(:user, :avatar_url) || params[:user_avatar]
end
def pretext
- markdown_format ? message : format(message)
+ return message if markdown
+
+ format(message)
end
def fallback
diff --git a/app/models/project_services/chat_message/issue_message.rb b/app/models/project_services/chat_message/issue_message.rb
index aebd9aa93e5..4b9a2b1e1f3 100644
--- a/app/models/project_services/chat_message/issue_message.rb
+++ b/app/models/project_services/chat_message/issue_message.rb
@@ -1,10 +1,6 @@
module ChatMessage
class IssueMessage < BaseMessage
- attr_reader :user_name
- attr_reader :user_avatar
attr_reader :title
- attr_reader :project_name
- attr_reader :project_url
attr_reader :issue_iid
attr_reader :issue_url
attr_reader :action
@@ -12,12 +8,7 @@ module ChatMessage
attr_reader :description
def initialize(params)
- super(params)
-
- @user_name = params[:user][:username]
- @user_avatar = params[:user][:avatar_url]
- @project_name = params[:project_name]
- @project_url = params[:project_url]
+ super
obj_attr = params[:object_attributes]
obj_attr = HashWithIndifferentAccess.new(obj_attr)
@@ -31,23 +22,28 @@ module ChatMessage
def attachments
return [] unless opened_issue?
+ return description if markdown
- markdown_format ? description : description_message
+ description_message
end
def activity
- MicrosoftTeams::Activity.new(
- "Issue #{state} by #{user_name}",
- "to: #{project_link}",
- issue_link,
- user_avatar
- ).to_json
+ {
+ title: "Issue #{state} by #{user_name}",
+ subtitle: "in #{project_link}",
+ text: issue_link,
+ image: user_avatar
+ }
end
private
def message
- "[#{project_link}] Issue #{issue_link} #{state} by #{user_name}"
+ if state == 'opened'
+ "[#{project_link}] Issue #{state} by #{user_name}"
+ else
+ "[#{project_link}] Issue #{issue_link} #{state} by #{user_name}"
+ end
end
def opened_issue?
@@ -72,7 +68,7 @@ module ChatMessage
end
def issue_title
- "##{issue_iid} #{title}"
+ "#{Issue.reference_prefix}#{issue_iid} #{title}"
end
end
end
diff --git a/app/models/project_services/chat_message/merge_message.rb b/app/models/project_services/chat_message/merge_message.rb
index e9ef211438b..7d0de81cdf0 100644
--- a/app/models/project_services/chat_message/merge_message.rb
+++ b/app/models/project_services/chat_message/merge_message.rb
@@ -1,45 +1,36 @@
module ChatMessage
class MergeMessage < BaseMessage
- attr_reader :user_name
- attr_reader :user_avatar
- attr_reader :project_name
- attr_reader :project_url
- attr_reader :merge_request_id
+ attr_reader :merge_request_iid
attr_reader :source_branch
attr_reader :target_branch
attr_reader :state
attr_reader :title
def initialize(params)
- super(params)
-
- @user_name = params[:user][:username]
- @user_avatar = params[:user][:avatar_url]
- @project_name = params[:project_name]
- @project_url = params[:project_url]
+ super
obj_attr = params[:object_attributes]
obj_attr = HashWithIndifferentAccess.new(obj_attr)
- @merge_request_id = obj_attr[:iid]
+ @merge_request_iid = obj_attr[:iid]
@source_branch = obj_attr[:source_branch]
@target_branch = obj_attr[:target_branch]
@state = obj_attr[:state]
@title = format_title(obj_attr[:title])
end
- def activity
- MicrosoftTeams::Activity.new(
- "Merge Request #{state} by #{user_name}",
- "to: #{project_link}",
- merge_request_link,
- user_avatar
- ).to_json
- end
-
def attachments
[]
end
+ def activity
+ {
+ title: "Merge Request #{state} by #{user_name}",
+ subtitle: "in #{project_link}",
+ text: merge_request_link,
+ image: user_avatar
+ }
+ end
+
private
def format_title(title)
@@ -59,11 +50,15 @@ module ChatMessage
end
def merge_request_link
- link("merge request !#{merge_request_id}", merge_request_url)
+ link(merge_request_title, merge_request_url)
+ end
+
+ def merge_request_title
+ "#{MergeRequest.reference_prefix}#{merge_request_iid} #{title}"
end
def merge_request_url
- "#{project_url}/merge_requests/#{merge_request_id}"
+ "#{project_url}/merge_requests/#{merge_request_iid}"
end
end
end
diff --git a/app/models/project_services/chat_message/note_message.rb b/app/models/project_services/chat_message/note_message.rb
index 26d944007a6..2da4c244229 100644
--- a/app/models/project_services/chat_message/note_message.rb
+++ b/app/models/project_services/chat_message/note_message.rb
@@ -1,83 +1,74 @@
module ChatMessage
class NoteMessage < BaseMessage
- attr_reader :user_name
- attr_reader :user_avatar
- attr_reader :project_name
- attr_reader :project_url
attr_reader :note
attr_reader :note_url
- attr_reader :comment_attrs
+ attr_reader :title
+ attr_reader :target
def initialize(params)
- params = HashWithIndifferentAccess.new(params)
-
- super(params)
+ super
- @user_name = params[:user][:name]
- @user_avatar = params[:user][:avatar_url]
- @project_name = params[:project_name]
- @project_url = params[:project_url]
-
- obj_attr = HashWithIndifferentAccess.new(params[:object_attributes])
+ params = HashWithIndifferentAccess.new(params)
+ obj_attr = params[:object_attributes]
@note = obj_attr[:note]
@note_url = obj_attr[:url]
- @comment_attrs = comment_params(obj_attr[:noteable_type], params)
+ @target, @title = case obj_attr[:noteable_type]
+ when "Commit"
+ create_commit_note(params[:commit])
+ when "Issue"
+ create_issue_note(params[:issue])
+ when "MergeRequest"
+ create_merge_note(params[:merge_request])
+ when "Snippet"
+ create_snippet_note(params[:snippet])
+ end
end
- def activity
- MicrosoftTeams::Activity.new(
- "#{user_name} #{link('commented on ' + comment_attrs[:target], note_url)}",
- "to: #{project_link}",
- comment_attrs[:title],
- user_avatar
- ).to_json
+ def attachments
+ return note if markdown
+
+ description_message
end
- def attachments
- markdown_format ? note : description_message
+ def activity
+ {
+ title: "#{user_name} #{link('commented on ' + target, note_url)}",
+ subtitle: "in #{project_link}",
+ text: formatted_title,
+ image: user_avatar
+ }
end
private
def message
- "#{user_name} #{link('commented on ' + comment_attrs[:target], note_url)} in #{project_link}: *#{comment_attrs[:title]}*"
- end
-
- def comment_params(noteable_type, params)
- params = HashWithIndifferentAccess.new(params)
-
- case noteable_type
- when "Commit"
- create_commit_note(params[:commit])
- when "Issue"
- create_issue_note(params[:issue])
- when "MergeRequest"
- create_merge_note(params[:merge_request])
- when "Snippet"
- create_snippet_note(params[:snippet])
- end
+ "#{user_name} #{link('commented on ' + target, note_url)} in #{project_link}: *#{formatted_title}*"
end
def format_title(title)
title.lines.first.chomp
end
+ def formatted_title
+ format_title(title)
+ end
+
def create_issue_note(issue)
- { target: "issue ##{issue[:iid]}", title: format_title(issue[:title]) }
+ ["issue #{Issue.reference_prefix}#{issue[:iid]}", issue[:title]]
end
def create_commit_note(commit)
commit_sha = Commit.truncate_sha(commit[:id])
- { target: "commit #{commit_sha}", title: format_title(commit[:message]) }
+ ["commit #{commit_sha}", commit[:message]]
end
def create_merge_note(merge_request)
- { target: "merge request !#{merge_request[:iid]}", title: format_title(merge_request[:title]) }
+ ["merge request #{MergeRequest.reference_prefix}#{merge_request[:iid]}", merge_request[:title]]
end
def create_snippet_note(snippet)
- { target: "snippet ##{snippet[:id]}", title: format_title(snippet[:title]) }
+ ["snippet #{Snippet.reference_prefix}#{snippet[:id]}", snippet[:title]]
end
def description_message
diff --git a/app/models/project_services/chat_message/pipeline_message.rb b/app/models/project_services/chat_message/pipeline_message.rb
index 8f4fcf09f64..4628d9b1a7b 100644
--- a/app/models/project_services/chat_message/pipeline_message.rb
+++ b/app/models/project_services/chat_message/pipeline_message.rb
@@ -3,27 +3,20 @@ module ChatMessage
attr_reader :ref_type
attr_reader :ref
attr_reader :status
- attr_reader :project_name
- attr_reader :project_url
- attr_reader :user_name
attr_reader :duration
attr_reader :pipeline_id
- attr_reader :user_avatar
def initialize(data)
+ super
+
+ @user_name = data.dig(:user, :name) || 'API'
+
pipeline_attributes = data[:object_attributes]
@ref_type = pipeline_attributes[:tag] ? 'tag' : 'branch'
@ref = pipeline_attributes[:ref]
@status = pipeline_attributes[:status]
@duration = pipeline_attributes[:duration]
@pipeline_id = pipeline_attributes[:id]
-
- super(data)
-
- @project_name = data[:project][:path_with_namespace]
- @project_url = data[:project][:web_url]
- @user_name = (data[:user] && data[:user][:name]) || 'API'
- @user_avatar = data[:user][:avatar_url] || ''
end
def pretext
@@ -34,17 +27,19 @@ module ChatMessage
format(message)
end
- def activity
- MicrosoftTeams::Activity.new(
- "Pipeline #{pipeline_link} of #{branch_link} #{ref_type} by #{user_name} #{humanized_status}",
- "to: #{project_link}",
- "in #{duration} #{time_measure}",
- user_avatar
- ).to_json
+ def attachments
+ return message if markdown
+
+ [{ text: format(message), color: attachment_color }]
end
- def attachments
- markdown_format ? message : [{ text: format(message), color: attachment_color }]
+ def activity
+ {
+ title: "Pipeline #{pipeline_link} of #{branch_link} #{ref_type} by #{user_name} #{humanized_status}",
+ subtitle: "in #{project_link}",
+ text: "in #{duration} #{time_measure}",
+ image: user_avatar || ''
+ }
end
private
diff --git a/app/models/project_services/chat_message/push_message.rb b/app/models/project_services/chat_message/push_message.rb
index 71fa77712c0..c52dd6ef8ef 100644
--- a/app/models/project_services/chat_message/push_message.rb
+++ b/app/models/project_services/chat_message/push_message.rb
@@ -3,49 +3,41 @@ module ChatMessage
attr_reader :after
attr_reader :before
attr_reader :commits
- attr_reader :project_name
- attr_reader :project_url
attr_reader :ref
attr_reader :ref_type
- attr_reader :user_name
- attr_reader :user_avatar
def initialize(params)
- super(params)
+ super
@after = params[:after]
@before = params[:before]
@commits = params.fetch(:commits, [])
- @project_name = params[:project_name]
- @project_url = params[:project_url]
@ref_type = Gitlab::Git.tag_ref?(params[:ref]) ? 'tag' : 'branch'
@ref = Gitlab::Git.ref_name(params[:ref])
- @user_name = params[:user_name]
- @user_avatar = params[:user_avatar]
- end
-
- def activity
- action =
- if new_branch?
- "created"
- elsif removed_branch?
- "removed"
- else
- "pushed to"
- end
-
- MicrosoftTeams::Activity.new(
- "#{user_name} #{action} #{ref_type}",
- "to: #{project_link}",
- compare_link,
- user_avatar
- ).to_json
end
def attachments
return [] if new_branch? || removed_branch?
+ return commit_messages if markdown
- markdown_format ? commit_messages : commit_message_attachments
+ commit_message_attachments
+ end
+
+ def activity
+ action = if new_branch?
+ "created"
+ elsif removed_branch?
+ "removed"
+ else
+ "pushed to"
+ end
+
+ {
+ title: "#{user_name} #{action} #{ref_type}",
+ subtitle: "in #{project_link}",
+ text: compare_link,
+ image: user_avatar
+ }
end
private
diff --git a/app/models/project_services/chat_message/wiki_page_message.rb b/app/models/project_services/chat_message/wiki_page_message.rb
index 85c2efd75bc..a139a8ee727 100644
--- a/app/models/project_services/chat_message/wiki_page_message.rb
+++ b/app/models/project_services/chat_message/wiki_page_message.rb
@@ -1,20 +1,12 @@
module ChatMessage
class WikiPageMessage < BaseMessage
- attr_reader :user_name
attr_reader :title
- attr_reader :project_name
- attr_reader :project_url
attr_reader :wiki_page_url
attr_reader :action
attr_reader :description
def initialize(params)
- super(params)
-
- @user_name = params[:user][:username]
- @user_avatar = params[:user][:avatar_url]
- @project_name = params[:project_name]
- @project_url = params[:project_url]
+ super
obj_attr = params[:object_attributes]
obj_attr = HashWithIndifferentAccess.new(obj_attr)
@@ -31,17 +23,19 @@ module ChatMessage
end
end
- def activity
- MicrosoftTeams::Activity.new(
- "#{user_name} #{action} #{wiki_page_link}",
- "in: #{project_link}",
- title,
- user_avatar
- ).to_json
+ def attachments
+ return description if markdown
+
+ description_message
end
- def attachments
- markdown_format ? @description : description_message
+ def activity
+ {
+ title: "#{user_name} #{action} #{wiki_page_link}",
+ subtitle: "in #{project_link}",
+ text: title,
+ image: user_avatar
+ }
end
private
diff --git a/app/models/project_services/chat_notification_service.rb b/app/models/project_services/chat_notification_service.rb
index 75834103db5..fa782c6fbb7 100644
--- a/app/models/project_services/chat_notification_service.rb
+++ b/app/models/project_services/chat_notification_service.rb
@@ -49,10 +49,7 @@ class ChatNotificationService < Service
object_kind = data[:object_kind]
- data = data.merge(
- project_url: project_url,
- project_name: project_name
- )
+ data = custom_data(data)
# WebHook events often have an 'update' event that follows a 'open' or
# 'close' action. Ignore update events for now to prevent duplicate
@@ -68,8 +65,7 @@ class ChatNotificationService < Service
opts[:channel] = channel_name if channel_name
opts[:username] = username if username
- notifier = Slack::Notifier.new(webhook, opts)
- notifier.ping(message.pretext, attachments: message.attachments, fallback: message.fallback)
+ return false unless notify(message, opts)
true
end
@@ -92,6 +88,18 @@ class ChatNotificationService < Service
private
+ def notify(message, opts)
+ Slack::Notifier.new(webhook, opts).ping(
+ message.pretext,
+ attachments: message.attachments,
+ fallback: message.fallback
+ )
+ end
+
+ def custom_data(data)
+ data.merge(project_url: project_url, project_name: project_name)
+ end
+
def get_message(object_kind, data)
case object_kind
when "push", "tag_push"
diff --git a/app/models/project_services/microsoft_teams_service.rb b/app/models/project_services/microsoft_teams_service.rb
index 2a8ea3f7e21..9b218fd81b4 100644
--- a/app/models/project_services/microsoft_teams_service.rb
+++ b/app/models/project_services/microsoft_teams_service.rb
@@ -4,14 +4,13 @@ class MicrosoftTeamsService < ChatNotificationService
end
def description
- 'Receive event notifications in Microsoft Team'
+ 'Receive event notifications in Microsoft Teams'
end
def self.to_param
'microsoft_teams'
end
- #TODO: Setup the description accordingly
def help
'This service sends notifications about projects events to Microsoft Teams channels.<br />
To set up this service:
@@ -22,10 +21,6 @@ class MicrosoftTeamsService < ChatNotificationService
</ol>'
end
- def default_channel_placeholder
- "Channel name (e.g. general)"
- end
-
def webhook_placeholder
'https://outlook.office.com/webhook/…'
end
@@ -33,6 +28,9 @@ class MicrosoftTeamsService < ChatNotificationService
def event_field(event)
end
+ def default_channel_placeholder
+ end
+
def default_fields
[
{ type: 'text', name: 'webhook', placeholder: "e.g. #{webhook_placeholder}" },
@@ -41,27 +39,18 @@ class MicrosoftTeamsService < ChatNotificationService
]
end
- def execute(data)
- return unless supported_events.include?(data[:object_kind])
- return unless webhook.present?
-
- object_kind = data[:object_kind]
+ private
- data = data.merge(
- project_url: project_url,
- project_name: project_name,
- markdown_format: true
- )
-
- message = get_message(object_kind, data)
-
- return false unless message
-
- MicrosoftTeams::Notifier.new(webhook).ping({
+ def notify(message, opts)
+ MicrosoftTeams::Notifier.new(webhook).ping(
title: message.project_name,
pretext: message.pretext,
activity: message.activity,
attachments: message.attachments
- })
+ )
+ end
+
+ def custom_data(data)
+ super(data).merge(markdown: true)
end
end