summaryrefslogtreecommitdiff
path: root/app/controllers
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-26 06:08:40 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-26 06:08:40 +0000
commit116d4e56e83a1f408afe710ce070e699ba206475 (patch)
treecc62d3820d9bfa199061edfdef3a2f4bda140507 /app/controllers
parentdddde902acfa6acfb11583c61faa67cc7c8d11b6 (diff)
downloadgitlab-ce-116d4e56e83a1f408afe710ce070e699ba206475.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/controllers')
-rw-r--r--app/controllers/admin/integrations_controller.rb60
-rw-r--r--app/controllers/concerns/integrations_actions.rb94
-rw-r--r--app/controllers/groups/settings/integrations_controller.rb21
3 files changed, 119 insertions, 56 deletions
diff --git a/app/controllers/admin/integrations_controller.rb b/app/controllers/admin/integrations_controller.rb
index 715aa882bda..0d79032233f 100644
--- a/app/controllers/admin/integrations_controller.rb
+++ b/app/controllers/admin/integrations_controller.rb
@@ -1,67 +1,15 @@
# frozen_string_literal: true
class Admin::IntegrationsController < Admin::ApplicationController
- include ServiceParams
-
- before_action :not_found, unless: :instance_level_integrations_enabled?
- before_action :service, only: [:edit, :update, :test]
-
- def edit
- end
-
- def update
- @service.attributes = service_params[:service]
-
- if @service.save(context: :manual_change)
- redirect_to edit_admin_application_settings_integration_path(@service), notice: success_message
- else
- render :edit
- end
- end
-
- def test
- if @service.can_test?
- render json: service_test_response, status: :ok
- else
- render json: {}, status: :not_found
- end
- end
+ include IntegrationsActions
private
- def instance_level_integrations_enabled?
+ def integrations_enabled?
Feature.enabled?(:instance_level_integrations)
end
- def project
- # TODO: Change to something more meaningful
- Project.first
- end
-
- def service
- @service ||= project.find_or_initialize_service(params[:id])
- end
-
- def success_message
- message = @service.active? ? _('activated') : _('settings saved, but not activated')
-
- _('%{service_title} %{message}.') % { service_title: @service.title, message: message }
- end
-
- def service_test_response
- unless @service.update(service_params[:service])
- return { error: true, message: _('Validations failed.'), service_response: @service.errors.full_messages.join(','), test_failed: false }
- end
-
- data = @service.test_data(project, current_user)
- outcome = @service.test(data)
-
- unless outcome[:success]
- return { error: true, message: _('Test failed.'), service_response: outcome[:result].to_s, test_failed: true }
- end
-
- {}
- rescue Gitlab::HTTP::BlockedUrlError => e
- { error: true, message: _('Test failed.'), service_response: e.message, test_failed: true }
+ def scoped_edit_integration_path(integration)
+ edit_admin_application_settings_integration_path(integration)
end
end
diff --git a/app/controllers/concerns/integrations_actions.rb b/app/controllers/concerns/integrations_actions.rb
new file mode 100644
index 00000000000..ffb5d7a8086
--- /dev/null
+++ b/app/controllers/concerns/integrations_actions.rb
@@ -0,0 +1,94 @@
+# frozen_string_literal: true
+
+module IntegrationsActions
+ extend ActiveSupport::Concern
+
+ included do
+ include ServiceParams
+
+ before_action :not_found, unless: :integrations_enabled?
+ before_action :integration, only: [:edit, :update, :test]
+ end
+
+ def edit
+ render 'shared/integrations/edit'
+ end
+
+ def update
+ integration.attributes = service_params[:service]
+
+ saved = integration.save(context: :manual_change)
+
+ respond_to do |format|
+ format.html do
+ if saved
+ redirect_to scoped_edit_integration_path(integration), notice: success_message
+ else
+ render 'shared/integrations/edit'
+ end
+ end
+
+ format.json do
+ status = saved ? :ok : :unprocessable_entity
+
+ render json: serialize_as_json, status: status
+ end
+ end
+ end
+
+ def test
+ if integration.can_test?
+ render json: service_test_response, status: :ok
+ else
+ render json: {}, status: :not_found
+ end
+ end
+
+ private
+
+ def integrations_enabled?
+ false
+ end
+
+ # TODO: Use actual integrations on the group / instance level
+ # To be completed in https://gitlab.com/groups/gitlab-org/-/epics/2430
+ def project
+ Project.first
+ end
+
+ def integration
+ # Using instance variable `@service` still required as it's used in ServiceParams
+ # and app/views/shared/_service_settings.html.haml. Should be removed once
+ # those 2 are refactored to use `@integration`.
+ @integration = @service ||= project.find_or_initialize_service(params[:id]) # rubocop:disable Gitlab/ModuleWithInstanceVariables
+ end
+
+ def success_message
+ message = integration.active? ? _('activated') : _('settings saved, but not activated')
+
+ _('%{service_title} %{message}.') % { service_title: integration.title, message: message }
+ end
+
+ def serialize_as_json
+ integration
+ .as_json(only: integration.json_fields)
+ .merge(errors: integration.errors.as_json)
+ end
+
+ def service_test_response
+ unless integration.update(service_params[:service])
+ return { error: true, message: _('Validations failed.'), service_response: integration.errors.full_messages.join(','), test_failed: false }
+ end
+
+ data = integration.test_data(project, current_user)
+ outcome = integration.test(data)
+
+ unless outcome[:success]
+ return { error: true, message: _('Test failed.'), service_response: outcome[:result].to_s, test_failed: true }
+ end
+
+ {}
+ rescue Gitlab::HTTP::BlockedUrlError => e
+ { error: true, message: _('Test failed.'), service_response: e.message, test_failed: true }
+ end
+end
diff --git a/app/controllers/groups/settings/integrations_controller.rb b/app/controllers/groups/settings/integrations_controller.rb
new file mode 100644
index 00000000000..43f8a7118d4
--- /dev/null
+++ b/app/controllers/groups/settings/integrations_controller.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+module Groups
+ module Settings
+ class IntegrationsController < Groups::ApplicationController
+ include IntegrationsActions
+
+ before_action :authorize_admin_group!
+
+ private
+
+ def integrations_enabled?
+ Feature.enabled?(:group_level_integrations, group)
+ end
+
+ def scoped_edit_integration_path(integration)
+ edit_group_settings_integration_path(group, integration)
+ end
+ end
+ end
+end