import_zendesk_controller.rb 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. # Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
  2. class ImportZendeskController < ApplicationController
  3. def url_check
  4. return if setup_done_response
  5. # validate
  6. if params[:url].blank? || params[:url] !~ %r{^(http|https)://.+?$}
  7. render json: {
  8. result: 'invalid',
  9. message: 'Invalid URL!',
  10. }
  11. return
  12. end
  13. # connection test
  14. translation_map = {
  15. 'No such file' => 'Hostname not found!',
  16. 'getaddrinfo: nodename nor servname provided, or not known' => 'Hostname not found!',
  17. '503 Service Temporarily Unavailable' => 'Hostname not found!',
  18. 'No route to host' => 'No route to host!',
  19. 'Connection refused' => 'Connection refused!',
  20. }
  21. response = UserAgent.request(params[:url])
  22. if !response.success?
  23. message_human = ''
  24. translation_map.each do |key, message|
  25. if response.error.to_s.match?(%r{#{Regexp.escape(key)}}i)
  26. message_human = message
  27. end
  28. end
  29. render json: {
  30. result: 'invalid',
  31. message_human: message_human,
  32. message: response.error.to_s,
  33. }
  34. return
  35. end
  36. # since 2016-10-15 a redirect to a marketing page has been implemented
  37. if !response.body.match?(%r{#{params[:url]}})
  38. render json: {
  39. result: 'invalid',
  40. message_human: 'Hostname not found!',
  41. }
  42. return
  43. end
  44. endpoint = "#{params[:url]}/api/v2"
  45. endpoint.gsub!(%r{([^:])//+}, '\\1/')
  46. Setting.set('import_zendesk_endpoint', endpoint)
  47. render json: {
  48. result: 'ok',
  49. url: params[:url],
  50. }
  51. end
  52. def credentials_check
  53. return if setup_done_response
  54. if !params[:username] || !params[:token]
  55. render json: {
  56. result: 'invalid',
  57. message_human: 'Incomplete credentials',
  58. }
  59. return
  60. end
  61. Setting.set('import_zendesk_endpoint_username', params[:username])
  62. Setting.set('import_zendesk_endpoint_key', params[:token])
  63. result = Sequencer.process('Import::Zendesk::ConnectionTest')
  64. if !result[:connected]
  65. Setting.set('import_zendesk_endpoint_username', nil)
  66. Setting.set('import_zendesk_endpoint_key', nil)
  67. render json: {
  68. result: 'invalid',
  69. message_human: 'Invalid credentials!',
  70. }
  71. return
  72. end
  73. render json: {
  74. result: 'ok',
  75. }
  76. end
  77. def import_start
  78. return if setup_done_response
  79. Setting.set('import_mode', true)
  80. Setting.set('import_backend', 'zendesk')
  81. job = ImportJob.create(name: 'Import::Zendesk')
  82. AsyncImportJob.perform_later(job)
  83. render json: {
  84. result: 'ok',
  85. }
  86. end
  87. def import_status
  88. job = ImportJob.find_by(name: 'Import::Zendesk')
  89. if job.finished_at.present?
  90. Setting.reload
  91. end
  92. model_show_render_item(job)
  93. end
  94. private
  95. def setup_done
  96. count = User.all.count()
  97. done = true
  98. if count <= 2
  99. done = false
  100. end
  101. done
  102. end
  103. def setup_done_response
  104. if !setup_done
  105. return false
  106. end
  107. render json: {
  108. setup_done: true,
  109. }
  110. true
  111. end
  112. end