gitlab-org--gitlab-foss/lib/api/services.rb

165 lines
5.0 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2013-10-29 14:39:46 +00:00
module API
class Services < Grape::API
services = Helpers::ServicesHelpers.services
service_classes = Helpers::ServicesHelpers.service_classes
if Rails.env.development?
services['mock-ci'] = [
{
required: true,
name: :mock_service_url,
type: String,
desc: 'URL to the mock service'
}
]
services['mock-deployment'] = []
services['mock-monitoring'] = []
service_classes += Helpers::ServicesHelpers.development_service_classes
end
2016-12-05 14:40:53 +00:00
SERVICES = services.freeze
SERVICE_CLASSES = service_classes.freeze
SERVICE_CLASSES.each do |service|
event_names = service.try(:event_names) || next
event_names.each do |event_name|
SERVICES[service.to_param.tr("_", "-")] << {
required: false,
name: event_name.to_sym,
type: String,
2018-03-16 19:09:35 +00:00
desc: service.event_description(event_name)
}
end
end
TRIGGER_SERVICES = {
2016-12-05 14:40:53 +00:00
'mattermost-slash-commands' => [
{
name: :token,
type: String,
desc: 'The Mattermost token'
}
2016-12-29 09:48:18 +00:00
],
'slack-slash-commands' => [
{
name: :token,
type: String,
desc: 'The Slack token'
}
2016-12-05 14:40:53 +00:00
]
}.freeze
params do
requires :id, type: String, desc: 'The ID of a project'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
before { authenticate! }
before { authorize_admin_project }
2016-12-05 14:40:53 +00:00
helpers do
def service_attributes(service)
service.fields.inject([]) do |arr, hash|
arr << hash[:name].to_sym
2015-08-26 23:58:49 +00:00
end
2016-12-05 14:40:53 +00:00
end
end
2014-10-14 17:07:34 +00:00
SERVICES.each do |service_slug, settings|
2016-12-05 14:40:53 +00:00
desc "Set #{service_slug} service for project"
params do
settings.each do |setting|
if setting[:required]
requires setting[:name], type: setting[:type], desc: setting[:desc]
else
optional setting[:name], type: setting[:type], desc: setting[:desc]
end
end
end
put ":id/services/#{service_slug}" do
service = user_project.find_or_initialize_service(service_slug.underscore)
service_params = declared_params(include_missing: false).merge(active: true)
2014-10-14 17:07:34 +00:00
2018-07-02 10:43:06 +00:00
if service.update(service_params)
present service, with: Entities::ProjectService
2015-08-26 23:58:49 +00:00
else
2016-12-05 14:40:53 +00:00
render_api_error!('400 Bad Request', 400)
2015-08-26 23:58:49 +00:00
end
2014-10-14 17:07:34 +00:00
end
end
2016-12-05 14:40:53 +00:00
desc "Delete a service for project"
params do
requires :service_slug, type: String, values: SERVICES.keys, desc: 'The name of the service'
2016-12-05 14:40:53 +00:00
end
delete ":id/services/:service_slug" do
service = user_project.find_or_initialize_service(params[:service_slug].underscore)
2015-09-11 11:38:37 +00:00
2017-08-24 08:41:54 +00:00
destroy_conditionally!(service) do
attrs = service_attributes(service).inject({}) do |hash, key|
hash.merge!(key => nil)
end
2016-12-05 14:40:53 +00:00
2018-07-02 10:43:06 +00:00
unless service.update(attrs.merge(active: false))
2017-08-24 08:41:54 +00:00
render_api_error!('400 Bad Request', 400)
end
2014-10-14 17:07:34 +00:00
end
end
2016-12-05 14:40:53 +00:00
desc 'Get the service settings for project' do
success Entities::ProjectService
end
params do
requires :service_slug, type: String, values: SERVICES.keys, desc: 'The name of the service'
2016-12-05 14:40:53 +00:00
end
get ":id/services/:service_slug" do
service = user_project.find_or_initialize_service(params[:service_slug].underscore)
2017-04-09 02:20:57 +00:00
present service, with: Entities::ProjectService, include_passwords: current_user.admin?
end
2013-10-29 14:39:46 +00:00
end
TRIGGER_SERVICES.each do |service_slug, settings|
helpers do
# rubocop: disable CodeReuse/ActiveRecord
def slash_command_service(project, service_slug, params)
project.services.active.where(template: false).find do |service|
service.try(:token) == params[:token] && service.to_param == service_slug.underscore
end
end
# rubocop: enable CodeReuse/ActiveRecord
end
2016-12-05 14:40:53 +00:00
params do
requires :id, type: String, desc: 'The ID of a project'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
2016-12-05 14:40:53 +00:00
desc "Trigger a slash command for #{service_slug}" do
detail 'Added in GitLab 8.13'
end
params do
settings.each do |setting|
requires setting[:name], type: setting[:type], desc: setting[:desc]
end
end
post ":id/services/#{service_slug.underscore}/trigger" do
project = find_project(params[:id])
2016-12-05 14:40:53 +00:00
# This is not accurate, but done to prevent leakage of the project names
not_found!('Service') unless project
2016-11-18 10:38:54 +00:00
service = slash_command_service(project, service_slug, params)
result = service.try(:trigger, params)
2016-12-05 14:40:53 +00:00
if result
status result[:status] || 200
present result
else
not_found!('Service')
end
end
end
end
2013-10-29 14:39:46 +00:00
end
end