summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/projects/services_controller.rb2
-rw-r--r--app/helpers/triggers_helper.rb4
-rw-r--r--app/models/project.rb5
-rw-r--r--app/models/project_services/chat_service.rb7
-rw-r--r--app/models/project_services/mattermost_chat_service.rb35
-rw-r--r--app/models/service.rb1
-rw-r--r--app/views/shared/_service_settings.html.haml41
-rw-r--r--config/environments/development.rb3
-rw-r--r--lib/api/services.rb29
9 files changed, 92 insertions, 35 deletions
diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb
index 40a23a6f806..30c2a5d9982 100644
--- a/app/controllers/projects/services_controller.rb
+++ b/app/controllers/projects/services_controller.rb
@@ -28,6 +28,8 @@ class Projects::ServicesController < Projects::ApplicationController
end
def test
+ return render_404 unless @service.can_test?
+
data = @service.test_data(project, current_user)
outcome = @service.test(data)
diff --git a/app/helpers/triggers_helper.rb b/app/helpers/triggers_helper.rb
index c41181bab3d..b0135ea2e95 100644
--- a/app/helpers/triggers_helper.rb
+++ b/app/helpers/triggers_helper.rb
@@ -6,4 +6,8 @@ module TriggersHelper
"#{Settings.gitlab.url}/api/v3/projects/#{project_id}/ref/#{ref}/trigger/builds"
end
end
+
+ def service_trigger_url(service)
+ "#{Settings.gitlab.url}/api/v3/projects/#{service.project_id}/services/#{service.to_param}/trigger"
+ end
end
diff --git a/app/models/project.rb b/app/models/project.rb
index ec64e4bc11d..a118761d93d 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -23,8 +23,8 @@ class Project < ActiveRecord::Base
cache_markdown_field :description, pipeline: :description
- delegate :feature_available?, :builds_enabled?, :wiki_enabled?,
- :merge_requests_enabled?, :issues_enabled?, to: :project_feature,
+ delegate :feature_available?, :builds_enabled?, :wiki_enabled?,
+ :merge_requests_enabled?, :issues_enabled?, to: :project_feature,
allow_nil: true
default_value_for :archived, false
@@ -91,6 +91,7 @@ class Project < ActiveRecord::Base
has_one :assembla_service, dependent: :destroy
has_one :asana_service, dependent: :destroy
has_one :gemnasium_service, dependent: :destroy
+ has_one :mattermost_chat_service, dependent: :destroy
has_one :slack_service, dependent: :destroy
has_one :buildkite_service, dependent: :destroy
has_one :bamboo_service, dependent: :destroy
diff --git a/app/models/project_services/chat_service.rb b/app/models/project_services/chat_service.rb
index f6d190dead5..db387ef3026 100644
--- a/app/models/project_services/chat_service.rb
+++ b/app/models/project_services/chat_service.rb
@@ -3,13 +3,16 @@
class ChatService < Service
default_value_for :category, 'chat'
- has_many :chat_users
+ has_many :chat_names, foreign_key: :service_id
def valid_token?(token)
- self.respond_to?(:token) && self.token.present? && ActiveSupport::SecurityUtils.variable_size_secure_compare(token, self.token)
+ self.respond_to?(:token) &&
+ self.token.present? &&
+ ActiveSupport::SecurityUtils.variable_size_secure_compare(token, self.token)
end
def supported_events
+ []
end
def trigger(params)
diff --git a/app/models/project_services/mattermost_chat_service.rb b/app/models/project_services/mattermost_chat_service.rb
index f4a392ee17e..01ff6b0f8b4 100644
--- a/app/models/project_services/mattermost_chat_service.rb
+++ b/app/models/project_services/mattermost_chat_service.rb
@@ -1,5 +1,12 @@
-# Base class for Chat services
class MattermostChatService < ChatService
+ include TriggersHelper
+
+ prop_accessor :token
+
+ def can_test?
+ false
+ end
+
def title
'Mattermost'
end
@@ -13,28 +20,40 @@ class MattermostChatService < ChatService
end
def help
- 'This service allows you to use slash commands with your Mattermost installation.<br/>
- To setup this Service you need to create a new <b>"Slash commands"</b> in your Mattermost integration panel,
- and enter the token below.'
+ "This service allows you to use slash commands with your Mattermost installation.<br/>
+ To setup this Service you need to create a new <b>Slash commands</b> in your Mattermost integration panel.<br/>
+ <br/>
+ Create integration with URL #{service_trigger_url(self)} and enter the token below."
end
def fields
[
- { type: 'text', name: 'token', placeholder: 'https://hooks.slack.com/services/...' }
+ { type: 'text', name: 'token', placeholder: '' }
]
end
def trigger(params)
- user = ChatNames::FindUserService.new(chat_names, params).execute
+ return nil unless valid_token?(params[:token])
+
+ user = find_chat_user(params)
return authorize_chat_name(params) unless user
- Mattermost::CommandService.new(project, user, params).execute
+ Mattermost::CommandService.new(project, user, params.slice(:command, :text)).
+ execute
end
private
+ def find_chat_user(params)
+ params = params.slice(:team_id, :user_id)
+ ChatNames::FindUserService.
+ new(chat_names, params).
+ execute
+ end
+
def authorize_chat_name(params)
- url = ChatNames::RequestService.new(service, params).execute
+ params = params.slice(:team_id, :team_domain, :user_id, :user_name)
+ url = ChatNames::AuthorizeUserService.new(self, params).execute
{
response_type: :ephemeral,
diff --git a/app/models/service.rb b/app/models/service.rb
index 9d6ff190cdf..8eda1930400 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -214,6 +214,7 @@ class Service < ActiveRecord::Base
hipchat
irker
jira
+ mattermost_chat
pivotaltracker
pushover
redmine
diff --git a/app/views/shared/_service_settings.html.haml b/app/views/shared/_service_settings.html.haml
index 5254d265918..601ef51737a 100644
--- a/app/views/shared/_service_settings.html.haml
+++ b/app/views/shared/_service_settings.html.haml
@@ -10,26 +10,27 @@
.col-sm-10
= form.check_box :active
-.form-group
- = form.label :url, "Trigger", class: 'control-label'
-
- .col-sm-10
- - @service.supported_events.each do |event|
- %div
- = form.check_box service_event_field_name(event), class: 'pull-left'
- .prepend-left-20
- = form.label service_event_field_name(event), class: 'list-label' do
- %strong
- = event.humanize
-
- - field = @service.event_field(event)
-
- - if field
- %p
- = form.text_field field[:name], class: "form-control", placeholder: field[:placeholder]
-
- %p.light
- = service_event_description(event)
+- if @service.supported_events.present?
+ .form-group
+ = form.label :url, "Trigger", class: 'control-label'
+
+ .col-sm-10
+ - @service.supported_events.each do |event|
+ %div
+ = form.check_box service_event_field_name(event), class: 'pull-left'
+ .prepend-left-20
+ = form.label service_event_field_name(event), class: 'list-label' do
+ %strong
+ = event.humanize
+
+ - field = @service.event_field(event)
+
+ - if field
+ %p
+ = form.text_field field[:name], class: "form-control", placeholder: field[:placeholder]
+
+ %p.light
+ = service_event_description(event)
- @service.global_fields.each do |field|
- type = field[:type]
diff --git a/config/environments/development.rb b/config/environments/development.rb
index 45a8c1add3e..6780dbef8e3 100644
--- a/config/environments/development.rb
+++ b/config/environments/development.rb
@@ -45,4 +45,7 @@ Rails.application.configure do
# Do not log asset requests
config.assets.quiet = true
+
+ # Make hot reloading to work with Grape API
+ ActiveSupport::Dependencies.explicitly_unloadable_constants << "API"
end
diff --git a/lib/api/services.rb b/lib/api/services.rb
index fc8598daa32..b4b3bb6e41a 100644
--- a/lib/api/services.rb
+++ b/lib/api/services.rb
@@ -1,10 +1,10 @@
module API
# Projects API
class Services < Grape::API
- before { authenticate! }
- before { authorize_admin_project }
-
resource :projects do
+ before { authenticate! }
+ before { authorize_admin_project }
+
# Set <service_slug> service for project
#
# Example Request:
@@ -59,5 +59,28 @@ module API
present project_service, with: Entities::ProjectService, include_passwords: current_user.is_admin?
end
end
+
+ resource :projects do
+ post ':id/services/:service_slug/trigger' do
+ project = Project.find_with_namespace(params[:id]) || Project.find_by(id: params[:id])
+
+ underscored_service = params[:service_slug].underscore
+
+ not_found!('Service') unless Service.available_services_names.include?(underscored_service)
+ service_method = "#{underscored_service}_service"
+
+ service = project.public_send(service_method)
+
+ result = if service.try(:active?) && service.respond_to?(:trigger)
+ service.trigger(params)
+ end
+
+ if result
+ present result, status: result[:status] || 200
+ else
+ not_found!('Service')
+ end
+ end
+ end
end
end