/app/controllers/projects/services_controller.rb

https://gitlab.com/siemens/gitlab-ce · Ruby · 96 lines · 74 code · 20 blank · 2 comment · 5 complexity · 2855be2f4d605ff0472b2be1806cf232 MD5 · raw file

  1. # frozen_string_literal: true
  2. class Projects::ServicesController < Projects::ApplicationController
  3. include ServiceParams
  4. # Authorize
  5. before_action :authorize_admin_project!
  6. before_action :ensure_service_enabled
  7. before_action :service
  8. before_action :web_hook_logs, only: [:edit, :update]
  9. respond_to :html
  10. layout "project_settings"
  11. def edit
  12. end
  13. def update
  14. @service.attributes = service_params[:service]
  15. saved = @service.save(context: :manual_change)
  16. respond_to do |format|
  17. format.html do
  18. if saved
  19. redirect_to project_settings_integrations_path(@project),
  20. notice: success_message
  21. else
  22. render 'edit'
  23. end
  24. end
  25. format.json do
  26. status = saved ? :ok : :unprocessable_entity
  27. render json: serialize_as_json, status: status
  28. end
  29. end
  30. end
  31. def test
  32. if @service.can_test?
  33. render json: service_test_response, status: :ok
  34. else
  35. render json: {}, status: :not_found
  36. end
  37. end
  38. private
  39. def service_test_response
  40. if @service.update(service_params[:service])
  41. data = @service.test_data(project, current_user)
  42. outcome = @service.test(data)
  43. if outcome[:success]
  44. {}
  45. else
  46. { error: true, message: _('Test failed.'), service_response: outcome[:result].to_s, test_failed: true }
  47. end
  48. else
  49. { error: true, message: _('Validations failed.'), service_response: @service.errors.full_messages.join(','), test_failed: false }
  50. end
  51. rescue Gitlab::HTTP::BlockedUrlError => e
  52. { error: true, message: _('Test failed.'), service_response: e.message, test_failed: true }
  53. end
  54. def success_message
  55. if @service.active?
  56. _("%{service_title} activated.") % { service_title: @service.title }
  57. else
  58. _("%{service_title} settings saved, but not activated.") % { service_title: @service.title }
  59. end
  60. end
  61. def service
  62. @service ||= @project.find_or_initialize_service(params[:id])
  63. end
  64. def web_hook_logs
  65. return unless @service.service_hook.present?
  66. @web_hook_logs ||= @service.service_hook.web_hook_logs.recent.page(params[:page])
  67. end
  68. def ensure_service_enabled
  69. render_404 unless service
  70. end
  71. def serialize_as_json
  72. @service
  73. .as_json(only: @service.json_fields)
  74. .merge(errors: @service.errors.as_json)
  75. end
  76. end