diff --git a/.rubocop/todo.yml b/.rubocop/todo.yml
index ee3efe02f..e468a4e81 100644
--- a/.rubocop/todo.yml
+++ b/.rubocop/todo.yml
@@ -38,6 +38,7 @@ Metrics/AbcSize:
- 'app/controllers/getting_started_controller.rb'
- 'app/controllers/import_otrs_controller.rb'
- 'app/controllers/import_zendesk_controller.rb'
+ - 'app/controllers/import_freshdesk_controller.rb'
- 'app/controllers/integration/check_mk_controller.rb'
- 'app/controllers/integration/cti_controller.rb'
- 'app/controllers/integration/idoit_controller.rb'
@@ -466,6 +467,7 @@ Metrics/CyclomaticComplexity:
- 'app/controllers/getting_started_controller.rb'
- 'app/controllers/import_otrs_controller.rb'
- 'app/controllers/import_zendesk_controller.rb'
+ - 'app/controllers/import_freshdesk_controller.rb'
- 'app/controllers/integration/check_mk_controller.rb'
- 'app/controllers/integration/smime_controller.rb'
- 'app/controllers/knowledge_base/public/categories_controller.rb'
diff --git a/app/assets/javascripts/app/controllers/import_freshdesk.coffee b/app/assets/javascripts/app/controllers/import_freshdesk.coffee
new file mode 100644
index 000000000..10b565b33
--- /dev/null
+++ b/app/assets/javascripts/app/controllers/import_freshdesk.coffee
@@ -0,0 +1,194 @@
+class ImportFreshdesk extends App.ControllerWizardFullScreen
+ className: 'getstarted fit'
+ elements:
+ '.input-feedback': 'urlStatus'
+ '[data-target=freshdesk-credentials]': 'nextEnterCredentials'
+ '[data-target=freshdesk-start-migration]': 'nextStartMigration'
+ '#freshdesk-subdomain': 'freshdeskSubdomain'
+ '#freshdesk-subdomain-addon': 'freshdeskSubdomainAddon'
+ '.freshdesk-subdomain-error': 'linkErrorMessage'
+ '.freshdesk-api-token-error': 'apiTokenErrorMessage'
+ '#freshdesk-email': 'freshdeskEmail'
+ '#freshdesk-api-token': 'freshdeskApiToken'
+ '.js-ticket-count-info': 'ticketCountInfo'
+ updateMigrationDisplayLoop: 0
+
+ events:
+ 'click .js-freshdesk-credentials': 'showCredentials'
+ 'click .js-migration-start': 'startMigration'
+ 'keyup #freshdesk-subdomain': 'updateUrl'
+ 'keyup #freshdesk-api-token': 'updateApiToken'
+
+ constructor: ->
+ super
+
+ # set title
+ @title 'Import'
+
+ @freshdeskDomain = '.freshdesk.com'
+
+ # redirect to login if master user already exists
+ if @Config.get('system_init_done')
+ @navigate '#login'
+ return
+
+ @fetch()
+
+ fetch: ->
+
+ # get data
+ @ajax(
+ id: 'getting_started'
+ type: 'GET'
+ url: "#{@apiPath}/getting_started"
+ processData: true
+ success: (data, status, xhr) =>
+
+ # check if import is active
+ if data.import_mode == true && data.import_backend != 'freshdesk'
+ @navigate "#import/#{data.import_backend}", { emptyEl: true }
+ return
+
+ # render page
+ @render()
+
+ if data.import_mode == true
+ @showImportState()
+ @updateMigration()
+ )
+
+ render: ->
+ @replaceWith App.view('import/freshdesk')(
+ freshdeskDomain: @freshdeskDomain
+ )
+
+ updateUrl: (e) =>
+ @urlStatus.attr('data-state', 'loading')
+ @freshdeskSubdomainAddon.attr('style', 'padding-right: 42px')
+ @linkErrorMessage.text('')
+
+ # get data
+ callback = =>
+ @ajax(
+ id: 'import_freshdesk_url'
+ type: 'POST'
+ url: "#{@apiPath}/import/freshdesk/url_check"
+ data: JSON.stringify(url: "https://#{@freshdeskSubdomain.val()}#{@freshdeskDomain}")
+ processData: true
+ success: (data, status, xhr) =>
+
+ # validate form
+ if data.result is 'ok'
+ @urlStatus.attr('data-state', 'success')
+ @linkErrorMessage.text('')
+ @nextEnterCredentials.removeClass('hide')
+ else
+ @urlStatus.attr('data-state', 'error')
+ @linkErrorMessage.text( data.message_human || data.message)
+ @nextEnterCredentials.addClass('hide')
+
+ )
+ @delay( callback, 700, 'import_freshdesk_url' )
+
+ updateApiToken: (e) =>
+ @urlStatus.attr('data-state', 'loading')
+ @apiTokenErrorMessage.text('')
+
+ # get data
+ callback = =>
+ @ajax(
+ id: 'import_freshdesk_api_token'
+ type: 'POST'
+ url: "#{@apiPath}/import/freshdesk/credentials_check"
+ data: JSON.stringify(token: @freshdeskApiToken.val())
+ processData: true
+ success: (data, status, xhr) =>
+
+ # validate form
+ if data.result is 'ok'
+ @urlStatus.attr('data-state', 'success')
+ @apiTokenErrorMessage.text('')
+ @nextStartMigration.removeClass('hide')
+ else
+ @urlStatus.attr('data-state', 'error')
+ @apiTokenErrorMessage.text(data.message_human || data.message)
+ @nextStartMigration.addClass('hide')
+
+ )
+ @delay(callback, 700, 'import_freshdesk_api_token')
+
+ showCredentials: (e) =>
+ e.preventDefault()
+ @urlStatus.attr('data-state', '')
+ @$('[data-slide=freshdesk-subdomain]').toggleClass('hide')
+ @$('[data-slide=freshdesk-credentials]').toggleClass('hide')
+
+ showImportState: =>
+ @$('[data-slide=freshdesk-subdomain]').addClass('hide')
+ @$('[data-slide=freshdesk-credentials]').addClass('hide')
+ @$('[data-slide=freshdesk-import]').removeClass('hide')
+
+ startMigration: (e) =>
+ e.preventDefault()
+ @showImportState()
+ @ajax(
+ id: 'import_start'
+ type: 'POST'
+ url: "#{@apiPath}/import/freshdesk/import_start"
+ processData: true
+ success: (data, status, xhr) =>
+
+ # validate form
+ if data.result is 'ok'
+ @delay(@updateMigration, 3000)
+ )
+
+ updateMigration: =>
+ @updateMigrationDisplayLoop += 1
+ @showImportState()
+ @ajax(
+ id: 'import_status'
+ type: 'GET'
+ url: "#{@apiPath}/import/freshdesk/import_status"
+ processData: true
+ success: (data, status, xhr) =>
+
+ if _.isEmpty(data.result) && @updateMigrationDisplayLoop > 16
+ @$('.js-error').removeClass('hide')
+ @$('.js-error').html(App.i18n.translateContent('Background process did not start or has not finished! Please contact your support.'))
+ return
+
+ if !_.isEmpty(data.result['error'])
+ @$('.js-error').removeClass('hide')
+ @$('.js-error').html(App.i18n.translateContent(data.result['error']))
+ else
+ @$('.js-error').addClass('hide')
+
+ if !_.isEmpty(data.finished_at) && _.isEmpty(data.result['error'])
+ window.location.reload()
+ return
+
+ if !_.isEmpty(data.result)
+ for model, stats of data.result
+ if stats.sum > stats.total
+ stats.sum = stats.total
+
+ element = @$('.js-' + model.toLowerCase() )
+ element.find('.js-done').text(stats.sum)
+ element.find('.js-total').text(stats.total)
+ element.find('progress').attr('max', stats.total )
+ element.find('progress').attr('value', stats.sum )
+ if stats.total <= stats.sum
+ element.addClass('is-done')
+ else
+ element.removeClass('is-done')
+ @delay(@updateMigration, 5000)
+ )
+
+App.Config.set('import/freshdesk', ImportFreshdesk, 'Routes')
+App.Config.set('freshdesk', {
+ title: 'Freshdesk'
+ name: 'Freshdesk'
+ class: 'js-freshdesk'
+ url: '#import/freshdesk'
+}, 'ImportPlugins')
diff --git a/app/assets/javascripts/app/controllers/import_zendesk.coffee b/app/assets/javascripts/app/controllers/import_zendesk.coffee
index 221bf88fe..5bbfe83ab 100644
--- a/app/assets/javascripts/app/controllers/import_zendesk.coffee
+++ b/app/assets/javascripts/app/controllers/import_zendesk.coffee
@@ -73,14 +73,13 @@ class ImportZendesk extends App.ControllerWizardFullScreen
success: (data, status, xhr) =>
# validate form
- console.log(data)
if data.result is 'ok'
@urlStatus.attr('data-state', 'success')
@linkErrorMessage.text('')
@nextEnterCredentials.removeClass('hide')
else
@urlStatus.attr('data-state', 'error')
- @linkErrorMessage.text( data.message_human || data.message)
+ @linkErrorMessage.text( data.message_human || data.message)
@nextEnterCredentials.addClass('hide')
)
@@ -101,14 +100,13 @@ class ImportZendesk extends App.ControllerWizardFullScreen
success: (data, status, xhr) =>
# validate form
- console.log(data)
if data.result is 'ok'
@urlStatus.attr('data-state', 'success')
@apiTokenErrorMessage.text('')
@nextStartMigration.removeClass('hide')
else
@urlStatus.attr('data-state', 'error')
- @apiTokenErrorMessage.text(data.message_human || data.message)
+ @apiTokenErrorMessage.text(data.message_human || data.message)
@nextStartMigration.addClass('hide')
)
@@ -139,7 +137,6 @@ class ImportZendesk extends App.ControllerWizardFullScreen
success: (data, status, xhr) =>
# validate form
- console.log(data)
if data.result is 'ok'
@delay(@updateMigration, 3000)
)
diff --git a/app/assets/javascripts/app/views/import/freshdesk.jst.eco b/app/assets/javascripts/app/views/import/freshdesk.jst.eco
new file mode 100644
index 000000000..41de565a2
--- /dev/null
+++ b/app/assets/javascripts/app/views/import/freshdesk.jst.eco
@@ -0,0 +1,109 @@
+
+ <%- @Icon('full-logo', 'wizard-logo') %>
+
+
+
<%- @T('%s URL', 'Freshdesk') %>
+
+
+ <%- @T('Enter the Subdomain of your %s system', 'Freshdesk') %>:
+
+
+
+
+
+
+
+
+
+
<%- @T('%s Migration', 'Freshdesk') %>
+
+
+
+
+ - /-
+ <%- @T('Groups') %>
+
+
+
+ <%- @Icon('checkmark') %>
+
+
+
+ - /-
+ <%- @T('Organizations') %>
+
+
+
+ <%- @Icon('checkmark') %>
+
+
+
+ - /-
+ <%- @T('Users') %>
+
+
+
+ <%- @Icon('checkmark') %>
+
+
+
+ - /-
+ <%- @T('Tickets') %>
+
+
+
+ <%- @Icon('checkmark') %>
+
+
+
+
+
+
+
+
+
diff --git a/app/assets/javascripts/app/views/import/zendesk.jst.eco b/app/assets/javascripts/app/views/import/zendesk.jst.eco
index e48d4d4a5..ba97be671 100644
--- a/app/assets/javascripts/app/views/import/zendesk.jst.eco
+++ b/app/assets/javascripts/app/views/import/zendesk.jst.eco
@@ -42,7 +42,7 @@
<%- @T('API token') %>
-
\ No newline at end of file
+
diff --git a/app/assets/stylesheets/zammad.scss b/app/assets/stylesheets/zammad.scss
index 45e2128af..de3b84546 100644
--- a/app/assets/stylesheets/zammad.scss
+++ b/app/assets/stylesheets/zammad.scss
@@ -9196,6 +9196,14 @@ label + .wizard-buttonList {
width: 52px;
border-radius: 0 5px 5px 0;
background: linear-gradient(to right, rgba(255,255,255,0), white 33%);
+
+ &--no-background {
+ background: none;
+ }
+}
+
+.input-feedback--no-background {
+ background: none;
}
.input-feedback .icon {
diff --git a/app/controllers/import_freshdesk_controller.rb b/app/controllers/import_freshdesk_controller.rb
new file mode 100644
index 000000000..b94aa3bb3
--- /dev/null
+++ b/app/controllers/import_freshdesk_controller.rb
@@ -0,0 +1,143 @@
+# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
+class ImportFreshdeskController < ApplicationController
+
+ def url_check
+ return if setup_done_response
+
+ # validate
+ if params[:url].blank? || params[:url] !~ %r{^(http|https)://.+?$}
+ render json: {
+ result: 'invalid',
+ message: 'Invalid URL!',
+ }
+ return
+ end
+
+ response = UserAgent.request(params[:url])
+
+ if !response.success?
+ render json: {
+ result: 'invalid',
+ message_human: url_check_human_error_message(response.error.to_s),
+ message: response.error.to_s,
+ }
+ return
+ end
+
+ # Check if maybe a redirect is implemented.
+ if !response.body.match?(%r{#{params[:url]}})
+ render json: {
+ result: 'invalid',
+ message_human: 'Hostname not found!',
+ }
+ return
+ end
+
+ endpoint = "#{params[:url]}/api/v2"
+ endpoint.gsub!(%r{([^:])//+}, '\\1/')
+
+ Setting.set('import_freshdesk_endpoint', endpoint)
+
+ render json: {
+ result: 'ok',
+ url: params[:url],
+ }
+ end
+
+ def credentials_check
+ return if setup_done_response
+
+ if !params[:token]
+
+ render json: {
+ result: 'invalid',
+ message_human: 'Incomplete credentials',
+ }
+ return
+ end
+
+ Setting.set('import_freshdesk_endpoint_key', params[:token])
+
+ result = Sequencer.process('Import::Freshdesk::ConnectionTest')
+
+ if !result[:connected]
+
+ Setting.set('import_freshdesk_endpoint_key', nil)
+
+ render json: {
+ result: 'invalid',
+ message_human: 'Invalid credentials!',
+ }
+ return
+ end
+
+ render json: {
+ result: 'ok',
+ }
+ end
+
+ def import_start
+ return if setup_done_response
+
+ Setting.set('import_mode', true)
+ Setting.set('import_backend', 'freshdesk')
+
+ job = ImportJob.create(name: 'Import::Freshdesk')
+ AsyncImportJob.perform_later(job)
+
+ render json: {
+ result: 'ok',
+ }
+ end
+
+ def import_status
+ job = ImportJob.find_by(name: 'Import::Freshdesk')
+
+ if job.finished_at.present?
+ Setting.reload
+ end
+
+ model_show_render_item(job)
+ end
+
+ private
+
+ def setup_done
+ count = User.all.count()
+ done = true
+ if count <= 2
+ done = false
+ end
+ done
+ end
+
+ def setup_done_response
+ if !setup_done
+ return false
+ end
+
+ render json: {
+ setup_done: true,
+ }
+ true
+ end
+
+ def url_check_human_error_message(error)
+ translation_map = {
+ 'No such file' => 'Hostname not found!',
+ 'getaddrinfo: nodename nor servname provided, or not known' => 'Hostname not found!',
+ 'No route to host' => 'No route to host!',
+ 'Connection refused' => 'Connection refused!',
+ }
+
+ message_human = ''
+ translation_map.each do |key, message|
+ if error.match?(%r{#{Regexp.escape(key)}}i)
+ message_human = message
+ end
+ end
+
+ message_human
+ end
+
+end
diff --git a/app/controllers/import_zendesk_controller.rb b/app/controllers/import_zendesk_controller.rb
index ad4d6c9f1..2301716d4 100644
--- a/app/controllers/import_zendesk_controller.rb
+++ b/app/controllers/import_zendesk_controller.rb
@@ -50,6 +50,7 @@ class ImportZendeskController < ApplicationController
endpoint = "#{params[:url]}/api/v2"
endpoint.gsub!(%r{([^:])//+}, '\\1/')
+
Setting.set('import_zendesk_endpoint', endpoint)
render json: {
diff --git a/config/routes/import_freshdesk.rb b/config/routes/import_freshdesk.rb
new file mode 100644
index 000000000..8e8066857
--- /dev/null
+++ b/config/routes/import_freshdesk.rb
@@ -0,0 +1,10 @@
+Zammad::Application.routes.draw do
+ api_path = Rails.configuration.api_path
+
+ # import freshdesk
+ match api_path + '/import/freshdesk/url_check', to: 'import_freshdesk#url_check', via: :post
+ match api_path + '/import/freshdesk/credentials_check', to: 'import_freshdesk#credentials_check', via: :post
+ match api_path + '/import/freshdesk/import_start', to: 'import_freshdesk#import_start', via: :post
+ match api_path + '/import/freshdesk/import_status', to: 'import_freshdesk#import_status', via: :get
+
+end
diff --git a/db/seeds/settings.rb b/db/seeds/settings.rb
index d5af58d19..d8e4f3b14 100644
--- a/db/seeds/settings.rb
+++ b/db/seeds/settings.rb
@@ -3142,6 +3142,44 @@ Setting.create_if_not_exists(
state: '',
frontend: false
)
+
+Setting.create_if_not_exists(
+ title: 'Import Endpoint',
+ name: 'import_freshdesk_endpoint',
+ area: 'Import::Freshdesk',
+ description: 'Defines Freshdesk endpoint to import users, ticket, states and articles.',
+ options: {
+ form: [
+ {
+ display: '',
+ null: false,
+ name: 'import_freshdesk_endpoint',
+ tag: 'input',
+ },
+ ],
+ },
+ state: 'https://yours.freshdesk.com/api/v2',
+ frontend: false
+)
+Setting.create_if_not_exists(
+ title: 'Import Key for requesting the Freshdesk API',
+ name: 'import_freshdesk_endpoint_key',
+ area: 'Import::Freshdesk',
+ description: 'Defines Freshdesk endpoint authentication key.',
+ options: {
+ form: [
+ {
+ display: '',
+ null: false,
+ name: 'import_freshdesk_endpoint_key',
+ tag: 'input',
+ },
+ ],
+ },
+ state: '',
+ frontend: false
+)
+
Setting.create_if_not_exists(
title: 'Import Backends',
name: 'import_backends',
diff --git a/lib/import/base.rb b/lib/import/base.rb
index a42839c7c..c5b5be210 100644
--- a/lib/import/base.rb
+++ b/lib/import/base.rb
@@ -57,7 +57,7 @@ module Import
#
# return [nil]
def start
- raise "Missing implementation if the 'start' method."
+ raise "Missing implementation of the 'start' method."
end
end
end
diff --git a/lib/import/freshdesk.rb b/lib/import/freshdesk.rb
new file mode 100644
index 000000000..d8d91a7ba
--- /dev/null
+++ b/lib/import/freshdesk.rb
@@ -0,0 +1,15 @@
+# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
+
+module Import
+ class Freshdesk < Import::Base
+ include Import::Mixin::Sequence
+
+ def start
+ process
+ end
+
+ def sequence_name
+ 'Import::Freshdesk::Full'
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/agent.rb b/lib/sequencer/sequence/import/freshdesk/agent.rb
new file mode 100644
index 000000000..4459684b5
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/agent.rb
@@ -0,0 +1,26 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Agent < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::User',
+ 'Import::Freshdesk::Agent::Mapping',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::FindBy::Name',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Freshdesk::MapId',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/company.rb b/lib/sequencer/sequence/import/freshdesk/company.rb
new file mode 100644
index 000000000..7aa387bc5
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/company.rb
@@ -0,0 +1,27 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Company < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Organization',
+ 'Import::Freshdesk::Company::Mapping',
+ 'Import::Freshdesk::Mapping::CustomFields',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::FindBy::Name',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Freshdesk::MapId',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/company_field.rb b/lib/sequencer/sequence/import/freshdesk/company_field.rb
new file mode 100644
index 000000000..ec7dc394c
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/company_field.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class CompanyField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Organization',
+ 'Import::Freshdesk::ObjectAttribute::Skip',
+ 'Import::Freshdesk::ObjectAttribute::SanitizedName',
+ 'Import::Freshdesk::ObjectAttribute::Config',
+ 'Import::Freshdesk::ObjectAttribute::Add',
+ 'Import::Freshdesk::ObjectAttribute::MigrationExecute',
+ 'Import::Freshdesk::ObjectAttribute::FieldMap',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/connection_test.rb b/lib/sequencer/sequence/import/freshdesk/connection_test.rb
new file mode 100644
index 000000000..d484e200b
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/connection_test.rb
@@ -0,0 +1,20 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class ConnectionTest < Sequencer::Sequence::Base
+
+ def self.expecting
+ [:connected]
+ end
+
+ def self.sequence
+ [
+ 'Freshdesk::Connected',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/contact.rb b/lib/sequencer/sequence/import/freshdesk/contact.rb
new file mode 100644
index 000000000..915f8d024
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/contact.rb
@@ -0,0 +1,27 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Contact < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::User',
+ 'Import::Freshdesk::Contact::Mapping',
+ 'Import::Freshdesk::Mapping::CustomFields',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::FindBy::Name',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Freshdesk::MapId',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/contact_field.rb b/lib/sequencer/sequence/import/freshdesk/contact_field.rb
new file mode 100644
index 000000000..36bfeb39c
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/contact_field.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class ContactField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::User',
+ 'Import::Freshdesk::ObjectAttribute::Skip',
+ 'Import::Freshdesk::ObjectAttribute::SanitizedName',
+ 'Import::Freshdesk::ObjectAttribute::Config',
+ 'Import::Freshdesk::ObjectAttribute::Add',
+ 'Import::Freshdesk::ObjectAttribute::MigrationExecute',
+ 'Import::Freshdesk::ObjectAttribute::FieldMap',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/conversation.rb b/lib/sequencer/sequence/import/freshdesk/conversation.rb
new file mode 100644
index 000000000..20d57b7c8
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/conversation.rb
@@ -0,0 +1,23 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Conversation < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket::Article',
+ 'Import::Freshdesk::Conversation::Mapping',
+ 'Import::Freshdesk::Conversation::InlineImages',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Freshdesk::MapId',
+ 'Import::Freshdesk::Conversation::Attachments',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/conversations.rb b/lib/sequencer/sequence/import/freshdesk/conversations.rb
new file mode 100644
index 000000000..28041c299
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/conversations.rb
@@ -0,0 +1,19 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Conversations < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Sequencer::Unit::Import::Freshdesk::Request',
+ 'Import::Freshdesk::Resources',
+ 'Import::Freshdesk::ModelClass',
+ 'Import::Freshdesk::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/description.rb b/lib/sequencer/sequence/import/freshdesk/description.rb
new file mode 100644
index 000000000..80cfaa7c7
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/description.rb
@@ -0,0 +1,25 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Description < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket::Article',
+ 'Import::Freshdesk::Description::Mapping',
+ # Handling of inline images and attachments is the same for first article (description)
+ # and subsequent articles (conversation).
+ 'Import::Freshdesk::Conversation::InlineImages',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Freshdesk::MapId',
+ 'Import::Freshdesk::Conversation::Attachments',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/full.rb b/lib/sequencer/sequence/import/freshdesk/full.rb
new file mode 100644
index 000000000..1eab1fe16
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/full.rb
@@ -0,0 +1,33 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Full < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Common::ImportMode::Check',
+ 'Import::Common::SystemInitDone::Check',
+ 'Import::Common::ImportJob::DryRun',
+ 'Import::Freshdesk::IdMap',
+ 'Import::Freshdesk::Groups',
+ 'Import::Freshdesk::FieldMap',
+ 'Import::Freshdesk::CompanyFields',
+ 'Import::Freshdesk::Companies',
+ 'Import::Freshdesk::Agents',
+ 'Import::Freshdesk::Agents::GroupsPermissions',
+ 'Import::Freshdesk::ContactFields',
+ 'Import::Freshdesk::Contacts::Default',
+ 'Import::Freshdesk::Contacts::Blocked',
+ 'Import::Freshdesk::Contacts::Deleted',
+ 'Import::Freshdesk::TicketFields',
+ 'Import::Freshdesk::Tickets',
+ 'Import::Common::SystemInitDone::Set',
+ 'Import::Common::ImportMode::Unset',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/generic_field.rb b/lib/sequencer/sequence/import/freshdesk/generic_field.rb
new file mode 100644
index 000000000..fd7ee6934
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/generic_field.rb
@@ -0,0 +1,18 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class GenericField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Freshdesk::Request',
+ 'Import::Freshdesk::Resources',
+ 'Import::Freshdesk::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/generic_object.rb b/lib/sequencer/sequence/import/freshdesk/generic_object.rb
new file mode 100644
index 000000000..005464879
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/generic_object.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class GenericObject < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Import::Freshdesk::Request',
+ 'Import::Freshdesk::Resources',
+ 'Import::Freshdesk::ModelClass',
+ 'Import::Freshdesk::ObjectCount',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ 'Import::Freshdesk::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/group.rb b/lib/sequencer/sequence/import/freshdesk/group.rb
new file mode 100644
index 000000000..4a68713b6
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/group.rb
@@ -0,0 +1,26 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Group < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Group',
+ 'Import::Freshdesk::Group::Mapping',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::FindBy::Name',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Freshdesk::MapId',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/ticket.rb b/lib/sequencer/sequence/import/freshdesk/ticket.rb
new file mode 100644
index 000000000..12ec1257d
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/ticket.rb
@@ -0,0 +1,33 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class Ticket < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket',
+ # Fetch additional data such as attachments which is not included
+ # in the ticket list endpoint.
+ 'Import::Freshdesk::Ticket::Fetch',
+ 'Import::Freshdesk::Ticket::Mapping',
+ 'Import::Freshdesk::Mapping::CustomFields',
+ 'Import::Common::Model::Attributes::AddByIds',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ 'Import::Freshdesk::MapId',
+ 'Import::Freshdesk::Ticket::Tags',
+ 'Import::Freshdesk::Ticket::TimeEntries',
+ 'Import::Freshdesk::Ticket::Description',
+ 'Import::Freshdesk::Ticket::Conversations',
+ 'Import::Common::Model::Statistics::Diff::ModelKey',
+ 'Import::Common::ImportJob::Statistics::Update',
+ 'Import::Common::ImportJob::Statistics::Store',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/ticket_field.rb b/lib/sequencer/sequence/import/freshdesk/ticket_field.rb
new file mode 100644
index 000000000..d1c54f701
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/ticket_field.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class TicketField < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket',
+ 'Import::Freshdesk::ObjectAttribute::Skip',
+ 'Import::Freshdesk::ObjectAttribute::SanitizedName',
+ 'Import::Freshdesk::ObjectAttribute::Config',
+ 'Import::Freshdesk::ObjectAttribute::Add',
+ 'Import::Freshdesk::ObjectAttribute::MigrationExecute',
+ 'Import::Freshdesk::ObjectAttribute::FieldMap',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/time_entries.rb b/lib/sequencer/sequence/import/freshdesk/time_entries.rb
new file mode 100644
index 000000000..fad6e45a2
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/time_entries.rb
@@ -0,0 +1,19 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class TimeEntries < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Sequencer::Unit::Import::Freshdesk::Request',
+ 'Import::Freshdesk::Resources',
+ 'Import::Freshdesk::ModelClass',
+ 'Import::Freshdesk::Perform',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/sequence/import/freshdesk/time_entry.rb b/lib/sequencer/sequence/import/freshdesk/time_entry.rb
new file mode 100644
index 000000000..910e39d62
--- /dev/null
+++ b/lib/sequencer/sequence/import/freshdesk/time_entry.rb
@@ -0,0 +1,20 @@
+class Sequencer
+ class Sequence
+ module Import
+ module Freshdesk
+ class TimeEntry < Sequencer::Sequence::Base
+
+ def self.sequence
+ [
+ 'Common::ModelClass::Ticket::TimeAccounting',
+ 'Import::Freshdesk::TimeEntry::Mapping',
+ 'Import::Common::Model::Update',
+ 'Import::Common::Model::Create',
+ 'Import::Common::Model::Save',
+ ]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/common/model/tags.rb b/lib/sequencer/unit/common/model/tags.rb
new file mode 100644
index 000000000..c70c84d46
--- /dev/null
+++ b/lib/sequencer/unit/common/model/tags.rb
@@ -0,0 +1,30 @@
+class Sequencer
+ class Unit
+ module Common
+ module Model
+ class Tags < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_action :skipped, :failed
+
+ uses :dry_run, :instance
+
+ def process
+ return if dry_run
+ return if tags.blank?
+
+ Array(tags).each do |tag|
+ instance.tag_add(tag, 1)
+ end
+ end
+
+ private
+
+ def tags
+ raise NotImplementedError
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/common/model_class/ticket/time_accounting.rb b/lib/sequencer/unit/common/model_class/ticket/time_accounting.rb
new file mode 100644
index 000000000..bf4320d61
--- /dev/null
+++ b/lib/sequencer/unit/common/model_class/ticket/time_accounting.rb
@@ -0,0 +1,12 @@
+class Sequencer
+ class Unit
+ module Common
+ module ModelClass
+ class Ticket < Sequencer::Unit::Common::ModelClass::Base
+ class TimeAccounting < Sequencer::Unit::Common::ModelClass::Base
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/freshdesk/connected.rb b/lib/sequencer/unit/freshdesk/connected.rb
new file mode 100644
index 000000000..f5b408591
--- /dev/null
+++ b/lib/sequencer/unit/freshdesk/connected.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Unit
+ module Freshdesk
+ class Connected < Sequencer::Unit::Common::Provider::Named
+ extend ::Sequencer::Unit::Import::Freshdesk::Requester
+
+ private
+
+ def connected
+ response = self.class.perform_request(
+ api_path: 'agents/me',
+ )
+
+ response.is_a?(Net::HTTPOK)
+ rescue => e
+ logger.error e
+ nil
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/agent/mapping.rb b/lib/sequencer/unit/import/freshdesk/agent/mapping.rb
new file mode 100644
index 000000000..cd85147f4
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/agent/mapping.rb
@@ -0,0 +1,76 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Agent
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+ extend ::Sequencer::Unit::Import::Freshdesk::Requester
+
+ uses :resource, :id_map
+
+ def process
+ contact = resource['contact']
+
+ provide_mapped do
+ {
+ login: contact['email'],
+ firstname: contact['name'],
+ email: contact['email'],
+ phone: contact['phone'],
+ active: contact['active'],
+ group_ids: group_ids,
+ password: password,
+ image_source: contact['last_login_at'],
+ role_ids: ::Role.where(name: role_names).pluck(:id),
+ }
+ end
+ end
+
+ def self.admin_id
+ @admin_id ||= begin
+ token_user = self.token_user
+ token_user.try(:[], 'id')
+ end
+ end
+
+ def self.token_user
+ response = request(
+ api_path: 'agents/me',
+ )
+
+ JSON.parse(response.body)
+ rescue => e
+ logger.error e
+ nil
+ end
+
+ private
+
+ def group_ids
+ Array(resource['group_ids']).map do |group_id|
+ id_map['Group'][group_id]
+ end
+ end
+
+ def role_names
+ return %w[Agent Admin] if token_user?
+
+ 'Agent'
+ end
+
+ def password
+ return Setting.get('import_freshdesk_endpoint_key') if token_user?
+
+ nil
+ end
+
+ def token_user?
+ self.class.admin_id == resource['id']
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/agents.rb b/lib/sequencer/unit/import/freshdesk/agents.rb
new file mode 100644
index 000000000..6d69670c3
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/agents.rb
@@ -0,0 +1,10 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Agents < Sequencer::Unit::Import::Freshdesk::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/agents/groups_permissions.rb b/lib/sequencer/unit/import/freshdesk/agents/groups_permissions.rb
new file mode 100644
index 000000000..392034d82
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/agents/groups_permissions.rb
@@ -0,0 +1,29 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Agents < Sequencer::Unit::Import::Freshdesk::SubSequence::Object
+ class GroupsPermissions < Sequencer::Unit::Base
+
+ def process
+ ::Role.find_by(name: 'Agent').users.each do |user|
+ user.group_ids_access_map = group_ids_access_map
+ user.save!
+ end
+ end
+
+ private
+
+ def group_ids_access_map
+ @group_ids_access_map ||= begin
+ ::Group.all.pluck(:id).each_with_object({}) do |group_id, result|
+ result[group_id] = 'full'.freeze
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/companies.rb b/lib/sequencer/unit/import/freshdesk/companies.rb
new file mode 100644
index 000000000..32355da63
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/companies.rb
@@ -0,0 +1,10 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Companies < Sequencer::Unit::Import::Freshdesk::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/company/mapping.rb b/lib/sequencer/unit/import/freshdesk/company/mapping.rb
new file mode 100644
index 000000000..0bb4d5dca
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/company/mapping.rb
@@ -0,0 +1,24 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Company
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource
+
+ def process
+ provide_mapped do
+ {
+ name: resource['name'],
+ note: resource['description'],
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/company_fields.rb b/lib/sequencer/unit/import/freshdesk/company_fields.rb
new file mode 100644
index 000000000..6e7aece8a
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/company_fields.rb
@@ -0,0 +1,10 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class CompanyFields < Sequencer::Unit::Import::Freshdesk::SubSequence::Field
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/contact/mapping.rb b/lib/sequencer/unit/import/freshdesk/contact/mapping.rb
new file mode 100644
index 000000000..872390b85
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/contact/mapping.rb
@@ -0,0 +1,37 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Contact
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :id_map
+
+ def process
+ provide_mapped do
+ {
+ firstname: resource['name'],
+ active: resource['active'],
+ organization_id: organization_id,
+ email: resource['email'],
+ mobile: resource['mobile'],
+ phone: resource['phone'],
+ image_source: resource['avatar'],
+ group_ids: [],
+ role_ids: ::Role.where(name: 'Customer').pluck(:id),
+ }
+ end
+ end
+
+ private
+
+ def organization_id
+ id_map['Organization'][resource['company_id']]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/contact_fields.rb b/lib/sequencer/unit/import/freshdesk/contact_fields.rb
new file mode 100644
index 000000000..c9c82ac75
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/contact_fields.rb
@@ -0,0 +1,10 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class ContactFields < Sequencer::Unit::Import::Freshdesk::SubSequence::Field
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/contacts/blocked.rb b/lib/sequencer/unit/import/freshdesk/contacts/blocked.rb
new file mode 100644
index 000000000..368a48f9b
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/contacts/blocked.rb
@@ -0,0 +1,19 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Contacts
+ class Blocked < Sequencer::Unit::Import::Freshdesk::Contacts::Default
+
+ def request_params
+ super.merge(
+ state: 'blocked',
+ )
+ end
+
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/contacts/default.rb b/lib/sequencer/unit/import/freshdesk/contacts/default.rb
new file mode 100644
index 000000000..86e49b468
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/contacts/default.rb
@@ -0,0 +1,16 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Contacts
+ class Default < Sequencer::Unit::Import::Freshdesk::SubSequence::Object
+
+ def object
+ 'Contact'
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/contacts/deleted.rb b/lib/sequencer/unit/import/freshdesk/contacts/deleted.rb
new file mode 100644
index 000000000..3ce75c153
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/contacts/deleted.rb
@@ -0,0 +1,19 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Contacts
+ class Deleted < Sequencer::Unit::Import::Freshdesk::Contacts::Default
+
+ def request_params
+ super.merge(
+ state: 'deleted',
+ )
+ end
+
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/conversation/attachments.rb b/lib/sequencer/unit/import/freshdesk/conversation/attachments.rb
new file mode 100644
index 000000000..959046e1a
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/conversation/attachments.rb
@@ -0,0 +1,78 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Conversation
+ class Attachments < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ optional :action
+
+ skip_action :skipped, :failed
+
+ uses :resource, :instance, :model_class, :dry_run
+
+ def self.mutex
+ @mutex ||= Mutex.new
+ end
+
+ def process
+ return if resource['attachments'].blank?
+
+ download_threads.each(&:join)
+ end
+
+ private
+
+ def download_threads
+ resource['attachments'].map do |attachment|
+ Thread.new do
+ sync(attachment)
+ end
+ end
+ end
+
+ def sync(attachment)
+ logger.debug { "Downloading attachment #{attachment}" }
+
+ response = ::UserAgent.get(
+ attachment['attachment_url'],
+ {},
+ {
+ open_timeout: 20,
+ read_timeout: 240,
+ },
+ )
+
+ if !response.success?
+ logger.error response.error
+ return
+ end
+
+ return if dry_run
+
+ store_attachment(attachment, response)
+
+ end
+
+ def store_attachment(attachment, response)
+
+ self.class.mutex.synchronize do
+ ::Store.add(
+ object: model_class.name,
+ o_id: instance.id,
+ data: response.body,
+ filename: attachment['name'],
+ preferences: {
+ 'Content-Type' => attachment['content_type']
+ },
+ created_by_id: 1
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/conversation/inline_images.rb b/lib/sequencer/unit/import/freshdesk/conversation/inline_images.rb
new file mode 100644
index 000000000..1c2a7e108
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/conversation/inline_images.rb
@@ -0,0 +1,74 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Conversation
+ class InlineImages < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :mapped
+
+ def process
+ return if !contains_inline_image?(mapped[:body])
+
+ provide_mapped do
+ {
+ body: replaced_inline_images,
+ }
+ end
+ end
+
+ def self.inline_data(freshdesk_url)
+ @cache ||= {}
+ return @cache[freshdesk_url] if @cache[freshdesk_url]
+
+ image_data = download(freshdesk_url)
+ return if image_data.blank?
+
+ @cache[freshdesk_url] = "data:image/png;base64,#{Base64.strict_encode64(image_data)}"
+ @cache[freshdesk_url]
+ end
+
+ def self.download(freshdesk_url)
+ logger.debug { "Downloading inline image from #{freshdesk_url}" }
+
+ response = UserAgent.get(
+ freshdesk_url,
+ {},
+ {
+ open_timeout: 20,
+ read_timeout: 240,
+ },
+ )
+
+ return response.body if response.success?
+
+ logger.error response.error
+ nil
+ end
+
+ private
+
+ def contains_inline_image?(string)
+ return false if string.blank?
+
+ string.include?('freshdesk.com/inline/attachment')
+ end
+
+ def replaced_inline_images
+ body_html = Nokogiri::HTML(mapped[:body])
+
+ body_html.css('img').each do |node|
+ next if !contains_inline_image?(node['src'])
+
+ node.attributes['src'].value = self.class.inline_data(node['src'])
+ end
+
+ body_html.to_html
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/conversation/mapping.rb b/lib/sequencer/unit/import/freshdesk/conversation/mapping.rb
new file mode 100644
index 000000000..bea8a6b36
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/conversation/mapping.rb
@@ -0,0 +1,66 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Conversation
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :id_map
+
+ SOURCE_MAP = {
+ 0 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Reply
+ 1 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Email
+ 2 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Note
+ 3 => ::Ticket::Article::Type.select(:id).find_by(name: 'phone').id, # Phone
+ 4 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # UNKNOWN!
+ 5 => ::Ticket::Article::Type.select(:id).find_by(name: 'twitter status').id, # Created from tweets
+ 6 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Created from survey feedback
+ 7 => ::Ticket::Article::Type.select(:id).find_by(name: 'facebook feed post').id, # Created from Facebook post
+ 8 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Created from Forwarded Email
+ 9 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Phone
+ 10 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Mobihelp
+ 11 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # E-Commerce
+ }.freeze
+
+ INCOMING_MAP = {
+ true => ::Ticket::Article::Sender.select(:id).find_by(name: 'Customer').id,
+ false => ::Ticket::Article::Sender.select(:id).find_by(name: 'Agent').id,
+ }.freeze
+
+ def process # rubocop:disable Metrics/AbcSize
+ provide_mapped do
+ {
+ from: resource['from_email'],
+ to: resource['to_emails']&.join(', '),
+ cc: resource['cc_emails']&.join(', '),
+ ticket_id: ticket_id,
+ body: resource['body'],
+ content_type: 'text/html',
+ internal: resource['private'].present?,
+ message_id: resource['id'],
+ updated_by_id: user_id,
+ created_by_id: user_id,
+ sender_id: INCOMING_MAP[ resource['incoming'] ],
+ type_id: SOURCE_MAP[ resource['source'] ],
+ created_at: resource['created_at'],
+ updated_at: resource['updated_at'],
+ }
+ end
+ end
+
+ private
+
+ def ticket_id
+ id_map['Ticket'][resource['ticket_id']]
+ end
+
+ def user_id
+ id_map['User'][resource['user_id']]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/description/mapping.rb b/lib/sequencer/unit/import/freshdesk/description/mapping.rb
new file mode 100644
index 000000000..725d930fa
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/description/mapping.rb
@@ -0,0 +1,67 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Description
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :id_map
+
+ SOURCE_MAP = {
+ 0 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Reply
+ 1 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Email
+ 2 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Note
+ 3 => ::Ticket::Article::Type.select(:id).find_by(name: 'phone').id, # Phone
+ 4 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # UNKNOWN!
+ 5 => ::Ticket::Article::Type.select(:id).find_by(name: 'twitter status').id, # Created from tweets
+ 6 => ::Ticket::Article::Type.select(:id).find_by(name: 'web').id, # Created from survey feedback
+ 7 => ::Ticket::Article::Type.select(:id).find_by(name: 'facebook feed post').id, # Created from Facebook post
+ 8 => ::Ticket::Article::Type.select(:id).find_by(name: 'email').id, # Created from Forwarded Email
+ 9 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Phone
+ 10 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # Created from Mobihelp
+ 11 => ::Ticket::Article::Type.select(:id).find_by(name: 'note').id, # E-Commerce
+ }.freeze
+
+ def process # rubocop:disable Metrics/AbcSize
+ provide_mapped do
+ {
+ from: from,
+ to: resource['to_emails']&.join(', '),
+ cc: resource['cc_emails']&.join(', '),
+ ticket_id: ticket_id,
+ body: resource['description'],
+ content_type: 'text/html',
+ internal: false,
+ message_id: "ticketid#{resource['id']}@freshdesk.com",
+ sender_id: ::Ticket::Article::Sender.select(:id).find_by(name: 'Customer').id,
+ type_id: SOURCE_MAP[ resource['source'] ],
+ updated_by_id: requester_id,
+ created_by_id: requester_id,
+ created_at: resource['created_at'],
+ updated_at: resource['updated_at'],
+ }
+ end
+ end
+
+ private
+
+ def from
+ return nil if resource['to_emails'].blank?
+
+ ::User.find(requester_id).email
+ end
+
+ def requester_id
+ id_map['User'][resource['requester_id']]
+ end
+
+ def ticket_id
+ id_map['Ticket'][resource['id']]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/field_map.rb b/lib/sequencer/unit/import/freshdesk/field_map.rb
new file mode 100644
index 000000000..4d4196e48
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/field_map.rb
@@ -0,0 +1,14 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class FieldMap < Sequencer::Unit::Common::Provider::Named
+
+ def field_map
+ {}
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/group/mapping.rb b/lib/sequencer/unit/import/freshdesk/group/mapping.rb
new file mode 100644
index 000000000..c82bd61c0
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/group/mapping.rb
@@ -0,0 +1,24 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Group
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource
+
+ def process
+ provide_mapped do
+ {
+ name: resource['name'],
+ note: resource['description'],
+ }
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/groups.rb b/lib/sequencer/unit/import/freshdesk/groups.rb
new file mode 100644
index 000000000..9a100b24a
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/groups.rb
@@ -0,0 +1,10 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Groups < Sequencer::Unit::Import::Freshdesk::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/id_map.rb b/lib/sequencer/unit/import/freshdesk/id_map.rb
new file mode 100644
index 000000000..5d987f0e5
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/id_map.rb
@@ -0,0 +1,14 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class IdMap < Sequencer::Unit::Common::Provider::Named
+
+ def id_map
+ {}
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/map_id.rb b/lib/sequencer/unit/import/freshdesk/map_id.rb
new file mode 100644
index 000000000..ec72672c0
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/map_id.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class MapId < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ optional :action
+
+ skip_action :skipped, :failed
+
+ uses :id_map, :model_class, :resource, :instance
+
+ def process
+ id_map[model_class.name] ||= {}
+ id_map[model_class.name][resource['id']] = instance.id
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/mapping/custom_fields.rb b/lib/sequencer/unit/import/freshdesk/mapping/custom_fields.rb
new file mode 100644
index 000000000..d02f85bb4
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/mapping/custom_fields.rb
@@ -0,0 +1,34 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Mapping
+ class CustomFields < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :field_map, :model_class
+
+ def process
+ provide_mapped do
+ custom_fields
+ end
+ end
+
+ private
+
+ def custom_fields
+ resource['custom_fields'].each_with_object({}) do |(freshdesk_name, value), result|
+ local_name = custom_fields_map[freshdesk_name]
+ result[ local_name.to_sym ] = value
+ end
+ end
+
+ def custom_fields_map
+ @custom_fields_map ||= field_map[model_class.name]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/model_class.rb b/lib/sequencer/unit/import/freshdesk/model_class.rb
new file mode 100644
index 000000000..a63e298ce
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/model_class.rb
@@ -0,0 +1,27 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class ModelClass < Sequencer::Unit::Common::Provider::Named
+
+ uses :object
+
+ MAP = {
+ 'Company' => ::Organization,
+ 'Agent' => ::User,
+ 'Contact' => ::User,
+ 'Group' => ::Group,
+ 'Ticket' => ::Ticket,
+ 'Conversation' => ::Ticket::Article,
+ }.freeze
+
+ private
+
+ def model_class
+ MAP[object]
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/object_attribute/add.rb b/lib/sequencer/unit/import/freshdesk/object_attribute/add.rb
new file mode 100644
index 000000000..2f75dd290
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/object_attribute/add.rb
@@ -0,0 +1,21 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module ObjectAttribute
+ class Add < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ uses :config
+
+ def process
+ ObjectManager::Attribute.add(config)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/object_attribute/config.rb b/lib/sequencer/unit/import/freshdesk/object_attribute/config.rb
new file mode 100644
index 000000000..8261a3fa7
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/object_attribute/config.rb
@@ -0,0 +1,127 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module ObjectAttribute
+ class Config < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ uses :resource, :sanitized_name, :model_class
+ provides :config
+
+ def process
+ state.provide(:config) do
+ {
+ object: model_class.to_s,
+ name: sanitized_name,
+ display: resource['label'],
+ data_type: data_type,
+ data_option: data_option,
+ editable: true,
+ active: true,
+ screens: screens,
+ position: resource['position'],
+ created_by_id: 1,
+ updated_by_id: 1,
+ }
+ end
+ end
+
+ private
+
+ DATA_TYPE_MAP = {
+ 'custom_date' => 'date',
+ 'custom_checkbox' => 'boolean',
+ 'custom_dropdown' => 'select',
+ 'custom_text' => 'input',
+ 'custom_number' => 'integer',
+ 'custom_paragraph' => 'input',
+ 'custom_decimal' => 'input', # Don't use 'integer' as it would cut off the fractional part.
+ }.freeze
+
+ def data_type
+ @data_type ||= DATA_TYPE_MAP[resource['type']]
+ end
+
+ def data_option
+ {
+ null: true,
+ note: '',
+ }.merge(data_type_options)
+ end
+
+ def data_type_options
+
+ case data_type
+ when 'date'
+ {
+ future: true,
+ past: true,
+ diff: 0,
+ }
+ when 'boolean'
+ {
+ default: false,
+ options: {
+ true => 'yes',
+ false => 'no',
+ },
+ }
+ when 'select'
+ {
+ default: '',
+ options: options,
+ }
+ when 'input'
+ {
+ type: 'text',
+ maxlength: 255,
+ }
+ when 'integer'
+ {
+ min: 0,
+ max: 999_999_999,
+ }
+ else
+ {}
+ end
+ end
+
+ def screens
+ {
+ view: {
+ '-all-' => {
+ shown: true,
+ null: true,
+ },
+ Customer: {
+ shown: false,
+ null: true,
+ },
+ },
+ edit: {
+ '-all-' => {
+ shown: true,
+ null: true,
+ },
+ Customer: {
+ shown: false,
+ null: true,
+ },
+ }
+ }
+ end
+
+ def options
+ resource['choices'].each_with_object({}) do |choice, result|
+ result[choice] = choice
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/object_attribute/field_map.rb b/lib/sequencer/unit/import/freshdesk/object_attribute/field_map.rb
new file mode 100644
index 000000000..c44b494f9
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/object_attribute/field_map.rb
@@ -0,0 +1,24 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module ObjectAttribute
+ class FieldMap < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ optional :action
+
+ uses :field_map, :model_class, :resource, :sanitized_name
+
+ def process
+ field_map[model_class.name] ||= {}
+ field_map[model_class.name][ resource['name'] ] = sanitized_name
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/object_attribute/migration_execute.rb b/lib/sequencer/unit/import/freshdesk/object_attribute/migration_execute.rb
new file mode 100644
index 000000000..bfc85e9b9
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/object_attribute/migration_execute.rb
@@ -0,0 +1,19 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module ObjectAttribute
+ class MigrationExecute < Sequencer::Unit::Base
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ def process
+ ObjectManager::Attribute.migration_execute(false)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/object_attribute/sanitized_name.rb b/lib/sequencer/unit/import/freshdesk/object_attribute/sanitized_name.rb
new file mode 100644
index 000000000..c1703b207
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/object_attribute/sanitized_name.rb
@@ -0,0 +1,24 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module ObjectAttribute
+ class SanitizedName < Sequencer::Unit::Import::Common::ObjectAttribute::SanitizedName
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_any_action
+
+ uses :resource
+
+ private
+
+ def unsanitized_name
+ # active_customer
+ resource['name']
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/object_attribute/skip.rb b/lib/sequencer/unit/import/freshdesk/object_attribute/skip.rb
new file mode 100644
index 000000000..63c11bce8
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/object_attribute/skip.rb
@@ -0,0 +1,21 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module ObjectAttribute
+ class Skip < Sequencer::Unit::Base
+
+ uses :resource
+ provides :action
+
+ def process
+ return if !resource['default']
+
+ state.provide(:action, :skipped)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/object_count.rb b/lib/sequencer/unit/import/freshdesk/object_count.rb
new file mode 100644
index 000000000..d71f3663c
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/object_count.rb
@@ -0,0 +1,27 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class ObjectCount < Sequencer::Unit::Common::Provider::Attribute
+ include ::Sequencer::Unit::Import::Common::Model::Statistics::Mixin::EmptyDiff
+
+ uses :model_class, :resources
+
+ private
+
+ def statistics_diff
+ {
+ model_key => empty_diff.merge!(
+ total: resources.count
+ )
+ }
+ end
+
+ def model_key
+ model_class.name.pluralize.to_sym
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/perform.rb b/lib/sequencer/unit/import/freshdesk/perform.rb
new file mode 100644
index 000000000..f1d02f20c
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/perform.rb
@@ -0,0 +1,25 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Perform < Sequencer::Unit::Base
+
+ uses :resources, :object, :import_job, :dry_run, :field_map, :id_map
+
+ def process
+ resources.each do |resource|
+ ::Sequencer.process("Import::Freshdesk::#{object}",
+ parameters: {
+ import_job: import_job,
+ dry_run: dry_run,
+ resource: resource,
+ field_map: field_map,
+ id_map: id_map,
+ })
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/request.rb b/lib/sequencer/unit/import/freshdesk/request.rb
new file mode 100644
index 000000000..353b6cdb0
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/request.rb
@@ -0,0 +1,33 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ extend ::Sequencer::Unit::Import::Freshdesk::Requester
+
+ uses :object, :request_params
+ provides :response
+
+ private
+
+ def response
+
+ builder = backend.new(
+ object: object,
+ request_params: request_params
+ )
+
+ self.class.request(
+ api_path: builder.api_path,
+ params: builder.params,
+ )
+ end
+
+ def backend
+ "::Sequencer::Unit::Import::Freshdesk::Request::#{object}".safe_constantize || ::Sequencer::Unit::Import::Freshdesk::Request::Generic
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/request/conversation.rb b/lib/sequencer/unit/import/freshdesk/request/conversation.rb
new file mode 100644
index 000000000..8990282da
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/request/conversation.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class Conversation < Sequencer::Unit::Import::Freshdesk::Request::Generic
+ attr_reader :ticket
+
+ def initialize(*)
+ super
+ @ticket = request_params.delete(:ticket)
+ end
+
+ def api_path
+ "tickets/#{ticket['id']}/conversations"
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/request/generic.rb b/lib/sequencer/unit/import/freshdesk/request/generic.rb
new file mode 100644
index 000000000..27cb34114
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/request/generic.rb
@@ -0,0 +1,28 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class Generic
+ attr_reader :object, :request_params
+
+ def initialize(object:, request_params:)
+ @object = object
+ @request_params = request_params
+ end
+
+ def api_path
+ object.pluralize.underscore
+ end
+
+ def params
+ request_params.merge(
+ per_page: 100,
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/request/ticket.rb b/lib/sequencer/unit/import/freshdesk/request/ticket.rb
new file mode 100644
index 000000000..332c51cd6
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/request/ticket.rb
@@ -0,0 +1,19 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class Ticket < Sequencer::Unit::Import::Freshdesk::Request::Generic
+
+ def params
+ super.merge(
+ updated_since: '1970-01-01',
+ order_type: :asc,
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/request/time_entry.rb b/lib/sequencer/unit/import/freshdesk/request/time_entry.rb
new file mode 100644
index 000000000..1b345e62d
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/request/time_entry.rb
@@ -0,0 +1,22 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Request < Sequencer::Unit::Common::Provider::Attribute
+ class TimeEntry < Sequencer::Unit::Import::Freshdesk::Request::Generic
+ attr_reader :ticket
+
+ def initialize(*)
+ super
+ @ticket = request_params.delete(:ticket)
+ end
+
+ def api_path
+ "tickets/#{ticket['id']}/time_entries"
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/requester.rb b/lib/sequencer/unit/import/freshdesk/requester.rb
new file mode 100644
index 000000000..b8bb87fcb
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/requester.rb
@@ -0,0 +1,56 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Requester
+ def request(api_path:, params: nil)
+ 10.times do |iteration|
+ response = perform_request(
+ api_path: api_path,
+ params: params,
+ )
+
+ return response if response.is_a? Net::HTTPOK
+
+ handle_error response, iteration
+ rescue => e
+ handle_exception e, iteration
+ end
+ end
+
+ def handle_error(response, iteration)
+ sleep_for = 10
+ case response
+ when Net::HTTPTooManyRequests
+ sleep_for = response.header['retry-after'].to_i + 10
+ logger.info "Rate limit: #{response.header.to_hash} (429 Too Many Requests). Sleeping #{sleep_for} seconds and retry (##{iteration + 1}/10)."
+ else
+ logger.info "Unknown response: #{response.inspect}. Sleeping 10 seconds and retry (##{iteration + 1}/10)."
+ end
+ sleep sleep_for
+ end
+
+ def handle_exception(e, iteration)
+ logger.error e
+ logger.info "Sleeping 10 seconds after #{e.name} and retry (##{iteration + 1}/10)."
+ sleep 10
+ end
+
+ def perform_request(api_path:, params: nil)
+ uri = URI("#{Setting.get('import_freshdesk_endpoint')}/#{api_path}")
+ uri.query = URI.encode_www_form(params) if params.present?
+ headers = { 'Content-Type' => 'application/json' }
+
+ Net::HTTP.start(uri.host, uri.port, use_ssl: true, read_timeout: 600) do |http|
+ # for those special moments...
+ # http.set_debug_output($stdout)
+ request = Net::HTTP::Get.new(uri, headers)
+ request.basic_auth(Setting.get('import_freshdesk_endpoint_key'), 'X')
+ return http.request(request)
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/resources.rb b/lib/sequencer/unit/import/freshdesk/resources.rb
new file mode 100644
index 000000000..ae891b536
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/resources.rb
@@ -0,0 +1,18 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Resources < Sequencer::Unit::Common::Provider::Named
+
+ uses :response
+
+ private
+
+ def resources
+ JSON.parse(response.body)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/sub_sequence/field.rb b/lib/sequencer/unit/import/freshdesk/sub_sequence/field.rb
new file mode 100644
index 000000000..954005f30
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/sub_sequence/field.rb
@@ -0,0 +1,16 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module SubSequence
+ class Field < Sequencer::Unit::Import::Freshdesk::SubSequence::Generic
+
+ def sequence_name
+ 'Sequencer::Sequence::Import::Freshdesk::GenericField'.freeze
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/sub_sequence/generic.rb b/lib/sequencer/unit/import/freshdesk/sub_sequence/generic.rb
new file mode 100644
index 000000000..89346e473
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/sub_sequence/generic.rb
@@ -0,0 +1,48 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module SubSequence
+ class Generic < Sequencer::Unit::Base
+
+ uses :dry_run, :import_job, :field_map, :id_map
+
+ attr_accessor :iteration
+
+ def process
+ loop.each_with_index do |_, iteration|
+ @iteration = iteration
+
+ result = ::Sequencer.process(sequence_name,
+ parameters: {
+ request_params: request_params,
+ import_job: import_job,
+ dry_run: dry_run,
+ object: object,
+ field_map: field_map,
+ id_map: id_map,
+ },
+ expecting: [:response])
+ break if result[:response].header['link'].blank?
+ end
+ end
+
+ def request_params
+ {
+ page: iteration + 1,
+ }
+ end
+
+ def object
+ self.class.name.demodulize.singularize
+ end
+
+ def sequence_name
+ raise NotImplementedError
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/sub_sequence/object.rb b/lib/sequencer/unit/import/freshdesk/sub_sequence/object.rb
new file mode 100644
index 000000000..f11d1c01d
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/sub_sequence/object.rb
@@ -0,0 +1,16 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module SubSequence
+ class Object < Sequencer::Unit::Import::Freshdesk::SubSequence::Generic
+
+ def sequence_name
+ 'Sequencer::Sequence::Import::Freshdesk::GenericObject'.freeze
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb b/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb
new file mode 100644
index 000000000..56b8c63fe
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/ticket/conversations.rb
@@ -0,0 +1,33 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Ticket
+ class Conversations < Sequencer::Unit::Import::Freshdesk::SubSequence::Generic
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ optional :action
+
+ skip_action :skipped, :failed
+
+ uses :resource
+
+ def object
+ 'Conversation'
+ end
+
+ def sequence_name
+ 'Sequencer::Sequence::Import::Freshdesk::Conversations'.freeze
+ end
+
+ def request_params
+ super.merge(
+ ticket: resource,
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket/description.rb b/lib/sequencer/unit/import/freshdesk/ticket/description.rb
new file mode 100644
index 000000000..40c35d90d
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/ticket/description.rb
@@ -0,0 +1,28 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Ticket
+ class Description < Sequencer::Unit::Import::Freshdesk::SubSequence::Generic
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ skip_action :skipped, :failed
+
+ uses :dry_run, :import_job, :resource, :field_map, :id_map
+
+ def process
+ ::Sequencer.process('Import::Freshdesk::Description',
+ parameters: {
+ import_job: import_job,
+ dry_run: dry_run,
+ field_map: field_map,
+ id_map: id_map,
+ resource: resource,
+ })
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket/fetch.rb b/lib/sequencer/unit/import/freshdesk/ticket/fetch.rb
new file mode 100644
index 000000000..bda50b0d4
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/ticket/fetch.rb
@@ -0,0 +1,35 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Ticket
+ class Fetch < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Freshdesk::Requester
+
+ uses :resource
+
+ # Fetch additional data such as attachments which is not included
+ # in the ticket list endpoint.
+ def process
+ resource.merge!(fetch_ticket)
+ end
+
+ private
+
+ def fetch_ticket
+ response = request(
+ api_path: "tickets/#{resource['id']}",
+ )
+
+ JSON.parse(response.body)
+ rescue => e
+ logger.error "Error when fetching ticket data for ticket #{resource['id']}"
+ logger.error e
+ {}
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket/mapping.rb b/lib/sequencer/unit/import/freshdesk/ticket/mapping.rb
new file mode 100644
index 000000000..a032461ac
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/ticket/mapping.rb
@@ -0,0 +1,59 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Ticket
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :id_map
+
+ PRIORITY_MAP = {
+ 1 => ::Ticket::Priority.find_by(name: '1 low').id, # low
+ 2 => ::Ticket::Priority.find_by(name: '2 normal').id, # medium
+ 3 => ::Ticket::Priority.find_by(name: '3 high').id, # high
+ 4 => ::Ticket::Priority.find_by(name: '3 high').id, # urgent
+ }.freeze
+
+ STATE_MAP = {
+ 2 => ::Ticket::State.find_by(name: 'open').id, # open
+ 3 => ::Ticket::State.find_by(name: 'open').id, # pending
+ 4 => ::Ticket::State.find_by(name: 'closed').id, # resolved
+ 5 => ::Ticket::State.find_by(name: 'closed').id, # closed
+ }.freeze
+
+ def process # rubocop:disable Metrics/AbcSize
+ provide_mapped do
+ {
+ title: resource['subject'],
+ number: resource['id'],
+ group_id: group_id,
+ priority_id: PRIORITY_MAP[resource['priority']],
+ state_id: STATE_MAP[resource['status']],
+ owner_id: owner_id,
+ customer_id: customer_id,
+ created_at: resource['created_at'],
+ updated_at: resource['updated_at'],
+ }
+ end
+ end
+
+ private
+
+ def group_id
+ id_map.dig('Group', resource['group_id']) || ::Group.find_by(name: 'Support')&.id || 1
+ end
+
+ def customer_id
+ id_map['User'][resource['requester_id']]
+ end
+
+ def owner_id
+ id_map['User'][resource['responder_id']]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket/tags.rb b/lib/sequencer/unit/import/freshdesk/ticket/tags.rb
new file mode 100644
index 000000000..cd0488885
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/ticket/tags.rb
@@ -0,0 +1,20 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Ticket
+ class Tags < Sequencer::Unit::Common::Model::Tags
+
+ uses :resource
+
+ private
+
+ def tags
+ resource['tags']
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket/time_entries.rb b/lib/sequencer/unit/import/freshdesk/ticket/time_entries.rb
new file mode 100644
index 000000000..437d60643
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/ticket/time_entries.rb
@@ -0,0 +1,33 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module Ticket
+ class TimeEntries < Sequencer::Unit::Import::Freshdesk::SubSequence::Generic
+ prepend ::Sequencer::Unit::Import::Common::Model::Mixin::Skip::Action
+
+ optional :action
+
+ skip_action :skipped, :failed
+
+ uses :resource
+
+ def object
+ 'TimeEntry'
+ end
+
+ def sequence_name
+ 'Sequencer::Sequence::Import::Freshdesk::TimeEntries'.freeze
+ end
+
+ def request_params
+ super.merge(
+ ticket: resource,
+ )
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/ticket_fields.rb b/lib/sequencer/unit/import/freshdesk/ticket_fields.rb
new file mode 100644
index 000000000..971ba9564
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/ticket_fields.rb
@@ -0,0 +1,10 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class TicketFields < Sequencer::Unit::Import::Freshdesk::SubSequence::Field
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/tickets.rb b/lib/sequencer/unit/import/freshdesk/tickets.rb
new file mode 100644
index 000000000..c260b4d3b
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/tickets.rb
@@ -0,0 +1,10 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ class Tickets < Sequencer::Unit::Import::Freshdesk::SubSequence::Object
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sequencer/unit/import/freshdesk/time_entry/mapping.rb b/lib/sequencer/unit/import/freshdesk/time_entry/mapping.rb
new file mode 100644
index 000000000..0a10cfd71
--- /dev/null
+++ b/lib/sequencer/unit/import/freshdesk/time_entry/mapping.rb
@@ -0,0 +1,60 @@
+class Sequencer
+ class Unit
+ module Import
+ module Freshdesk
+ module TimeEntry
+ class Mapping < Sequencer::Unit::Base
+ include ::Sequencer::Unit::Import::Common::Mapping::Mixin::ProvideMapped
+
+ uses :resource, :id_map
+ provides :action
+
+ def process
+ provide_mapped do
+ {
+ time_unit: time_unit,
+ ticket_id: ticket_id,
+ created_by_id: agent_id,
+ created_at: resource['created_at'],
+ updated_at: resource['updated_at'],
+ }
+ end
+ rescue TypeError => e
+ # TODO
+ # TimeTracking is not available in the plans: Sprout, Blossom
+ # In this case `resource`s value is `["code", "require_feature"]`
+ # We should somehow detect that/the plan (no API available) to avoid
+ # running into this error and therefore performing unnecessary requests
+ # See:
+ # - Ticket# 1077135
+ # - https://support.freshdesk.com/support/solutions/articles/37583-keeping-track-of-time-spent
+ #
+ # Idea: Maybe it's possible to use the "X-Ratelimit-Total"-Value from the header, because with this it
+ # should be possible to detect the plan.
+
+ logger.debug { e }
+
+ # state.provide(:action, :failed)
+ state.provide(:action, :skipped)
+ end
+
+ private
+
+ def time_unit
+ hours, minutes = resource['time_spent'].match(%r{(\d{2}):(\d{2})}).captures
+ (hours.to_i * 60) + minutes.to_i
+ end
+
+ def ticket_id
+ id_map['Ticket'][resource['ticket_id']]
+ end
+
+ def agent_id
+ id_map['User'][resource['agent_id']]
+ end
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/spec/factories/object_manager_attribute.rb b/spec/factories/object_manager_attribute.rb
index 11a8250f8..09fba9c71 100644
--- a/spec/factories/object_manager_attribute.rb
+++ b/spec/factories/object_manager_attribute.rb
@@ -63,6 +63,19 @@ FactoryBot.define do
end
end
+ factory :object_manager_attribute_boolean, parent: :object_manager_attribute do
+ data_type { 'boolean' }
+ data_option do
+ {
+ default: false,
+ options: {
+ true => 'yes',
+ false => 'no',
+ }
+ }
+ end
+ end
+
factory :object_manager_attribute_date, parent: :object_manager_attribute do
name { 'date_attribute' }
data_type { 'date' }
diff --git a/spec/integration/freshdesk_spec.rb b/spec/integration/freshdesk_spec.rb
new file mode 100644
index 000000000..445d79909
--- /dev/null
+++ b/spec/integration/freshdesk_spec.rb
@@ -0,0 +1,99 @@
+require 'rails_helper'
+
+#
+# The purpose of this integration test is to verify that the API generally works.
+# Individual import steps are tested in spec/lib/sequencer.
+#
+
+RSpec.describe 'Freshdesk import', type: :integration, use_vcr: true, db_strategy: :reset do # rubocop:disable RSpec/DescribeClass
+
+ before do
+
+ if !ENV['IMPORT_FRESHDESK_ENDPOINT']
+ raise "ERROR: Need IMPORT_FRESHDESK_ENDPOINT - hint IMPORT_FRESHDESK_ENDPOINT='https://example.freshdesk.com/api/v2'"
+ end
+ if !ENV['IMPORT_FRESHDESK_ENDPOINT_KEY']
+ raise "ERROR: Need IMPORT_FRESHDESK_ENDPOINT_KEY - hint IMPORT_FRESHDESK_ENDPOINT_KEY='01234567899876543210'"
+ end
+
+ Setting.set('import_freshdesk_endpoint', ENV['IMPORT_FRESHDESK_ENDPOINT'])
+ Setting.set('import_freshdesk_endpoint_key', ENV['IMPORT_FRESHDESK_ENDPOINT_KEY'])
+ Setting.set('import_mode', true)
+ Setting.set('system_init_done', false)
+
+ VCR.configure do |c|
+ %w[
+ IMPORT_FRESHDESK_ENDPOINT
+ IMPORT_FRESHDESK_ENDPOINT_KEY
+ IMPORT_FRESHDESK_ENDPOINT_SUBDOMAIN
+ ].each do |env_key|
+ c.filter_sensitive_data("<#{env_key}>") { ENV[env_key] }
+ end
+
+ # The API key is used only inside the base64 encoded Basic Auth string, so mask that as well.
+ %w[
+ IMPORT_FRESHDESK_ENDPOINT_BASIC_AUTH
+ ].each do |env_key|
+ c.filter_sensitive_data("<#{env_key}>") { Base64.encode64( "#{ENV['IMPORT_FRESHDESK_ENDPOINT_KEY']}:X" ).chomp }
+ end
+ end
+
+ VCR.use_cassette 'freshdesk_import' do
+ ImportJob.create(name: 'Import::Freshdesk').start
+ end
+ end
+
+ context 'when performing the full Freshdesk import' do
+
+ let(:job) { ImportJob.last }
+ let(:expected_stats) do
+ {
+ 'Groups' => {
+ 'skipped' => 0,
+ 'created' => 9,
+ 'updated' => 0,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 9,
+ 'total' => 9,
+ },
+ 'Users' => {
+ 'skipped' => 0,
+ 'created' => 19,
+ 'updated' => 0,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 19,
+ 'total' => 19,
+ },
+ 'Organizations' => {
+ 'skipped' => 0,
+ 'created' => 0,
+ 'updated' => 1,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 1,
+ 'total' => 1,
+ },
+ 'Tickets' => {
+ 'skipped' => 0,
+ 'created' => 13,
+ 'updated' => 0,
+ 'unchanged' => 0,
+ 'failed' => 0,
+ 'deactivated' => 0,
+ 'sum' => 13,
+ 'total' => 13,
+ },
+ }
+ end
+
+ it 'imports the correct number of expected objects' do
+ expect(job.result).to eq expected_stats
+ end
+ end
+
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/agent_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/agent_spec.rb
new file mode 100644
index 000000000..11059654a
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/agent_spec.rb
@@ -0,0 +1,88 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::Agent, sequencer: :sequence do
+
+ context 'when importing agents from Freshdesk' do
+
+ let(:groups) do
+ create_list(:group, 3)
+ end
+
+ let(:resource) do
+ {
+ 'available' => false,
+ 'occasional' => false,
+ 'id' => 1001,
+ 'ticket_scope' => 1,
+ 'created_at' => '2021-04-09T13:23:58Z',
+ 'updated_at' => '2021-05-10T09:14:20Z',
+ 'last_active_at' => '2021-05-10T09:14:20Z',
+ 'available_since' => nil,
+ 'type' => 'support_agent',
+ 'contact' => {
+ 'active' => true,
+ 'email' => 'freshdesk@example.com',
+ 'job_title' => nil,
+ 'language' => 'en',
+ 'last_login_at' => '2021-05-10T07:52:58Z',
+ 'mobile' => nil,
+ 'name' => 'John Doe',
+ 'phone' => nil,
+ 'time_zone' => 'Eastern Time (US & Canada)',
+ 'created_at' => '2021-04-09T13:23:58Z',
+ 'updated_at' => '2021-04-09T13:31:00Z'
+ },
+ 'signature' => nil,
+ 'group_ids' => [1001, 1002, 1003]
+ }
+ end
+
+ let(:id_map) do
+ {
+ 'Group' => {
+ 1001 => groups[0].id,
+ 1002 => groups[1].id,
+ 1003 => groups[2].id,
+ }
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: id_map,
+ }
+ end
+
+ it 'imports user correctly' do # rubocop:disable RSpec/MultipleExpectations, RSpec/ExampleLength
+ expect { process(process_payload) }.to change(User, :count).by(1)
+ expect(User.last).to have_attributes(
+ firstname: 'John',
+ lastname: 'Doe',
+ login: 'freshdesk@example.com',
+ email: 'freshdesk@example.com',
+ active: true,
+ )
+ end
+
+ it 'sets user roles correctly for admin user' do
+ allow( Sequencer::Unit::Import::Freshdesk::Agent::Mapping).to receive(:admin_id).and_return(1001)
+ process(process_payload)
+ expect(User.last.roles.sort.map(&:name)).to eq %w[Admin Agent]
+ end
+
+ it 'sets user roles correctly for non-admin user' do
+ process(process_payload)
+ expect(User.last.roles.sort.map(&:name)).to eq ['Agent']
+ end
+
+ it 'sets user groups correctly ' do
+ process(process_payload)
+ expect(User.last.groups_access('full').sort).to eq groups
+ end
+
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/company_field_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/company_field_spec.rb
new file mode 100644
index 000000000..d32d65d3e
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/company_field_spec.rb
@@ -0,0 +1,63 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::CompanyField, sequencer: :sequence do
+
+ context 'when trying to import company fields from Freshdesk', db_strategy: :reset do
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: {},
+ }
+ end
+
+ # Other field types are checked in ticket_field_spec.rb.
+ context 'when fields are valid' do
+ let(:resource) do
+ {
+ 'id' => 80_000_387_409,
+ 'name' => 'custom_dropdown',
+ 'label' => 'custom_dropdown',
+ 'position' => 9,
+ 'required_for_agents' => false,
+ 'type' => 'custom_dropdown',
+ 'default' => false,
+ 'created_at' => '2021-04-12T20:24:41Z',
+ 'updated_at' => '2021-04-12T20:24:41Z',
+ 'choices' => [
+ 'First Choice',
+ 'Second Choice',
+ ],
+ }
+ end
+
+ it 'adds custom fields' do
+ expect { process(process_payload) }.to change(Organization, :column_names).by(['custom_dropdown'])
+ end
+ end
+
+ context 'when fields are invalid' do
+
+ let(:resource) do
+ {
+ 'id' => 80_000_382_712,
+ 'name' => 'name',
+ 'label' => 'Company Name',
+ 'position' => 1,
+ 'required_for_agents' => true,
+ 'type' => 'default_name',
+ 'default' => true,
+ 'created_at' => '2021-04-09T13:23:59Z',
+ 'updated_at' => '2021-04-09T13:23:59Z'
+ }
+ end
+
+ it 'ignores other fields' do
+ expect { process(process_payload) }.not_to change(Organization, :column_names)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/company_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/company_spec.rb
new file mode 100644
index 000000000..01d8ebdf1
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/company_spec.rb
@@ -0,0 +1,68 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::Company, sequencer: :sequence, db_strategy: :reset do
+
+ context 'when importing companies from Freshdesk' do
+
+ let(:resource) do
+ { 'id' => 80_000_602_705,
+ 'name' => 'Test Foundation',
+ 'description' => nil,
+ 'note' => nil,
+ 'domains' => ['acmecorp.com'],
+ 'created_at' => '2021-04-09T13:24:00Z',
+ 'updated_at' => '2021-04-12T20:25:36Z',
+ 'custom_fields' => {
+ 'cf_test_checkbox' => true,
+ 'cf_custom_integer' => 999,
+ 'cf_custom_dropdown' => 'key_2',
+ 'cf_custom_decimal' => '1.1',
+ },
+ 'health_score' => nil,
+ 'account_tier' => 'Basic',
+ 'renewal_date' => nil,
+ 'industry' => nil }
+ end
+
+ let(:field_map) do
+ {
+ 'Organization' => {
+ 'cf_test_checkbox' => 'cf_test_checkbox',
+ 'cf_custom_integer' => 'cf_custom_integer',
+ 'cf_custom_dropdown' => 'cf_custom_dropdown',
+ 'cf_custom_decimal' => 'cf_custom_decimal'
+ }
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: field_map,
+ id_map: {},
+ }
+ end
+
+ before do
+ create :object_manager_attribute_select, object_name: 'Organization', name: 'cf_custom_dropdown'
+ create :object_manager_attribute_integer, object_name: 'Organization', name: 'cf_custom_integer'
+ create :object_manager_attribute_boolean, object_name: 'Organization', name: 'cf_test_checkbox'
+ create :object_manager_attribute_text, object_name: 'Organization', name: 'cf_custom_decimal'
+ ObjectManager::Attribute.migration_execute
+ end
+
+ it 'adds organizations' do # rubocop:disable RSpec/MultipleExpectations, RSpec/ExampleLength
+ expect { process(process_payload) }.to change(Organization, :count).by(1)
+ expect(Organization.last).to have_attributes(
+ name: 'Test Foundation',
+ note: nil,
+ cf_custom_dropdown: 'key_2',
+ cf_custom_integer: 999,
+ cf_test_checkbox: true,
+ cf_custom_decimal: '1.1',
+ )
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/contact_field_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/contact_field_spec.rb
new file mode 100644
index 000000000..1732fc0de
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/contact_field_spec.rb
@@ -0,0 +1,70 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::ContactField, sequencer: :sequence do
+
+ context 'when tryping to import contact fields from Freshdesk', db_strategy: :reset do
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: {},
+ }
+ end
+
+ # Other field types are checked in ticket_field_spec.rb.
+ context 'when fields are valid' do
+ let(:resource) do
+ {
+ 'editable_in_signup' => false,
+ 'id' => 80_000_776_200,
+ 'name' => 'custom_dropdown',
+ 'label' => 'custom_dropdown',
+ 'position' => 16,
+ 'required_for_agents' => false,
+ 'type' => 'custom_dropdown',
+ 'default' => false,
+ 'customers_can_edit' => true,
+ 'label_for_customers' => 'custom_dropdown',
+ 'required_for_customers' => false,
+ 'displayed_for_customers' => true,
+ 'created_at' => '2021-04-12T20:19:46Z',
+ 'updated_at' => '2021-04-12T20:19:46Z',
+ 'choices' => [ 'First Choice', 'Second Choice']
+ }
+ end
+
+ it 'adds custom fields' do
+ expect { process(process_payload) }.to change(User, :column_names).by(['custom_dropdown'])
+ end
+ end
+
+ context 'when fields are invalid' do
+
+ let(:resource) do
+ {
+ 'editable_in_signup' => false,
+ 'id' => 80_000_766_844,
+ 'name' => 'twitter_followers_count',
+ 'label' => 'Twitter Follower Count',
+ 'position' => 15,
+ 'required_for_agents' => false,
+ 'type' => 'default_twitter_followers_count',
+ 'default' => true,
+ 'customers_can_edit' => false,
+ 'label_for_customers' => 'Twitter Follower Count',
+ 'required_for_customers' => false,
+ 'displayed_for_customers' => false,
+ 'created_at' => '2021-04-09T13:24:02Z',
+ 'updated_at' => '2021-04-09T13:24:02Z'
+ }
+ end
+
+ it 'ignores other fields' do
+ expect { process(process_payload) }.not_to change(User, :column_names)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/contact_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/contact_spec.rb
new file mode 100644
index 000000000..f8cd6e49a
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/contact_spec.rb
@@ -0,0 +1,86 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::Contact, sequencer: :sequence, db_strategy: :reset do
+
+ context 'when importing customers from Freshdesk' do
+
+ let(:resource) do
+ {
+ 'active' => false,
+ 'address' => nil,
+ 'company_id' => 1001,
+ 'description' => nil,
+ 'email' => 'sam.ozzy@freshdesk.com',
+ 'id' => 80_014_400_819,
+ 'job_title' => nil,
+ 'language' => 'en',
+ 'mobile' => nil,
+ 'name' => 'Sam Osborne',
+ 'phone' => nil,
+ 'time_zone' => 'Eastern Time (US & Canada)',
+ 'twitter_id' => nil,
+ 'custom_fields' => {
+ 'cf_test_checkbox' => true,
+ 'cf_custom_integer' => 999,
+ 'cf_custom_dropdown' => 'key_2',
+ 'cf_custom_decimal' => '1.1',
+ },
+ 'facebook_id' => nil,
+ 'created_at' => '2021-04-09T13:29:43Z',
+ 'updated_at' => '2021-04-09T13:29:43Z',
+ 'csat_rating' => 103,
+ 'preferred_source' => 'email',
+ }
+ end
+
+ let(:field_map) do
+ {
+ 'User' => {
+ 'cf_test_checkbox' => 'cf_test_checkbox',
+ 'cf_custom_integer' => 'cf_custom_integer',
+ 'cf_custom_dropdown' => 'cf_custom_dropdown',
+ 'cf_custom_decimal' => 'cf_custom_decimal'
+ }
+ }
+ end
+
+ let(:id_map) do
+ {
+ 'Organization' => { 1001 => 1 }
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: field_map,
+ id_map: id_map,
+ }
+ end
+
+ before do
+ create :object_manager_attribute_select, object_name: 'User', name: 'cf_custom_dropdown'
+ create :object_manager_attribute_integer, object_name: 'User', name: 'cf_custom_integer'
+ create :object_manager_attribute_boolean, object_name: 'User', name: 'cf_test_checkbox'
+ create :object_manager_attribute_text, object_name: 'User', name: 'cf_custom_decimal'
+ ObjectManager::Attribute.migration_execute
+ end
+
+ it 'imports customers correctly' do # rubocop:disable RSpec/MultipleExpectations, RSpec/ExampleLength
+ expect { process(process_payload) }.to change(User, :count).by(1)
+ expect(User.last).to have_attributes(
+ firstname: 'Sam',
+ lastname: 'Osborne',
+ login: 'sam.ozzy@freshdesk.com',
+ email: 'sam.ozzy@freshdesk.com',
+ active: false,
+ cf_custom_dropdown: 'key_2',
+ cf_custom_integer: 999,
+ cf_test_checkbox: true,
+ cf_custom_decimal: '1.1',
+ )
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/conversation_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/conversation_spec.rb
new file mode 100644
index 000000000..101447279
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/conversation_spec.rb
@@ -0,0 +1,102 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::Conversation, sequencer: :sequence do
+
+ context 'when importing conversations from Freshdesk' do
+
+ let(:resource) do
+ {
+ 'body' => "\n
Let's see if inline images work in a subsequent article:
\n
\n
", 'body_text' => "Let's see if inline images work in a subsequent article:",
+ 'id' => 80_027_218_656,
+ 'incoming' => false,
+ 'private' => true,
+ 'user_id' => 80_014_400_475,
+ 'support_email' => nil,
+ 'source' => 2,
+ 'category' => 2,
+ 'to_emails' => ['info@zammad.org'],
+ 'from_email' => nil,
+ 'cc_emails' => [],
+ 'bcc_emails' => nil,
+ 'email_failure_count' => nil,
+ 'outgoing_failures' => nil,
+ 'created_at' => '2021-05-14T12:30:19Z',
+ 'updated_at' => '2021-05-14T12:30:19Z',
+ 'attachments' => [
+ {
+ 'id' => 80_012_226_885,
+ 'name' => 'standalone_attachment.png',
+ 'content_type' => 'image/png',
+ 'size' => 11_447,
+ 'created_at' => '2021-05-14T12:30:16Z',
+ 'updated_at' => '2021-05-14T12:30:19Z',
+ 'attachment_url' => 'https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210514%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210514T123300Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=750988d37a6f2f43830bfd19c895517aa051aa13b4ab26a1333369d414fef0be',
+ 'thumb_url' => 'https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/thumb/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210514%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210514T123300Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=40b5fe1d7d418bcbd1e639b273a1038c7a73781c16d9881c2f31a11c6bebfdf9'
+ }
+ ],
+ 'auto_response' => false,
+ 'ticket_id' => 1001,
+ 'source_additional_info' => nil
+ }
+ end
+ let(:used_urls) do
+ [
+ 'https://eucattachment.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY4NTMsImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.705lNehzm--aO36CGFg0SW73j0NG3UWcRcN1_DXgtwc',
+ 'https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210514%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210514T123300Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=750988d37a6f2f43830bfd19c895517aa051aa13b4ab26a1333369d414fef0be',
+ ]
+ end
+
+ let(:ticket) { create :ticket }
+ let(:id_map) do
+ {
+ 'Ticket' => {
+ 1001 => ticket.id,
+ },
+ 'User' => {
+ 80_014_400_475 => 1,
+ }
+ }
+ end
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: id_map,
+ }
+ end
+
+ before do
+ # Mock the attachment and inline image download requests.
+ used_urls.each do |used_url|
+ stub_request(:get, used_url).to_return(status: 200, body: '123', headers: {})
+ end
+ end
+
+ it 'adds article with inline image' do # rubocop:disable RSpec/MultipleExpectations
+ expect { process(process_payload) }.to change(Ticket::Article, :count).by(1)
+ expect(Ticket::Article.last).to have_attributes(
+ to: 'info@zammad.org',
+ body: "\n\n
Let's see if inline images work in a subsequent article:
\n
\n
\n",
+ )
+ end
+
+ it 'adds correct number of attachments' do
+ process(process_payload)
+ expect(Ticket::Article.last.attachments.size).to eq 1
+ end
+
+ it 'adds attachment content' do # rubocop:disable RSpec/ExampleLength
+ process(process_payload)
+ expect(Ticket::Article.last.attachments.last).to have_attributes(
+ 'filename' => 'standalone_attachment.png',
+ 'size' => '3',
+ 'preferences' => {
+ 'Content-Type' => 'image/png',
+ 'resizable' => false,
+ }
+ )
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/group_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/group_spec.rb
new file mode 100644
index 000000000..f20a01fe1
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/group_spec.rb
@@ -0,0 +1,39 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::Group, sequencer: :sequence do
+
+ context 'when importing groups from Freshdesk' do
+
+ let(:resource) do
+ {
+ 'id' => 80_000_374_715,
+ 'name' => 'QA',
+ 'description' => 'Members of the QA team belong to this group',
+ 'escalate_to' => nil,
+ 'unassigned_for' => nil,
+ 'business_hour_id' => nil,
+ 'group_type' => 'support_agent_group',
+ 'created_at' => '2021-04-09T13:23:59Z',
+ 'updated_at' => '2021-04-09T13:23:59Z'
+ }
+ end
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: {},
+ }
+ end
+
+ it 'adds groups' do # rubocop:disable RSpec/MultipleExpectations
+ expect { process(process_payload) }.to change(Group, :count).by(1)
+ expect(Group.last).to have_attributes(
+ name: 'QA',
+ active: true,
+ )
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/ticket_field_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/ticket_field_spec.rb
new file mode 100644
index 000000000..25bb19f0e
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/ticket_field_spec.rb
@@ -0,0 +1,157 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::TicketField, sequencer: :sequence do
+
+ context 'when trying to import ticket fields from Freshdesk', db_strategy: :reset do
+
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: {},
+ id_map: {},
+ }
+ end
+
+ let(:base_resource) do
+ {
+ 'id' => 80_000_561_223,
+ 'label' => 'My custom field',
+ 'description' => nil,
+ 'position' => 14,
+ 'required_for_closure' => false,
+ 'required_for_agents' => false,
+ 'default' => false,
+ 'customers_can_edit' => true,
+ 'label_for_customers' => 'custom_dropdown',
+ 'required_for_customers' => false,
+ 'displayed_to_customers' => true,
+ 'created_at' => '2021-04-12T20:48:40Z',
+ 'updated_at' => '2021-04-12T20:48:40Z',
+ }
+ end
+
+ context 'when field is a dropdown' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_dropdown',
+ 'type' => 'custom_dropdown',
+ 'choices' => %w[key1 key2],
+ }
+ )
+ end
+
+ it 'adds a custom field' do
+ p resource
+ expect { process(process_payload) }.to change(Ticket, :column_names).by(['cf_custom_dropdown'])
+ end
+ end
+
+ context 'when field is a decimal' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_integer',
+ 'type' => 'custom_decimal',
+ }
+ )
+ end
+
+ it 'adds a custom field' do
+ expect { process(process_payload) }.to change(Ticket, :column_names).by(['cf_custom_integer'])
+ end
+ end
+
+ context 'when field is a number' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_integer',
+ 'type' => 'custom_number',
+ }
+ )
+ end
+
+ it 'adds a custom field' do
+ expect { process(process_payload) }.to change(Ticket, :column_names).by(['cf_custom_integer'])
+ end
+ end
+
+ context 'when field is a date' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_date',
+ 'type' => 'custom_date',
+ }
+ )
+ end
+
+ it 'adds a custom field' do
+ expect { process(process_payload) }.to change(Ticket, :column_names).by(['cf_custom_date'])
+ end
+ end
+
+ context 'when field is a checkbox' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_checkbox',
+ 'type' => 'custom_checkbox',
+ }
+ )
+ end
+
+ it 'adds a custom field' do
+ expect { process(process_payload) }.to change(Ticket, :column_names).by(['cf_custom_checkbox'])
+ end
+ end
+
+ context 'when field is a text' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_text',
+ 'type' => 'custom_text',
+ }
+ )
+ end
+
+ it 'adds a custom field' do
+ expect { process(process_payload) }.to change(Ticket, :column_names).by(['cf_custom_text'])
+ end
+ end
+
+ context 'when field is a paragraph' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_paragraph',
+ 'type' => 'custom_paragraph',
+ }
+ )
+ end
+
+ it 'adds a custom field' do
+ expect { process(process_payload) }.to change(Ticket, :column_names).by(['cf_custom_paragraph'])
+ end
+ end
+
+ context 'when field is invalid' do
+ let(:resource) do
+ base_resource.merge(
+ {
+ 'name' => 'cf_custom_unknown',
+ 'type' => 'custom_unknown',
+ }
+ )
+ end
+
+ it 'raises an error' do
+ expect { process(process_payload) }.to raise_error(ActiveRecord::RecordInvalid)
+ end
+ end
+ end
+end
diff --git a/spec/lib/sequencer/sequence/import/freshdesk/ticket_spec.rb b/spec/lib/sequencer/sequence/import/freshdesk/ticket_spec.rb
new file mode 100644
index 000000000..f6f2eab38
--- /dev/null
+++ b/spec/lib/sequencer/sequence/import/freshdesk/ticket_spec.rb
@@ -0,0 +1,174 @@
+require 'rails_helper'
+
+RSpec.describe ::Sequencer::Sequence::Import::Freshdesk::Ticket, sequencer: :sequence, db_strategy: 'reset' do
+
+ context 'when importing tickets from Freshdesk' do
+
+ let(:group) { create :group }
+ let(:resource) do
+ {
+ 'cc_emails' => [],
+ 'fwd_emails' => [],
+ 'reply_cc_emails' => [],
+ 'ticket_cc_emails' => [],
+ 'fr_escalated' => false,
+ 'spam' => false,
+ 'email_config_id' => nil,
+ 'group_id' => 80_000_374_718,
+ 'priority' => 1,
+ 'requester_id' => 80_014_400_475,
+ 'responder_id' => 80_014_400_475,
+ 'source' => 3,
+ 'company_id' => nil,
+ 'status' => 2,
+ 'subject' => 'Inline Images Failing?',
+ 'association_type' => nil,
+ 'support_email' => nil,
+ 'to_emails' => ['info@zammad.org'],
+ 'product_id' => nil,
+ 'id' => 13,
+ 'type' => nil,
+ 'due_by' => '2021-05-17T12:29:27Z',
+ 'fr_due_by' => '2021-05-15T12:29:27Z',
+ 'is_escalated' => false,
+ 'custom_fields' => {
+ 'cf_test_checkbox' => true,
+ 'cf_custom_integer' => 999,
+ 'cf_custom_dropdown' => 'key_2',
+ 'cf_custom_decimal' => '1.1'
+ },
+ 'created_at' => '2021-05-14T12:29:27Z',
+ 'updated_at' => '2021-05-14T12:30:19Z',
+ 'associated_tickets_count' => nil,
+ 'tags' => [],
+ 'description' => "\n
Inline images in the first article might not be working, see following:
\n
\n
", 'description_text' => 'Inline images in the first article might not be working, see following:'
+ }
+
+ end
+ let(:field_map) do
+ {
+ 'Ticket' => {
+ 'cf_test_checkbox' => 'cf_test_checkbox',
+ 'cf_custom_integer' => 'cf_custom_integer',
+ 'cf_custom_dropdown' => 'cf_custom_dropdown',
+ 'cf_custom_decimal' => 'cf_custom_decimal'
+ }
+ }
+ end
+ let(:id_map) do
+ {
+ 'User' => {
+ 80_014_400_475 => owner.id,
+ },
+ 'Group' => {
+ 80_000_374_718 => group.id,
+ },
+ }
+ end
+ let(:process_payload) do
+ {
+ import_job: build_stubbed(:import_job, name: 'Import::Freshdesk', payload: {}),
+ dry_run: false,
+ resource: resource,
+ field_map: field_map,
+ id_map: id_map,
+ }
+ end
+ let(:owner) { create :agent, group_ids: [group.id] }
+
+ let(:ticket_get_response_payload) do
+ attachment_payload = {
+ 'attachments' => [
+ {
+ 'id' => 80_012_226_885,
+ 'name' => 'standalone_attachment.png',
+ 'content_type' => 'image/png',
+ 'size' => 11_447,
+ 'created_at' => '2021-05-14T12:30:16Z',
+ 'updated_at' => '2021-05-14T12:30:19Z',
+ 'attachment_url' => 'https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210514%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210514T123300Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=750988d37a6f2f43830bfd19c895517aa051aa13b4ab26a1333369d414fef0be',
+ 'thumb_url' => 'https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/thumb/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210514%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210514T123300Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=40b5fe1d7d418bcbd1e639b273a1038c7a73781c16d9881c2f31a11c6bebfdf9'
+ }
+ ],
+ }
+ resource.merge(attachment_payload)
+ end
+
+ let(:used_urls) do
+ [
+ 'https://eucattachment.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY0NzksImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.cdYIOOSi7ckCFIZlQ9eynELMzJp1ECVeTLlQMCDgKo4',
+ 'https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210514%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210514T123300Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=750988d37a6f2f43830bfd19c895517aa051aa13b4ab26a1333369d414fef0be',
+ ]
+ end
+
+ before do
+ create :object_manager_attribute_select, name: 'cf_custom_dropdown'
+ create :object_manager_attribute_integer, name: 'cf_custom_integer'
+ create :object_manager_attribute_boolean, name: 'cf_test_checkbox'
+ create :object_manager_attribute_text, name: 'cf_custom_decimal'
+ ObjectManager::Attribute.migration_execute
+
+ # Mock the attachment and inline image download requests.
+ used_urls.each do |used_url|
+ stub_request(:get, used_url).to_return(status: 200, body: '123', headers: {})
+ end
+ # Mock the ticket get request (Import::Freshdesk::Ticket::Fetch).
+ stub_request(:get, 'https://yours.freshdesk.com/api/v2/tickets/13').to_return(status: 200, body: JSON.generate(ticket_get_response_payload), headers: {})
+ end
+
+ # We only want to test here the Ticket API, so disable other modules in the sequence
+ # that make their own HTTP requests.
+ custom_sequence = Sequencer::Sequence::Import::Freshdesk::Ticket.sequence.dup
+ custom_sequence.delete('Import::Freshdesk::Ticket::TimeEntries')
+ custom_sequence.delete('Import::Freshdesk::Ticket::Conversations')
+
+ it 'adds tickets' do # rubocop:disable RSpec/MultipleExpectations, RSpec/ExampleLength
+ allow(Sequencer::Sequence::Import::Freshdesk::Ticket).to receive(:sequence) { custom_sequence }
+ expect { process(process_payload) }.to change(Ticket, :count).by(1)
+ expect(Ticket.last).to have_attributes(
+ title: 'Inline Images Failing?',
+ note: nil,
+ create_article_type_id: 5,
+ create_article_sender_id: 2,
+ article_count: 1,
+ state_id: 2,
+ group_id: group.id,
+ priority_id: 1,
+ owner_id: owner.id,
+ customer_id: User.last.id,
+ cf_custom_dropdown: 'key_2',
+ cf_custom_integer: 999,
+ cf_test_checkbox: true,
+ cf_custom_decimal: '1.1',
+ )
+ end
+
+ it 'adds article with inline image' do # rubocop:disable RSpec/MultipleExpectations, RSpec/ExampleLength
+ allow(Sequencer::Sequence::Import::Freshdesk::Ticket).to receive(:sequence) { custom_sequence }
+ expect { process(process_payload) }.to change(Ticket::Article, :count).by(1)
+ expect(Ticket::Article.last).to have_attributes(
+ to: 'info@zammad.org',
+ body: "\n\n
Inline images in the first article might not be working, see following:
\n
\n
\n",
+ )
+ end
+
+ it 'adds correct number of attachments' do
+ allow(Sequencer::Sequence::Import::Freshdesk::Ticket).to receive(:sequence) { custom_sequence }
+ process(process_payload)
+ expect(Ticket::Article.last.attachments.size).to eq 1
+ end
+
+ it 'adds attachment content' do # rubocop:disable RSpec/ExampleLength
+ allow(Sequencer::Sequence::Import::Freshdesk::Ticket).to receive(:sequence) { custom_sequence }
+ process(process_payload)
+ expect(Ticket::Article.last.attachments.last).to have_attributes(
+ 'filename' => 'standalone_attachment.png',
+ 'size' => '3',
+ 'preferences' => {
+ 'Content-Type' => 'image/png',
+ 'resizable' => false,
+ }
+ )
+ end
+ end
+end
diff --git a/spec/lib/sequencer/unit/freshdesk/connected_spec.rb b/spec/lib/sequencer/unit/freshdesk/connected_spec.rb
new file mode 100644
index 000000000..07be4d782
--- /dev/null
+++ b/spec/lib/sequencer/unit/freshdesk/connected_spec.rb
@@ -0,0 +1,29 @@
+require 'rails_helper'
+
+RSpec.describe Sequencer::Unit::Freshdesk::Connected, sequencer: :unit do
+
+ context 'when checking the connection to Freshdesk' do
+
+ let(:params) do
+ {
+ dry_run: false,
+ import_job: instance_double(ImportJob),
+ field_map: {},
+ id_map: {},
+ }
+ end
+
+ let(:response_ok) { Net::HTTPOK.new(1.0, '200', 'OK') }
+ let(:response_unauthorized) { Net::HTTPUnauthorized.new(1.0, '401', 'Unauthorized') }
+
+ it 'check for correct connection' do
+ allow(described_class).to receive(:perform_request).with(any_args).and_return(response_ok)
+ expect(process(params)).to eq({ connected: true })
+ end
+
+ it 'check for unauthorized connection' do
+ allow(described_class).to receive(:perform_request).with(any_args).and_return(response_unauthorized)
+ expect(process(params)).to eq({ connected: false })
+ end
+ end
+end
diff --git a/spec/models/application_model/checks_import_examples.rb b/spec/models/application_model/checks_import_examples.rb
index 30688a2fc..e22cc3889 100644
--- a/spec/models/application_model/checks_import_examples.rb
+++ b/spec/models/application_model/checks_import_examples.rb
@@ -1,5 +1,5 @@
RSpec.shared_examples 'ApplicationModel::ChecksImport' do
- describe '#id (for referential integrity during OTRS/Zendesk import)' do
+ describe '#id (for referential integrity during (e.g. OTRS/Zendesk/Freshdesk) import)' do
subject { build(described_class.name.underscore, id: next_id + 1) }
let(:next_id) do
diff --git a/spec/system/import/freshdesk_spec.rb b/spec/system/import/freshdesk_spec.rb
new file mode 100644
index 000000000..6b28069c8
--- /dev/null
+++ b/spec/system/import/freshdesk_spec.rb
@@ -0,0 +1,137 @@
+require 'rails_helper'
+
+RSpec.describe 'Import Freshdesk', type: :system, set_up: false, authenticated_as: false do
+ before(:all) do # rubocop:disable RSpec/BeforeAfterAll
+ required_envs = %w[IMPORT_FRESHDESK_ENDPOINT_SUBDOMAIN IMPORT_FRESHDESK_ENDPOINT_KEY]
+ required_envs.each do |key|
+ skip("NOTICE: Missing environment variable #{key} for test! (Please fill up: #{required_envs.join(' && ')})") if ENV[key].blank?
+ end
+ end
+
+ # TODO: check/clarify how the ENV-works in the CI-Envoirment?
+
+ # TODO: check https://git.znuny.com/zammad/zammad/-/merge_requests/1506/
+ # comment out bellow block to use VCR tape for running freshdesk import
+ # this allows to work around freshdesk rate limiting
+ # works great for debugging freshdesk locally
+ # around do |example|
+ # VCR.temporary_ignore_regexps += [/^(\S+\.|)freshdesk.com$/, /^\S+.zdusercontent.com$/]
+
+ # example.run
+
+ # VCR.temporary_ignore_regexps -= [/^(\S+\.|)freshdesk.com$/, /^\S+.zdusercontent.com$/]
+ # end
+
+ describe 'fields validation', :use_vcr do
+ before do
+ visit '#import'
+ find('.js-freshdesk').click
+ end
+
+ let(:subdomain_field) { find('#freshdesk-subdomain') }
+ let(:token_field) { find('#freshdesk-api-token') }
+
+ it 'invalid hostname' do
+ subdomain_field.fill_in with: 'reallybadexample'
+
+ expect(page).to have_css('.freshdesk-subdomain-error', text: 'Hostname not found!')
+ end
+
+ it 'valid hostname' do
+ subdomain_field.fill_in with: 'reallybadexample'
+
+ # wait for error to appear to validate it's hidden successfully
+ find('.freshdesk-subdomain-error', text: 'Hostname not found!')
+
+ subdomain_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_SUBDOMAIN']
+
+ expect(page).to have_no_css('.freshdesk-subdomain-error', text: 'Hostname not found!')
+ end
+
+ it 'invalid credentials' do
+ subdomain_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_SUBDOMAIN']
+ find('.js-freshdesk-credentials').click
+ token_field.fill_in with: '1nv4l1dT0K3N'
+
+ expect(page).to have_css('.freshdesk-api-token-error', text: 'Invalid credentials!')
+ end
+
+ it 'valid credentials' do
+ subdomain_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_SUBDOMAIN']
+ find('.js-freshdesk-credentials').click
+ token_field.fill_in with: '1nv4l1dT0K3N'
+
+ # wait for error to appear to validate it's hidden successfully
+ expect(page).to have_css('.freshdesk-api-token-error', text: 'Invalid credentials!')
+
+ token_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_KEY']
+
+ expect(page).to have_no_css('.freshdesk-api-token-error', text: 'Invalid credentials!')
+ end
+
+ it 'shows start button' do
+ subdomain_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_SUBDOMAIN']
+ find('.js-freshdesk-credentials').click
+ token_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_KEY']
+
+ expect(page).to have_css('.js-migration-start')
+ end
+ end
+
+ describe 'import progress', :use_vcr do
+ let(:subdomain_field) { find('#freshdesk-subdomain') }
+ let(:token_field) { find('#freshdesk-api-token') }
+ let(:job) { ImportJob.find_by(name: 'Import::Freshdesk') }
+
+ before do
+ VCR.use_cassette 'system/import/freshdesk/import_progress_setup' do
+ visit '#import'
+ find('.js-freshdesk').click
+
+ subdomain_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_SUBDOMAIN']
+ find('.js-freshdesk-credentials').click
+ token_field.fill_in with: ENV['IMPORT_FRESHDESK_ENDPOINT_KEY']
+
+ find('.js-migration-start').click
+
+ await_empty_ajax_queue
+ end
+ end
+
+ it 'shows groups progress' do
+ job.update! result: { Groups: { sum: 3, total: 5 } }
+
+ expect(page).to have_css('.js-groups .js-done', text: '3')
+ .and(have_css('.js-groups .js-total', text: '5'))
+ end
+
+ it 'shows users progress' do
+ job.update! result: { Users: { sum: 5, total: 9 } }
+
+ expect(page).to have_css('.js-users .js-done', text: '5')
+ .and(have_css('.js-users .js-total', text: '9'))
+ end
+
+ it 'shows organizations progress' do
+ job.update! result: { Organizations: { sum: 3, total: 5 } }
+
+ expect(page).to have_css('.js-organizations .js-done', text: '3')
+ .and(have_css('.js-organizations .js-total', text: '5'))
+ end
+
+ it 'shows tickets progress' do
+ job.update! result: { Tickets: { sum: 3, total: 5 } }
+
+ expect(page).to have_css('.js-tickets .js-done', text: '3')
+ .and(have_css('.js-tickets .js-total', text: '5'))
+ end
+
+ it 'shows login after import is finished' do
+ job.update! finished_at: Time.zone.now
+
+ Rake::Task['zammad:setup:auto_wizard'].execute
+
+ expect(page).to have_text('Login')
+ end
+ end
+end
diff --git a/test/data/vcr_cassettes/freshdesk_import.yml b/test/data/vcr_cassettes/freshdesk_import.yml
new file mode 100644
index 000000000..dbaaa30fd
--- /dev/null
+++ b/test/data/vcr_cassettes/freshdesk_import.yml
@@ -0,0 +1,4300 @@
+---
+http_interactions:
+- request:
+ method: get
+ uri: "/groups?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:33 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - ead55ccd-9702-49f6-9cde-51b097afffd4
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '100'
+ X-Ratelimit-Remaining:
+ - '99'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '44'
+ X-Trace-Id:
+ - 00-aafe48b0dad645af1ba7a4336062d18c-7dae3f981a702100-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"id":80000374754,"name":"Account managers","description":"Account
+ managers","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:29:45Z","updated_at":"2021-04-09T13:29:45Z"},{"id":80000374717,"name":"Billing","description":"Members
+ of the Billing team belong to this group","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000374751,"name":"Customer
+ Support","description":"Customer Support","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:29:43Z","updated_at":"2021-04-09T13:29:43Z"},{"id":80000374753,"name":"Development","description":"Development","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:29:44Z","updated_at":"2021-04-09T13:29:44Z"},{"id":80000374718,"name":"Escalations","description":"Team
+ to handle Customer escalations","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000374752,"name":"Login
+ and security","description":"Login and security","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:29:43Z","updated_at":"2021-04-09T13:29:43Z"},{"id":80000374714,"name":"Product
+ Management","description":"Product Management group","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000374715,"name":"QA","description":"Members
+ of the QA team belong to this group","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000374716,"name":"Sales","description":"People
+ in the Sales team are members of this group","escalate_to":null,"unassigned_for":null,"business_hour_id":null,"group_type":"support_agent_group","created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:33 GMT
+- request:
+ method: get
+ uri: "/company_fields?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:34 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 6b19d3ae-f119-9157-93fb-efff102b9645
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '100'
+ X-Ratelimit-Remaining:
+ - '98'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '86'
+ X-Trace-Id:
+ - 00-7b393d72ce02637702d9a8ad3fa37629-ee1a4cf707e8d69d-01
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"id":80000382712,"name":"name","label":"Company Name","position":1,"required_for_agents":true,"type":"default_name","default":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000382713,"name":"description","label":"Description","position":2,"required_for_agents":false,"type":"default_description","default":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"id":80000382714,"name":"note","label":"Notes","position":3,"required_for_agents":false,"type":"default_note","default":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"id":80000382715,"name":"domains","label":"Domains
+ for this company","position":4,"required_for_agents":false,"type":"default_domains","default":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"id":80000382716,"name":"health_score","label":"Health
+ score","position":5,"required_for_agents":false,"type":"default_health_score","default":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z","choices":["At
+ risk","Doing okay","Happy"]},{"id":80000382717,"name":"account_tier","label":"Account
+ tier","position":6,"required_for_agents":false,"type":"default_account_tier","default":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z","choices":["Basic","Premium","Enterprise"]},{"id":80000382718,"name":"renewal_date","label":"Renewal
+ date","position":7,"required_for_agents":false,"type":"default_renewal_date","default":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"id":80000382719,"name":"industry","label":"Industry","position":8,"required_for_agents":false,"type":"default_industry","default":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z","choices":["Automotive","Consumer
+ Durables and Apparel","Diversified Consumer Services","Hotels, Restaurants
+ and Leisure","Consumer Goods","Household Durables","Leisure Products","Textiles,
+ Apparel and Luxury Goods","Education Services","Family Services","Specialized
+ Consumer Services","Media","Distributors","Specialty Retail","Beverages","Food
+ Products","Food and Staples Retailing","Personal Products","Tobacco","Gas
+ Utilities","Banks","Capital Markets","Diversified Financial Services","Insurance","Real
+ Estate","Health Care Equipment and Supplies","Health Care Providers and Services","Biotechnology","Pharmaceuticals","Professional
+ Services","Aerospace and Defense","Air Freight and Logistics","Airlines","Commercial
+ Services and Supplies","Construction and Engineering","Electrical Equipment","Industrial
+ Conglomerates","Machinery","Marine","Road and Rail","Trading Companies and
+ Distributors","Transportation","Internet Software and Services","IT Services","Software","Communications
+ Equipment","Electronic Equipment, Instruments and Components","Technology
+ Hardware, Storage and Peripherals","Building Materials","Chemicals","Containers
+ and Packaging","Metals and Mining","Paper and Forest Products","Diversified
+ Telecommunication Services","Wireless Telecommunication Services","Renewable
+ Electricity","Electric Utilities","Utilities","Other"]},{"id":80000387409,"name":"custom_dropdown","label":"custom_dropdown","position":9,"required_for_agents":false,"type":"custom_dropdown","default":false,"created_at":"2021-04-12T20:24:41Z","updated_at":"2021-04-12T20:24:41Z","choices":["First
+ Choice","Second Choice"]}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:34 GMT
+- request:
+ method: get
+ uri: "/companies?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:34 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 32a5bd46-c50d-4951-a35d-84964117c519
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '100'
+ X-Ratelimit-Remaining:
+ - '97'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '60'
+ X-Trace-Id:
+ - 00-6e0eecca10c295ee53c11bb96d9b0b1a-15b9308190ed958d-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"id":80000602705,"name":"Zammad Foundation","description":null,"note":null,"domains":["acmecorp.com"],"created_at":"2021-04-09T13:24:00Z","updated_at":"2021-04-12T20:25:36Z","custom_fields":{"custom_dropdown":null},"health_score":null,"account_tier":"Basic","renewal_date":null,"industry":null}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:34 GMT
+- request:
+ method: get
+ uri: "/agents?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:35 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - aea4ef06-2aef-40e0-a990-b4b6d04fad31
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '100'
+ X-Ratelimit-Remaining:
+ - '96'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '98'
+ X-Trace-Id:
+ - 00-79c8fee2c787c294ff869d89b28cc5c1-e55b3d113c74ac1b-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"available":false,"occasional":true,"id":80014400480,"ticket_scope":1,"created_at":"2021-04-09T13:24:01Z","updated_at":"2021-04-09T13:24:01Z","last_active_at":null,"available_since":null,"type":"support_agent","contact":{"active":false,"email":"custserv@freshdesk.com","job_title":null,"language":"en","last_login_at":null,"mobile":null,"name":"Customer
+ Service","phone":null,"time_zone":"Eastern Time (US & Canada)","created_at":"2021-04-09T13:24:01Z","updated_at":"2021-04-09T13:24:01Z"},"signature":null},{"available":false,"occasional":false,"id":80014400475,"ticket_scope":1,"created_at":"2021-04-09T13:23:58Z","updated_at":"2021-05-14T11:05:10Z","last_active_at":"2021-05-14T11:05:10Z","available_since":null,"type":"support_agent","contact":{"active":true,"email":"info@.org","job_title":null,"language":"en","last_login_at":"2021-05-10T09:14:20Z","mobile":null,"name":"Thorsten
+ Eckel","phone":null,"time_zone":"Eastern Time (US & Canada)","created_at":"2021-04-09T13:23:58Z","updated_at":"2021-04-09T13:31:00Z"},"signature":null}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:35 GMT
+- request:
+ method: get
+ uri: "/agents/me"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:35 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - b0773a43-d90f-4e4f-bbb7-813544da36b3
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _helpkit_session=BAh7B0kiD3Nlc3Npb25faWQGOgZFVEkiJTc2MmU1NWNlYTczN2NjNzk1OWI5ODZkMjJhNDBiYWQ4BjsAVEkiEF9jc3JmX3Rva2VuBjsARkkiMWtpa05Lc01abzdHYnRQcEVVZlRNQkVGaGFCZDNaWUpUemhUckVRUXJHeGM9BjsARg%3D%3D--4e7d9d718d3f04e3652341eb8b14e84423220f1c;
+ path=/; HttpOnly; secure
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '100'
+ X-Ratelimit-Remaining:
+ - '95'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '61'
+ X-Trace-Id:
+ - 00-c88c62a6433543c119c88aa2c0a6ed9e-03d1500e03971c2f-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '{"available":false,"occasional":false,"id":80014400475,"ticket_scope":1,"signature":null,"group_ids":[],"role_ids":[80000198826],"skill_ids":[],"available_since":null,"contact":{"active":true,"email":"info@.org","job_title":null,"language":"en","mobile":null,"name":"Thorsten
+ Eckel","phone":null,"time_zone":"Eastern Time (US & Canada)","created_at":"2021-04-09T13:23:58Z","updated_at":"2021-04-09T13:31:00Z","last_login_at":"2021-05-10T09:14:20Z"},"created_at":"2021-04-09T13:23:58Z","updated_at":"2021-05-14T11:05:10Z","type":"support_agent"}'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:35 GMT
+- request:
+ method: get
+ uri: "/contact_fields?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:36 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 3536c6dc-607c-9c8b-bdc5-cf7c1f7b706a
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '100'
+ X-Ratelimit-Remaining:
+ - '94'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '44'
+ X-Trace-Id:
+ - 00-61ea67c31d8a5147658558f9f8a2557e-12962969cdf9f679-01
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"editable_in_signup":true,"id":80000766829,"name":"name","label":"Full
+ name","position":1,"required_for_agents":true,"type":"default_name","default":true,"customers_can_edit":true,"label_for_customers":"Full
+ name","required_for_customers":true,"displayed_for_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"editable_in_signup":false,"id":80000766830,"name":"job_title","label":"Title","position":2,"required_for_agents":false,"type":"default_job_title","default":true,"customers_can_edit":true,"label_for_customers":"Title","required_for_customers":false,"displayed_for_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"editable_in_signup":true,"id":80000766831,"name":"email","label":"Email","position":3,"required_for_agents":false,"type":"default_email","default":true,"customers_can_edit":false,"label_for_customers":"Email","required_for_customers":false,"displayed_for_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"editable_in_signup":false,"id":80000766832,"name":"phone","label":"Work
+ phone","position":4,"required_for_agents":false,"type":"default_phone","default":true,"customers_can_edit":true,"label_for_customers":"Work
+ phone","required_for_customers":false,"displayed_for_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"editable_in_signup":false,"id":80000766836,"name":"mobile","label":"Mobile
+ phone","position":5,"required_for_agents":false,"type":"default_mobile","default":true,"customers_can_edit":true,"label_for_customers":"Mobile
+ phone","required_for_customers":false,"displayed_for_customers":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000766837,"name":"twitter_id","label":"Twitter","position":6,"required_for_agents":false,"type":"default_twitter_id","default":true,"customers_can_edit":true,"label_for_customers":"Twitter","required_for_customers":false,"displayed_for_customers":true,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000766833,"name":"company_name","label":"Company","position":7,"required_for_agents":false,"type":"default_company_name","default":true,"customers_can_edit":false,"label_for_customers":"Company","required_for_customers":false,"displayed_for_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"editable_in_signup":false,"id":80000766838,"name":"address","label":"Address","position":8,"required_for_agents":false,"type":"default_address","default":true,"customers_can_edit":false,"label_for_customers":"Address","required_for_customers":false,"displayed_for_customers":false,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000766839,"name":"tag_names","label":"Tags","position":11,"required_for_agents":false,"type":"default_tag_names","default":true,"customers_can_edit":false,"label_for_customers":"Tags","required_for_customers":false,"displayed_for_customers":false,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000766840,"name":"description","label":"About","position":12,"required_for_agents":false,"type":"default_description","default":true,"customers_can_edit":false,"label_for_customers":"About","required_for_customers":false,"displayed_for_customers":false,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000766841,"name":"client_manager","label":"Can
+ see all tickets from this company","position":13,"required_for_agents":false,"type":"default_client_manager","default":true,"customers_can_edit":false,"label_for_customers":"Can
+ see all tickets from this company","required_for_customers":false,"displayed_for_customers":false,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000766843,"name":"twitter_profile_status","label":"Twitter
+ Verified Profile","position":14,"required_for_agents":false,"type":"default_twitter_profile_status","default":true,"customers_can_edit":false,"label_for_customers":"Twitter
+ Verified Profile","required_for_customers":false,"displayed_for_customers":false,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000766844,"name":"twitter_followers_count","label":"Twitter
+ Follower Count","position":15,"required_for_agents":false,"type":"default_twitter_followers_count","default":true,"customers_can_edit":false,"label_for_customers":"Twitter
+ Follower Count","required_for_customers":false,"displayed_for_customers":false,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z"},{"editable_in_signup":false,"id":80000776200,"name":"custom_dropdown","label":"custom_dropdown","position":16,"required_for_agents":false,"type":"custom_dropdown","default":false,"customers_can_edit":true,"label_for_customers":"custom_dropdown","required_for_customers":false,"displayed_for_customers":true,"created_at":"2021-04-12T20:19:46Z","updated_at":"2021-04-12T20:19:46Z","choices":["First
+ Choice","Second Choice"]}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:36 GMT
+- request:
+ method: get
+ uri: "/contacts?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:36 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 832c7d50-8d5b-49e1-8fcc-a366615750e5
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '39'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '99'
+ X-Trace-Id:
+ - 00-8da99813ec145b79029487efb5ceeccb-80d00df32726c095-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"active":false,"address":null,"description":null,"email":"bob.tree@freshdesk.com","id":80014400482,"job_title":null,"language":"en","mobile":null,"name":"Bob
+ Tree","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:01Z","updated_at":"2021-04-09T13:24:01Z","csat_rating":null,"preferred_source":"email","company_id":null},{"active":false,"address":null,"description":null,"email":"clboone@freshdesk.com","id":80014400496,"job_title":null,"language":"en","mobile":null,"name":"Clarice
+ Boone","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:04Z","updated_at":"2021-04-09T13:24:04Z","csat_rating":null,"preferred_source":"email","company_id":null},{"active":false,"address":"25,
+ Sispal Street, Upper east side, Manhattan","description":null,"email":"emily.dean@freshdesk.com","id":80014400494,"job_title":null,"language":"en","mobile":null,"name":"Emily
+ Dean","phone":"(257)-715-491","time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:04Z","updated_at":"2021-04-09T13:24:04Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"finchhoot1@freshdesk.com","id":80014400497,"job_title":null,"language":"en","mobile":null,"name":"Finch
+ Hoot","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:04Z","updated_at":"2021-04-09T13:24:04Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"james@freshdesk.com","id":80014400477,"job_title":null,"language":"en","mobile":null,"name":"James
+ Dean","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:00Z","updated_at":"2021-04-09T13:24:00Z","csat_rating":null,"preferred_source":"email","company_id":null},{"active":false,"address":null,"description":null,"email":"joe.mathew@freshdesk.com","id":80014400486,"job_title":null,"language":"en","mobile":null,"name":"Joe
+ Mathew","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:03Z","updated_at":"2021-04-09T13:24:03Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"john@freshdesk.com","id":80014400484,"job_title":null,"language":"en","mobile":null,"name":"John","phone":null,"time_zone":"Eastern
+ Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:02Z","updated_at":"2021-04-09T13:24:02Z","csat_rating":null,"preferred_source":"email","company_id":null},{"active":false,"address":"140,
+ Sinclair St, Brooklyn Heights","description":null,"email":"johnny.appleseed@freshdesk.com","id":80014400490,"job_title":null,"language":"en","mobile":null,"name":"Johnny
+ Appleseed","phone":"(123)-412-834","time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:03Z","updated_at":"2021-04-09T13:24:03Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"lewis.clarke@freshdesk.com","id":80014400491,"job_title":null,"language":"en","mobile":null,"name":"Lewis
+ Clarke","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:03Z","updated_at":"2021-04-09T13:24:03Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"soundofmusic@freshdesk.com","id":80014400493,"job_title":null,"language":"en","mobile":null,"name":"Maria
+ Von Trapp","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:03Z","updated_at":"2021-04-09T13:24:03Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"mark.colbert@freshdesk.com","id":80014400498,"job_title":null,"language":"en","mobile":null,"name":"Mark
+ Colbert","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:04Z","updated_at":"2021-04-09T13:24:04Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"matt.rogers@freshdesk.com","id":80014400481,"job_title":null,"language":"en","mobile":null,"name":"Matt
+ Rogers","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:01Z","updated_at":"2021-04-09T13:24:01Z","csat_rating":null,"preferred_source":"email","company_id":null},{"active":false,"address":null,"description":null,"email":"aroundtheworld80@freshdesk.com","id":80014400489,"job_title":null,"language":"en","mobile":null,"name":"Phileas
+ Fogg","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:03Z","updated_at":"2021-04-09T13:24:03Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"polly@freshdesk.com","id":80014400483,"job_title":null,"language":"en","mobile":null,"name":"Polly","phone":null,"time_zone":"Eastern
+ Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:01Z","updated_at":"2021-04-09T13:24:01Z","csat_rating":null,"preferred_source":"email","company_id":null},{"active":false,"address":null,"description":null,"email":"rachel@freshdesk.com","id":80014400478,"job_title":null,"language":"en","mobile":null,"name":"Rachel
+ Doe","phone":"1 866 832 3090","time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:00Z","updated_at":"2021-04-09T13:24:00Z","csat_rating":103,"preferred_source":"email","company_id":80000602705},{"active":false,"address":null,"description":null,"email":"sam.kart@freshdesk.com","id":80014400487,"job_title":null,"language":"en","mobile":null,"name":"Sam
+ Kart","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:24:03Z","updated_at":"2021-04-09T13:24:03Z","csat_rating":null,"preferred_source":null,"company_id":null},{"active":false,"address":null,"description":null,"email":"sam.ozzy@freshdesk.com","id":80014400819,"job_title":null,"language":"en","mobile":null,"name":"Sam
+ Osborne","phone":null,"time_zone":"Eastern Time (US & Canada)","twitter_id":null,"custom_fields":{"custom_dropdown":null},"facebook_id":null,"created_at":"2021-04-09T13:29:43Z","updated_at":"2021-04-09T13:29:43Z","csat_rating":103,"preferred_source":"phone","company_id":null}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:36 GMT
+- request:
+ method: get
+ uri: "/contacts?page=1&per_page=100&state=blocked"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:37 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 5429d92e-221e-4f1a-a728-30f3e7e3e801
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '38'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '76'
+ X-Trace-Id:
+ - 00-030b2bcae057b5d4ca0c3ec935e2b87d-52aea147495d5dab-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:37 GMT
+- request:
+ method: get
+ uri: "/contacts?page=1&per_page=100&state=deleted"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:37 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - ce900be5-8157-4c2c-8dd5-63e40292ffba
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '37'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '54'
+ X-Trace-Id:
+ - 00-ecbd1b620a9f571483359752a9b353b2-dac661d9263bf064-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:37 GMT
+- request:
+ method: get
+ uri: "/ticket_fields?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:37 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - fa06896f-3580-484d-b9da-67c14cbf5eda
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '100'
+ X-Ratelimit-Remaining:
+ - '90'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '59'
+ X-Trace-Id:
+ - 00-9542bc3bc70f45237be62eaa6706193e-c6bb2ab60fdf3c4b-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"id":80000554368,"name":"requester","label":"Search a requester","description":"Ticket
+ requester","position":1,"required_for_closure":false,"required_for_agents":true,"type":"default_requester","default":true,"customers_can_edit":true,"label_for_customers":"Requester","required_for_customers":true,"displayed_to_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z","portal_cc":false,"portal_cc_to":"company"},{"id":80000554369,"name":"subject","label":"Subject","description":"Ticket
+ subject","position":2,"required_for_closure":false,"required_for_agents":true,"type":"default_subject","default":true,"customers_can_edit":true,"label_for_customers":"Subject","required_for_customers":true,"displayed_to_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000554370,"name":"ticket_type","label":"Type","description":"Ticket
+ type","position":3,"required_for_closure":false,"required_for_agents":false,"type":"default_ticket_type","default":true,"customers_can_edit":false,"label_for_customers":"Type","required_for_customers":false,"displayed_to_customers":false,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z","choices":["Question","Incident","Problem","Feature
+ Request","Refunds and Returns","Bulk orders","Refund","Request"]},{"id":80000554371,"name":"source","label":"Source","description":"Ticket
+ source","position":4,"required_for_closure":false,"required_for_agents":false,"type":"default_source","default":true,"customers_can_edit":false,"label_for_customers":"Source","required_for_customers":false,"displayed_to_customers":false,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z","choices":{"Email":1,"Portal":2,"Phone":3,"Forum":4,"Twitter":5,"Facebook":6,"Chat":7,"MobiHelp":8,"Feedback
+ Widget":9,"Outbound Email":10,"Ecommerce":11,"Bot":12,"Whatsapp":13}},{"id":80000554372,"name":"status","label":"Status","description":"Ticket
+ status","position":5,"required_for_closure":false,"required_for_agents":true,"type":"default_status","default":true,"customers_can_edit":false,"label_for_customers":"Status","required_for_customers":false,"displayed_to_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z","choices":{"2":["Open","Being
+ Processed"],"3":["Pending","Awaiting your Reply"],"4":["Resolved","This ticket
+ has been Resolved"],"5":["Closed","This ticket has been Closed"],"6":["Waiting
+ on Customer","Awaiting your Reply"],"7":["Waiting on Third Party","Being Processed"]}},{"id":80000554373,"name":"priority","label":"Priority","description":"Ticket
+ priority","position":6,"required_for_closure":false,"required_for_agents":true,"type":"default_priority","default":true,"customers_can_edit":false,"label_for_customers":"Priority","required_for_customers":false,"displayed_to_customers":false,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z","choices":{"Low":1,"Medium":2,"High":3,"Urgent":4}},{"id":80000554374,"name":"group","label":"Group","description":"Ticket
+ group","position":7,"required_for_closure":false,"required_for_agents":false,"type":"default_group","default":true,"customers_can_edit":false,"label_for_customers":"Group","required_for_customers":false,"displayed_to_customers":false,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z","choices":{"Account
+ managers":80000374754,"Billing":80000374717,"Customer Support":80000374751,"Development":80000374753,"Escalations":80000374718,"Login
+ and security":80000374752,"Product Management":80000374714,"QA":80000374715,"Sales":80000374716}},{"id":80000554375,"name":"agent","label":"Agent","description":"Agent","position":8,"required_for_closure":false,"required_for_agents":false,"type":"default_agent","default":true,"customers_can_edit":false,"label_for_customers":"Assigned
+ to","required_for_customers":false,"displayed_to_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z","choices":{"Thorsten
+ Eckel":80014400475}},{"id":80000554377,"name":"description","label":"Description","description":"Ticket
+ description","position":10,"required_for_closure":false,"required_for_agents":true,"type":"default_description","default":true,"customers_can_edit":true,"label_for_customers":"Description","required_for_customers":true,"displayed_to_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000554378,"name":"company","label":"Company","description":"Ticket
+ Company","position":11,"required_for_closure":false,"required_for_agents":true,"type":"default_company","default":true,"customers_can_edit":true,"label_for_customers":"Company","required_for_customers":true,"displayed_to_customers":true,"created_at":"2021-04-09T13:23:59Z","updated_at":"2021-04-09T13:23:59Z"},{"id":80000561221,"name":"cf_test_checkbox","label":"test_checkbox","description":null,"position":12,"required_for_closure":false,"required_for_agents":false,"type":"custom_checkbox","default":false,"customers_can_edit":true,"label_for_customers":"test_checkbox","required_for_customers":false,"displayed_to_customers":true,"created_at":"2021-04-12T20:48:08Z","updated_at":"2021-04-12T20:48:08Z"},{"id":80000561222,"name":"cf_custom_integer","label":"custom_integer","description":null,"position":13,"required_for_closure":false,"required_for_agents":false,"type":"custom_number","default":false,"customers_can_edit":true,"label_for_customers":"custom_integer","required_for_customers":false,"displayed_to_customers":true,"created_at":"2021-04-12T20:48:20Z","updated_at":"2021-04-12T20:48:20Z"},{"id":80000561223,"name":"cf_custom_dropdown","label":"custom_dropdown","description":null,"position":14,"required_for_closure":false,"required_for_agents":false,"type":"custom_dropdown","default":false,"customers_can_edit":true,"label_for_customers":"custom_dropdown","required_for_customers":false,"displayed_to_customers":true,"created_at":"2021-04-12T20:48:40Z","updated_at":"2021-04-12T20:48:40Z","choices":["key1","key2"]},{"id":80000561224,"name":"cf_custom_decimal","label":"custom_decimal","description":null,"position":15,"required_for_closure":false,"required_for_agents":false,"type":"custom_decimal","default":false,"customers_can_edit":true,"label_for_customers":"custom_decimal","required_for_customers":false,"displayed_to_customers":true,"created_at":"2021-04-12T20:48:50Z","updated_at":"2021-04-12T20:48:50Z"}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:37 GMT
+- request:
+ method: get
+ uri: "/tickets?order_type=asc&page=1&per_page=100&updated_since=1970-01-01"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:38 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 2815bcb5-f4b8-9203-ac34-b7b41f1f5919
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '39'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '94'
+ X-Trace-Id:
+ - 00-b6abb2b353cf824c8fef0142b22e2aa2-012fd945fa7ef303-01
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374751,"priority":1,"requester_id":80014400496,"responder_id":null,"source":1,"company_id":null,"status":3,"subject":"ogg
+ format seems to be off","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":8,"type":"Incident","due_by":"2021-04-14T13:29:43Z","fr_due_by":"2021-04-12T13:29:43Z","is_escalated":false,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T12:26:56Z","updated_at":"2021-04-09T12:29:56Z","associated_tickets_count":null,"tags":[]},{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374752,"priority":3,"requester_id":80014400819,"responder_id":null,"source":1,"company_id":null,"status":5,"subject":"Unable
+ to login","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":9,"type":"Problem","due_by":"2021-04-12T16:29:43Z","fr_due_by":"2021-04-09T17:29:43Z","is_escalated":false,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T12:32:56Z","updated_at":"2021-04-09T13:29:44Z","associated_tickets_count":null,"tags":[]},{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374753,"priority":1,"requester_id":80014400478,"responder_id":null,"source":1,"company_id":80000602705,"status":3,"subject":"Issue
+ with storage space","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":10,"type":"Request","due_by":"2021-04-14T13:29:44Z","fr_due_by":"2021-04-12T13:29:44Z","is_escalated":false,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T12:41:56Z","updated_at":"2021-04-09T12:44:56Z","associated_tickets_count":null,"tags":[]},{"cc_emails":null,"fwd_emails":null,"reply_cc_emails":null,"ticket_cc_emails":null,"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374717,"priority":4,"requester_id":80014400482,"responder_id":null,"source":1,"company_id":null,"status":3,"subject":"Cancelling
+ our account","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":11,"type":"Question","due_by":"2021-04-09T17:29:45Z","fr_due_by":"2021-04-09T14:29:45Z","is_escalated":false,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T12:47:56Z","updated_at":"2021-04-09T13:29:45Z","associated_tickets_count":null,"tags":[]},{"cc_emails":null,"fwd_emails":null,"reply_cc_emails":null,"ticket_cc_emails":null,"fr_escalated":true,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":3,"requester_id":80014400477,"responder_id":null,"source":1,"company_id":null,"status":2,"subject":"Payment
+ failed?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":1,"type":"Question","due_by":"2021-04-12T16:23:56Z","fr_due_by":"2021-04-09T17:23:56Z","is_escalated":true,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-13T10:59:50Z","associated_tickets_count":null,"tags":[]},{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":null,"priority":3,"requester_id":80014400478,"responder_id":null,"source":1,"company_id":80000602705,"status":5,"subject":"Mary
+ Jane shoes in Size 8?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":2,"type":"Question","due_by":"2021-04-13T08:24:00Z","fr_due_by":"2021-04-12T09:24:00Z","is_escalated":false,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-09T13:24:01Z","associated_tickets_count":null,"tags":[]},{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":1,"requester_id":80014400481,"responder_id":null,"source":9,"company_id":null,"status":2,"subject":"Vintage
+ table lamp - Out of stock?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":3,"type":"Question","due_by":"2021-04-14T13:23:56Z","fr_due_by":"2021-04-12T14:24:01Z","is_escalated":true,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-14T16:59:46Z","associated_tickets_count":null,"tags":[]},{"cc_emails":null,"fwd_emails":null,"reply_cc_emails":null,"ticket_cc_emails":null,"fr_escalated":true,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":4,"requester_id":80014400482,"responder_id":null,"source":1,"company_id":null,"status":2,"subject":"How
+ much time does it take to get my money back!????","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":4,"type":"Refunds
+ and Returns","due_by":"2021-04-09T17:23:56Z","fr_due_by":"2021-04-09T14:23:56Z","is_escalated":true,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-12T13:01:42Z","associated_tickets_count":null,"tags":[]},{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374717,"priority":3,"requester_id":80014400483,"responder_id":null,"source":1,"company_id":null,"status":3,"subject":"My
+ return was not picked up","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":5,"type":"Refunds
+ and Returns","due_by":"2021-04-13T08:24:08Z","fr_due_by":"2021-04-12T09:24:08Z","is_escalated":false,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-09T13:24:08Z","associated_tickets_count":null,"tags":[]},{"cc_emails":null,"fwd_emails":null,"reply_cc_emails":null,"ticket_cc_emails":null,"fr_escalated":true,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":2,"requester_id":80014400484,"responder_id":null,"source":1,"company_id":null,"status":2,"subject":"How
+ do I place a custom order?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":6,"type":"Bulk
+ orders","due_by":"2021-04-12T14:23:56Z","fr_due_by":"2021-04-12T12:23:56Z","is_escalated":true,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-12T17:59:53Z","associated_tickets_count":null,"tags":[]},{"cc_emails":null,"fwd_emails":null,"reply_cc_emails":null,"ticket_cc_emails":null,"fr_escalated":true,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":1,"requester_id":80014400481,"responder_id":null,"source":1,"company_id":null,"status":2,"subject":"How
+ can I get a refund for my order?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":7,"type":"Refunds
+ and Returns","due_by":"2021-04-14T13:23:56Z","fr_due_by":"2021-04-12T13:23:56Z","is_escalated":true,"custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-14T16:59:46Z","associated_tickets_count":null,"tags":[]},{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":true,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":1,"requester_id":80014400475,"responder_id":80014400475,"source":3,"company_id":null,"status":2,"subject":"test
+ example","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":12,"type":null,"due_by":"2021-04-15T21:00:00Z","fr_due_by":"2021-04-13T21:00:00Z","is_escalated":true,"custom_fields":{"cf_test_checkbox":true,"cf_custom_integer":999,"cf_custom_dropdown":"key2","cf_custom_decimal":"1.0"},"created_at":"2021-04-12T20:33:21Z","updated_at":"2021-04-15T23:59:43Z","associated_tickets_count":null,"tags":[]},{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":1,"requester_id":80014400819,"responder_id":80014400475,"source":3,"company_id":null,"status":2,"subject":"Inline
+ Images Failing?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":13,"type":null,"due_by":"2021-05-17T12:29:27Z","fr_due_by":"2021-05-15T12:29:27Z","is_escalated":false,"custom_fields":{"cf_test_checkbox":false,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-05-14T12:29:27Z","updated_at":"2021-05-17T15:02:00Z","associated_tickets_count":null,"tags":[]}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:38 GMT
+- request:
+ method: get
+ uri: "/tickets/8"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:38 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - ee87d71b-0eac-46fd-ad75-467ac483a59d
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '38'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '68'
+ X-Trace-Id:
+ - 00-a8c9c7ea68e79d1ffe253f4915553929-9574ce095631bae8-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374751,"priority":1,"requester_id":80014400496,"responder_id":null,"source":1,"company_id":null,"status":3,"subject":"ogg
+ format seems to be off","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":8,"type":"Incident","due_by":"2021-04-14T13:29:43Z","fr_due_by":"2021-04-12T13:29:43Z","is_escalated":false,"description":"Hi,
+ I tried uploading an .ogg file, to share it with my team. But the action failed?
+ Clarice Boone","description_text":"Hi,\n\nI tried uploading an .ogg file,
+ to share it with my team. But the action failed?\n\nClarice Boone","custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T12:26:56Z","updated_at":"2021-04-09T12:29:56Z","tags":[],"attachments":[],"source_additional_info":null}'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:38 GMT
+- request:
+ method: get
+ uri: "/tickets/8/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:38 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 4caf3020-fbaf-4085-8337-748d6d79599f
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '37'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '75'
+ X-Trace-Id:
+ - 00-5490e4a6d884dd0cadff1ab7dd4cb267-e4d511fb541bf930-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:38 GMT
+- request:
+ method: get
+ uri: "/tickets/8/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:39 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 34999fb8-df1c-41ef-9a89-aefba12928d6
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '36'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '83'
+ X-Trace-Id:
+ - 00-11fa6eeb94762da244f4276e2d53b7de-01db3cbc30e392bc-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ W3siYm9keSI6IjxkaXY+SGkgQ2xhcmljZSwgPGJyPjxicj4gV2XigJlyZSBzb3JyeSBidXQgd2UgZG8gbm90IHN1cHBvcnQgdGhlIC5vZ2cgZm9ybWF0LiBIb3dldmVyLCB5b3UgY2FuIGNvbnZlcnQgaXQgdG8gTVAzIGFuZCB1cGxvYWQgaXQuIFRoaXMgc2hvdWxkIGJlIGFuIGVhc3kgd29ya2Fyb3VuZCBmb3IgeW91Ljxicj48YnI+IElmIHlvdSBuZWVkIHNvbWUgbW9yZSBndWlkYW5jZSB3aXRoIHRoaXMsIGRvIGxldCB1cyBrbm93LiBXZeKAmXJlIGhlcmUgdG8gaGVscCB5b3UuIDxicj48YnI+IE1pY2hlYWwgPGJyPiBTYXVsJ3MgSW5jLjwvZGl2PiIsImJvZHlfdGV4dCI6IkhpIENsYXJpY2UsICAgIFdl4oCZcmUgc29ycnkgYnV0IHdlIGRvIG5vdCBzdXBwb3J0IHRoZSAub2dnIGZvcm1hdC4gSG93ZXZlciwgeW91IGNhbiBjb252ZXJ0IGl0IHRvIE1QMyBhbmQgdXBsb2FkIGl0LiBUaGlzIHNob3VsZCBiZSBhbiBlYXN5IHdvcmthcm91bmQgZm9yIHlvdS4gICBJZiB5b3UgbmVlZCBzb21lIG1vcmUgZ3VpZGFuY2Ugd2l0aCB0aGlzLCBkbyBsZXQgdXMga25vdy4gV2XigJlyZSBoZXJlIHRvIGhlbHAgeW91LiAgICBNaWNoZWFsICAgU2F1bCdzIEluYy4iLCJpZCI6ODAwMjAzNTA2ODgsImluY29taW5nIjpmYWxzZSwicHJpdmF0ZSI6ZmFsc2UsInVzZXJfaWQiOjgwMDE0NDAwNDgwLCJzdXBwb3J0X2VtYWlsIjoic3VwcG9ydEBuZXdhY2NvdW50MTYxNzk3NDYzNDc1Ni5mcmVzaGRlc2suY29tIiwic291cmNlIjowLCJjYXRlZ29yeSI6MywidG9fZW1haWxzIjpbImNsYm9vbmVAZnJlc2hkZXNrLmNvbSJdLCJmcm9tX2VtYWlsIjoic3VwcG9ydEBuZXdhY2NvdW50MTYxNzk3NDYzNDc1Ni5mcmVzaGRlc2suY29tIiwiY2NfZW1haWxzIjpbXSwiYmNjX2VtYWlscyI6W10sImVtYWlsX2ZhaWx1cmVfY291bnQiOm51bGwsIm91dGdvaW5nX2ZhaWx1cmVzIjpudWxsLCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMjoyOTo1NloiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyOTo0M1oiLCJhdHRhY2htZW50cyI6W10sImF1dG9fcmVzcG9uc2UiOmZhbHNlLCJ0aWNrZXRfaWQiOjgsInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9XQ==
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:39 GMT
+- request:
+ method: get
+ uri: "/tickets/9"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:39 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 269753eb-4526-44b4-8d54-895a6d2d83f4
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '35'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '70'
+ X-Trace-Id:
+ - 00-a54a4c7bca3f782e52b8b6171cc7c5bc-da3473ed54c38c42-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOltdLCJmd2RfZW1haWxzIjpbXSwicmVwbHlfY2NfZW1haWxzIjpbXSwidGlja2V0X2NjX2VtYWlscyI6W10sImZyX2VzY2FsYXRlZCI6ZmFsc2UsInNwYW0iOmZhbHNlLCJlbWFpbF9jb25maWdfaWQiOm51bGwsImdyb3VwX2lkIjo4MDAwMDM3NDc1MiwicHJpb3JpdHkiOjMsInJlcXVlc3Rlcl9pZCI6ODAwMTQ0MDA4MTksInJlc3BvbmRlcl9pZCI6bnVsbCwic291cmNlIjoxLCJjb21wYW55X2lkIjpudWxsLCJzdGF0dXMiOjUsInN1YmplY3QiOiJVbmFibGUgdG8gbG9naW4iLCJhc3NvY2lhdGlvbl90eXBlIjpudWxsLCJzdXBwb3J0X2VtYWlsIjpudWxsLCJ0b19lbWFpbHMiOm51bGwsInByb2R1Y3RfaWQiOm51bGwsImlkIjo5LCJ0eXBlIjoiUHJvYmxlbSIsImR1ZV9ieSI6IjIwMjEtMDQtMTJUMTY6Mjk6NDNaIiwiZnJfZHVlX2J5IjoiMjAyMS0wNC0wOVQxNzoyOTo0M1oiLCJpc19lc2NhbGF0ZWQiOmZhbHNlLCJkZXNjcmlwdGlvbiI6IkkgY2hhbmdlZCBteSBsb2dpbiBjcmVkZW50aWFscyBhbmQgbm93IEnigJltIG5vdCBhYmxlIHRvIGxvZ2luLiBDYW4geW91IGhlbHAgbWUgcmV0cmlldmUgbXkgYWNjb3VudD88YnI+PGJyPiBUaGFua3MsPGJyPiBTYW0gT3Nib3JuZSIsImRlc2NyaXB0aW9uX3RleHQiOiJJIGNoYW5nZWQgbXkgbG9naW4gY3JlZGVudGlhbHMgYW5kIG5vdyBJ4oCZbSBub3QgYWJsZSB0byBsb2dpbi4gQ2FuIHlvdSBoZWxwIG1lIHJldHJpZXZlIG15IGFjY291bnQ/XG5cblRoYW5rcyxcblNhbSBPc2Jvcm5lIiwiY3VzdG9tX2ZpZWxkcyI6eyJjZl90ZXN0X2NoZWNrYm94IjpudWxsLCJjZl9jdXN0b21faW50ZWdlciI6bnVsbCwiY2ZfY3VzdG9tX2Ryb3Bkb3duIjpudWxsLCJjZl9jdXN0b21fZGVjaW1hbCI6bnVsbH0sImNyZWF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEyOjMyOjU2WiIsInVwZGF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEzOjI5OjQ0WiIsInRhZ3MiOltdLCJhdHRhY2htZW50cyI6W10sInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:39 GMT
+- request:
+ method: get
+ uri: "/tickets/9/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:39 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 8db15ccb-277c-456b-aa2a-5237b602df09
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '34'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '49'
+ X-Trace-Id:
+ - 00-702c8991cc62f6e0fe71d5e0ecbc91f1-bbf7264b6dc5de7d-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:39 GMT
+- request:
+ method: get
+ uri: "/tickets/9/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:39 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - aa78cafc-903e-94e2-ae4c-cd7389705a18
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '33'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '63'
+ X-Trace-Id:
+ - 00-113a01f5cdbeb112f6ea167204ba497d-53b227bcfdb7cbcb-01
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ W3siYm9keSI6IjxkaXY+SGkgU2FtLDxicj48YnI+IEkgY2hlY2tlZCBvdXIgbG9ncyBhbmQgbG9va3MgbGlrZSB5b3UgaGF2ZW7igJl0IHZlcmlmaWVkIHRoZSBjaGFuZ2VzLjxicj48YnI+IENoZWNrIHlvdXIgbWFpbGJveCAodGhlIHVwZGF0ZWQgYWRkcmVzcyksIHlvdeKAmWxsIGZpbmQgb25lIGZyb20gdXMgd2l0aCB0aGUgc3ViamVjdCDigJxWZXJpZnkgeW91ciBlbWFpbOKAnSB3aXRoIGEgbGluayB0byB2ZXJpZnkgdGhlIG5ldyBlbWFpbCBhZGRyZXNzLiBZb3UgY2FuIHJlZmVyIHRvIG91ciBhcnRpY2xlIG9uIDxiPmNoYW5naW5nIGFjY291bnQgZGV0YWlsczwvYj4gZm9yIGZ1cnRoZXIgY2xhcml0eS4gSWYgeW91IGhhdmUgYW55IG90aGVyIGRvdWJ0cywgZmVlbCBmcmVlIHRvIHJlYWNoIG91dCB0byB1cy48YnI+PGJyPiBSaWNoYXJkIEdlcmU8YnI+IFNhdWwncyBJbmMuPC9kaXY+IiwiYm9keV90ZXh0IjoiSGkgU2FtLCAgIEkgY2hlY2tlZCBvdXIgbG9ncyBhbmQgbG9va3MgbGlrZSB5b3UgaGF2ZW7igJl0IHZlcmlmaWVkIHRoZSBjaGFuZ2VzLiAgIENoZWNrIHlvdXIgbWFpbGJveCAodGhlIHVwZGF0ZWQgYWRkcmVzcyksIHlvdeKAmWxsIGZpbmQgb25lIGZyb20gdXMgd2l0aCB0aGUgc3ViamVjdCDigJxWZXJpZnkgeW91ciBlbWFpbOKAnSB3aXRoIGEgbGluayB0byB2ZXJpZnkgdGhlIG5ldyBlbWFpbCBhZGRyZXNzLiBZb3UgY2FuIHJlZmVyIHRvIG91ciBhcnRpY2xlIG9uIGNoYW5naW5nIGFjY291bnQgZGV0YWlscyBmb3IgZnVydGhlciBjbGFyaXR5LiBJZiB5b3UgaGF2ZSBhbnkgb3RoZXIgZG91YnRzLCBmZWVsIGZyZWUgdG8gcmVhY2ggb3V0IHRvIHVzLiAgIFJpY2hhcmQgR2VyZSAgU2F1bCdzIEluYy4iLCJpZCI6ODAwMjAzNTA2OTIsImluY29taW5nIjpmYWxzZSwicHJpdmF0ZSI6ZmFsc2UsInVzZXJfaWQiOjgwMDE0NDAwNDgwLCJzdXBwb3J0X2VtYWlsIjoic3VwcG9ydEBuZXdhY2NvdW50MTYxNzk3NDYzNDc1Ni5mcmVzaGRlc2suY29tIiwic291cmNlIjowLCJjYXRlZ29yeSI6MywidG9fZW1haWxzIjpbInNhbS5venp5QGZyZXNoZGVzay5jb20iXSwiZnJvbV9lbWFpbCI6InN1cHBvcnRAbmV3YWNjb3VudDE2MTc5NzQ2MzQ3NTYuZnJlc2hkZXNrLmNvbSIsImNjX2VtYWlscyI6W10sImJjY19lbWFpbHMiOltdLCJlbWFpbF9mYWlsdXJlX2NvdW50IjpudWxsLCJvdXRnb2luZ19mYWlsdXJlcyI6bnVsbCwiY3JlYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTI6MzU6NTZaIiwidXBkYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTM6Mjk6NDRaIiwiYXR0YWNobWVudHMiOltdLCJhdXRvX3Jlc3BvbnNlIjpmYWxzZSwidGlja2V0X2lkIjo5LCJzb3VyY2VfYWRkaXRpb25hbF9pbmZvIjpudWxsfSx7ImJvZHkiOiI8ZGl2PkhleSwgbXkgYmFkLiBJIG1pc3NlZCB0aGUgZW1haWwuIEkgdmVyaWZpZWQgbXkgYWNjb3VudCwgYW5kIEnigJltIGFibGUgdG8gbG9naW4gaW4gbm93LiBUaGFuayB5b3Ugc28gbXVjaC48YnI+PGJyPiBTYW0gT3Nib3JuZTwvZGl2PiIsImJvZHlfdGV4dCI6IkhleSwgbXkgYmFkLiBJIG1pc3NlZCB0aGUgZW1haWwuIEkgdmVyaWZpZWQgbXkgYWNjb3VudCwgYW5kIEnigJltIGFibGUgdG8gbG9naW4gaW4gbm93LiBUaGFuayB5b3Ugc28gbXVjaC4gICBTYW0gT3Nib3JuZSIsImlkIjo4MDAyMDM1MDY5NywiaW5jb21pbmciOmZhbHNlLCJwcml2YXRlIjpmYWxzZSwidXNlcl9pZCI6ODAwMTQ0MDA4MTksInN1cHBvcnRfZW1haWwiOiJzdXBwb3J0QG5ld2FjY291bnQxNjE3OTc0NjM0NzU2LmZyZXNoZGVzay5jb20iLCJzb3VyY2UiOjAsImNhdGVnb3J5IjoxLCJ0b19lbWFpbHMiOlsic2FtLm96enlAZnJlc2hkZXNrLmNvbSJdLCJmcm9tX2VtYWlsIjoic3VwcG9ydEBuZXdhY2NvdW50MTYxNzk3NDYzNDc1Ni5mcmVzaGRlc2suY29tIiwiY2NfZW1haWxzIjpbXSwiYmNjX2VtYWlscyI6W10sImVtYWlsX2ZhaWx1cmVfY291bnQiOm51bGwsIm91dGdvaW5nX2ZhaWx1cmVzIjpudWxsLCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMjozODo1NloiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyOTo0NFoiLCJhdHRhY2htZW50cyI6W10sImF1dG9fcmVzcG9uc2UiOmZhbHNlLCJ0aWNrZXRfaWQiOjksInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9LHsiYm9keSI6IjxkaXY+PC9kaXY+IiwiYm9keV90ZXh0IjoiIiwiaWQiOjgwMDIwMzUwNzAxLCJpbmNvbWluZyI6dHJ1ZSwicHJpdmF0ZSI6ZmFsc2UsInVzZXJfaWQiOjgwMDE0NDAwODE5LCJzdXBwb3J0X2VtYWlsIjpudWxsLCJzb3VyY2UiOjYsImNhdGVnb3J5Ijo3LCJ0b19lbWFpbHMiOm51bGwsImZyb21fZW1haWwiOm51bGwsImNjX2VtYWlscyI6W10sImJjY19lbWFpbHMiOm51bGwsImVtYWlsX2ZhaWx1cmVfY291bnQiOm51bGwsIm91dGdvaW5nX2ZhaWx1cmVzIjpudWxsLCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyOTo0NFoiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyOTo0NFoiLCJhdHRhY2htZW50cyI6W10sImF1dG9fcmVzcG9uc2UiOmZhbHNlLCJ0aWNrZXRfaWQiOjksInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9XQ==
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:39 GMT
+- request:
+ method: get
+ uri: "/tickets/10"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:40 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - f0b710c0-74df-46a4-b1a9-540819679b37
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '32'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '69'
+ X-Trace-Id:
+ - 00-ad445b5d6f78e19384205185a42dab32-ac0ceb33be5a49e9-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374753,"priority":1,"requester_id":80014400478,"responder_id":null,"source":1,"company_id":80000602705,"status":3,"subject":"Issue
+ with storage space","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":10,"type":"Request","due_by":"2021-04-14T13:29:44Z","fr_due_by":"2021-04-12T13:29:44Z","is_escalated":false,"description":"Hi,
+ On the Classic plan, I feel like the storage space provided is too less. Is
+ it possible for us to pay some extra amount to buy more storage? Thanks,
+ Rachel Zane","description_text":"Hi,\n\nOn the Classic plan, I feel like the
+ storage space provided is too less. Is it possible for us to pay some extra
+ amount to buy more storage?\n\nThanks,\nRachel Zane","custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T12:41:56Z","updated_at":"2021-04-09T12:44:56Z","tags":[],"attachments":[],"source_additional_info":null}'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:40 GMT
+- request:
+ method: get
+ uri: "/tickets/10/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:40 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 3b1f89ce-aa96-47ff-98d6-28d4885da3c3
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '31'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '52'
+ X-Trace-Id:
+ - 00-ebe801516b0230ea2cae508f66b09399-6ae3ceb2f39ef1a6-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:40 GMT
+- request:
+ method: get
+ uri: "/tickets/10/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:40 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - '08cccaa2-9417-4b57-9021-c8c8dacde561'
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '30'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '65'
+ X-Trace-Id:
+ - 00-663e86fb6910f2606687d1f7b7e030ec-ff577f121111bf6f-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ W3siYm9keSI6IjxkaXY+SGkgUmFjaGVsLDxicj48YnI+IEnigJltIHNvcnJ5IGJ1dCB3ZSBkb27igJl0IGhhdmUgdGhpcyBvcHRpb24gYXMgb2YgeWV0LiBJdOKAmXMgc3RpbGwgaW4gdGhlIHBpcGVsaW5lLiBZb3XigJlsbCBiZSBzdXJlIHRvIGtub3cgb25jZSB3ZSByb2xsIHRoaXMgb3V0LiA6KSA8YnI+PGJyPiBUaGFua3MsPGJyPiBOb3JtYW48YnI+IFNhdWwncyBJbmM8L2Rpdj4iLCJib2R5X3RleHQiOiJIaSBSYWNoZWwsICAgSeKAmW0gc29ycnkgYnV0IHdlIGRvbuKAmXQgaGF2ZSB0aGlzIG9wdGlvbiBhcyBvZiB5ZXQuIEl04oCZcyBzdGlsbCBpbiB0aGUgcGlwZWxpbmUuIFlvdeKAmWxsIGJlIHN1cmUgdG8ga25vdyBvbmNlIHdlIHJvbGwgdGhpcyBvdXQuIDopICAgIFRoYW5rcywgIE5vcm1hbiAgU2F1bCdzIEluYyIsImlkIjo4MDAyMDM1MDcwNywiaW5jb21pbmciOmZhbHNlLCJwcml2YXRlIjpmYWxzZSwidXNlcl9pZCI6ODAwMTQ0MDA0ODAsInN1cHBvcnRfZW1haWwiOiJzdXBwb3J0QG5ld2FjY291bnQxNjE3OTc0NjM0NzU2LmZyZXNoZGVzay5jb20iLCJzb3VyY2UiOjAsImNhdGVnb3J5IjozLCJ0b19lbWFpbHMiOlsicmFjaGVsQGZyZXNoZGVzay5jb20iXSwiZnJvbV9lbWFpbCI6InN1cHBvcnRAbmV3YWNjb3VudDE2MTc5NzQ2MzQ3NTYuZnJlc2hkZXNrLmNvbSIsImNjX2VtYWlscyI6W10sImJjY19lbWFpbHMiOltdLCJlbWFpbF9mYWlsdXJlX2NvdW50IjpudWxsLCJvdXRnb2luZ19mYWlsdXJlcyI6bnVsbCwiY3JlYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTI6NDQ6NTZaIiwidXBkYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTM6Mjk6NDVaIiwiYXR0YWNobWVudHMiOltdLCJhdXRvX3Jlc3BvbnNlIjpmYWxzZSwidGlja2V0X2lkIjoxMCwic291cmNlX2FkZGl0aW9uYWxfaW5mbyI6bnVsbH1d
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:40 GMT
+- request:
+ method: get
+ uri: "/tickets/11"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:41 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 97d20ed9-8abf-4840-99c4-66f90d8bd83a
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '29'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '94'
+ X-Trace-Id:
+ - 00-28a09a65561379c6880dd4d1c621ecc9-954cfe36b5d9a814-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOm51bGwsImZ3ZF9lbWFpbHMiOm51bGwsInJlcGx5X2NjX2VtYWlscyI6bnVsbCwidGlja2V0X2NjX2VtYWlscyI6bnVsbCwiZnJfZXNjYWxhdGVkIjpmYWxzZSwic3BhbSI6ZmFsc2UsImVtYWlsX2NvbmZpZ19pZCI6bnVsbCwiZ3JvdXBfaWQiOjgwMDAwMzc0NzE3LCJwcmlvcml0eSI6NCwicmVxdWVzdGVyX2lkIjo4MDAxNDQwMDQ4MiwicmVzcG9uZGVyX2lkIjpudWxsLCJzb3VyY2UiOjEsImNvbXBhbnlfaWQiOm51bGwsInN0YXR1cyI6Mywic3ViamVjdCI6IkNhbmNlbGxpbmcgb3VyIGFjY291bnQiLCJhc3NvY2lhdGlvbl90eXBlIjpudWxsLCJzdXBwb3J0X2VtYWlsIjpudWxsLCJ0b19lbWFpbHMiOm51bGwsInByb2R1Y3RfaWQiOm51bGwsImlkIjoxMSwidHlwZSI6IlF1ZXN0aW9uIiwiZHVlX2J5IjoiMjAyMS0wNC0wOVQxNzoyOTo0NVoiLCJmcl9kdWVfYnkiOiIyMDIxLTA0LTA5VDE0OjI5OjQ1WiIsImlzX2VzY2FsYXRlZCI6ZmFsc2UsImRlc2NyaXB0aW9uIjoiSGVsbG8gdGVhbSwgPGJyPjxicj4gV2XigJlkIGxpa2UgdG8gY2FuY2VsIG91ciBhY2NvdW50LiBXZeKAmXJlIG1vdmluZyBvbiB0byBhbm90aGVyIGFwcGxpY2F0aW9uLiBJdCB3b3VsZCBiZSBncmVhdCBpZiB5b3UgY291bGQgaGF2ZSBzb21lb25lIGhlbHAgdXMgb3V0IHdpdGggcmVmdW5kaW5nIG91ciB1bnVzZWQgaG91cnM/IDxicj48YnI+IE9uIGEgc2lkZSBub3RlLCB5b3UgZ3V5cyBoYXZlIGJlZW4gdHJlbWVuZG91cy4gVGhhbmsgeW91IGZvciB5b3VyIHN1cHBvcnQuPGJyPjxicj4gVGhhbmtzPGJyPiBCb2IgVHJlZSIsImRlc2NyaXB0aW9uX3RleHQiOiJIZWxsbyB0ZWFtLFxuXG5XZeKAmWQgbGlrZSB0byBjYW5jZWwgb3VyIGFjY291bnQuIFdl4oCZcmUgbW92aW5nIG9uIHRvIGFub3RoZXIgYXBwbGljYXRpb24uIEl0IHdvdWxkIGJlIGdyZWF0IGlmIHlvdSBjb3VsZCBoYXZlIHNvbWVvbmUgaGVscCB1cyBvdXQgd2l0aCByZWZ1bmRpbmcgb3VyIHVudXNlZCBob3Vycz9cblxuT24gYSBzaWRlIG5vdGUsIHlvdSBndXlzIGhhdmUgYmVlbiB0cmVtZW5kb3VzLiBUaGFuayB5b3UgZm9yIHlvdXIgc3VwcG9ydC5cblxuVGhhbmtzXG5Cb2IgVHJlZSIsImN1c3RvbV9maWVsZHMiOnsiY2ZfdGVzdF9jaGVja2JveCI6bnVsbCwiY2ZfY3VzdG9tX2ludGVnZXIiOm51bGwsImNmX2N1c3RvbV9kcm9wZG93biI6bnVsbCwiY2ZfY3VzdG9tX2RlY2ltYWwiOm51bGx9LCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMjo0Nzo1NloiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyOTo0NVoiLCJ0YWdzIjpbXSwiYXR0YWNobWVudHMiOltdLCJzb3VyY2VfYWRkaXRpb25hbF9pbmZvIjpudWxsfQ==
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:41 GMT
+- request:
+ method: get
+ uri: "/tickets/11/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:41 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - a2b98098-7a58-47f8-acbd-d7b03c8a077d
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '28'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '58'
+ X-Trace-Id:
+ - 00-d911d6b249da029b22984de556399569-48a6e5a48d4072b2-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:41 GMT
+- request:
+ method: get
+ uri: "/tickets/11/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:41 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 7f77dafa-27d6-470b-a63e-b5b472e7d977
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '27'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '65'
+ X-Trace-Id:
+ - 00-826aa8e573d5eb1aa98fbf19d64956df-f5832002514dcea1-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ W3siYm9keSI6IjxkaXY+SGkgQm9iLDxicj48YnI+IFdl4oCZbGwgaGF2ZSB5b3VyIGFjY291bnQgbWFuYWdlciBnZXQgaW4gdG91Y2ggd2l0aCB5b3Ugc2hvcnRseS4gOik8YnI+PGJyPiBIb3dldmVyLCBpdOKAmXMgc2FkIHRvIGtub3cgdGhhdCB5b3XigJlyZSBsZWF2aW5nIHVzLiA6KCA8YnI+PGJyPiBEbyBsZXQgdXMga25vdyBpZiB3ZSBjYW4gaGVscCBpbiBhbnl3YXkuIDxicj48YnI+IE1pY2hhZWw8YnI+IFNhdWwncyBJbmMuPC9kaXY+IiwiYm9keV90ZXh0IjoiSGkgQm9iLCAgIFdl4oCZbGwgaGF2ZSB5b3VyIGFjY291bnQgbWFuYWdlciBnZXQgaW4gdG91Y2ggd2l0aCB5b3Ugc2hvcnRseS4gOikgICBIb3dldmVyLCBpdOKAmXMgc2FkIHRvIGtub3cgdGhhdCB5b3XigJlyZSBsZWF2aW5nIHVzLiA6KCAgICBEbyBsZXQgdXMga25vdyBpZiB3ZSBjYW4gaGVscCBpbiBhbnl3YXkuICAgIE1pY2hhZWwgIFNhdWwncyBJbmMuIiwiaWQiOjgwMDIwMzUwNzEyLCJpbmNvbWluZyI6ZmFsc2UsInByaXZhdGUiOmZhbHNlLCJ1c2VyX2lkIjo4MDAxNDQwMDQ4MCwic3VwcG9ydF9lbWFpbCI6InN1cHBvcnRAbmV3YWNjb3VudDE2MTc5NzQ2MzQ3NTYuZnJlc2hkZXNrLmNvbSIsInNvdXJjZSI6MCwiY2F0ZWdvcnkiOjMsInRvX2VtYWlscyI6WyJib2IudHJlZUBmcmVzaGRlc2suY29tIl0sImZyb21fZW1haWwiOiJzdXBwb3J0QG5ld2FjY291bnQxNjE3OTc0NjM0NzU2LmZyZXNoZGVzay5jb20iLCJjY19lbWFpbHMiOltdLCJiY2NfZW1haWxzIjpbXSwiZW1haWxfZmFpbHVyZV9jb3VudCI6bnVsbCwib3V0Z29pbmdfZmFpbHVyZXMiOm51bGwsImNyZWF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEyOjUwOjU2WiIsInVwZGF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEzOjI5OjQ1WiIsImF0dGFjaG1lbnRzIjpbXSwiYXV0b19yZXNwb25zZSI6ZmFsc2UsInRpY2tldF9pZCI6MTEsInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9XQ==
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:41 GMT
+- request:
+ method: get
+ uri: "/tickets/1"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:42 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 40cfe06f-6683-4e89-a3ca-df662ba11517
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '26'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '73'
+ X-Trace-Id:
+ - 00-2bf17cb50f3d6c9ea7d1f1dacc069fdb-89cb0dbe5ac6598c-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOm51bGwsImZ3ZF9lbWFpbHMiOm51bGwsInJlcGx5X2NjX2VtYWlscyI6bnVsbCwidGlja2V0X2NjX2VtYWlscyI6bnVsbCwiZnJfZXNjYWxhdGVkIjp0cnVlLCJzcGFtIjpmYWxzZSwiZW1haWxfY29uZmlnX2lkIjpudWxsLCJncm91cF9pZCI6ODAwMDAzNzQ3MTgsInByaW9yaXR5IjozLCJyZXF1ZXN0ZXJfaWQiOjgwMDE0NDAwNDc3LCJyZXNwb25kZXJfaWQiOm51bGwsInNvdXJjZSI6MSwiY29tcGFueV9pZCI6bnVsbCwic3RhdHVzIjoyLCJzdWJqZWN0IjoiUGF5bWVudCBmYWlsZWQ/IiwiYXNzb2NpYXRpb25fdHlwZSI6bnVsbCwic3VwcG9ydF9lbWFpbCI6bnVsbCwidG9fZW1haWxzIjpudWxsLCJwcm9kdWN0X2lkIjpudWxsLCJpZCI6MSwidHlwZSI6IlF1ZXN0aW9uIiwiZHVlX2J5IjoiMjAyMS0wNC0xMlQxNjoyMzo1NloiLCJmcl9kdWVfYnkiOiIyMDIxLTA0LTA5VDE3OjIzOjU2WiIsImlzX2VzY2FsYXRlZCI6dHJ1ZSwiZGVzY3JpcHRpb24iOiJIZWxsbyB0aGVyZSw8YnI+PGJyPiBXaGVuIEkgdHJpZWQgdG8gbWFrZSB0aGUgcGF5bWVudCwgSSBrZXB0IGdldHRpbmcgdGhlIHNhbWUgbWVzc2FnZSDigJxZb3VyIHBheW1lbnQgZmFpbGVk4oCdIChJ4oCZdmUgYXR0YWNoZWQgYSBzY3JlZW5zaG90KS4gQnV0IEkgaGF2ZSBiZWVuIGNoYXJnZWQgYWxyZWFkeSBmb3IgaXQuIDxicj4gQ2FuIHlvdSBoZWxwIG1lIGdldCBhIHJlZnVuZD8gPGJyPiA8aW1nIHNyYyA9ICdodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXNzZXRzLmZyZXNocG8uY29tL3NhbXBsZV9kYXRhL1BheW1lbnRGYWlsZWQucG5nJz4gVGhhbmtzPGJyPiBKYW1lcyIsImRlc2NyaXB0aW9uX3RleHQiOiJIZWxsbyB0aGVyZSxcblxuV2hlbiBJIHRyaWVkIHRvIG1ha2UgdGhlIHBheW1lbnQsIEkga2VwdCBnZXR0aW5nIHRoZSBzYW1lIG1lc3NhZ2Ug4oCcWW91ciBwYXltZW50IGZhaWxlZOKAnSAoSeKAmXZlIGF0dGFjaGVkIGEgc2NyZWVuc2hvdCkuIEJ1dCBJIGhhdmUgYmVlbiBjaGFyZ2VkIGFscmVhZHkgZm9yIGl0LlxuQ2FuIHlvdSBoZWxwIG1lIGdldCBhIHJlZnVuZD9cblRoYW5rc1xuSmFtZXMiLCJjdXN0b21fZmllbGRzIjp7ImNmX3Rlc3RfY2hlY2tib3giOm51bGwsImNmX2N1c3RvbV9pbnRlZ2VyIjpudWxsLCJjZl9jdXN0b21fZHJvcGRvd24iOm51bGwsImNmX2N1c3RvbV9kZWNpbWFsIjpudWxsfSwiY3JlYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTM6MjM6NTZaIiwidXBkYXRlZF9hdCI6IjIwMjEtMDQtMTNUMTA6NTk6NTBaIiwidGFncyI6W10sImF0dGFjaG1lbnRzIjpbXSwic291cmNlX2FkZGl0aW9uYWxfaW5mbyI6bnVsbH0=
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:41 GMT
+- request:
+ method: get
+ uri: "/tickets/1/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:42 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 7e0f139a-e45c-450f-8793-2d746039f9da
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '25'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '56'
+ X-Trace-Id:
+ - 00-0a2b1c19b235ddee31f4aab7e203be46-2f66ce76e8d5d32a-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:42 GMT
+- request:
+ method: get
+ uri: "/tickets/1/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:42 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 3eda9a01-c343-4bbc-880f-44694e26391b
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '24'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '51'
+ X-Trace-Id:
+ - 00-5c72fe120e70ac68c9242a33044ad49f-e933765d64048631-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:42 GMT
+- request:
+ method: get
+ uri: "/tickets/2"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:42 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 7c06bf76-379f-4c89-9acf-316c97bcf937
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '23'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '62'
+ X-Trace-Id:
+ - 00-88021db29e528914ae3ba9ca8e4651f1-528aafa6d5b45bba-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOltdLCJmd2RfZW1haWxzIjpbXSwicmVwbHlfY2NfZW1haWxzIjpbXSwidGlja2V0X2NjX2VtYWlscyI6W10sImZyX2VzY2FsYXRlZCI6ZmFsc2UsInNwYW0iOmZhbHNlLCJlbWFpbF9jb25maWdfaWQiOm51bGwsImdyb3VwX2lkIjpudWxsLCJwcmlvcml0eSI6MywicmVxdWVzdGVyX2lkIjo4MDAxNDQwMDQ3OCwicmVzcG9uZGVyX2lkIjpudWxsLCJzb3VyY2UiOjEsImNvbXBhbnlfaWQiOjgwMDAwNjAyNzA1LCJzdGF0dXMiOjUsInN1YmplY3QiOiJNYXJ5IEphbmUgc2hvZXMgaW4gU2l6ZSA4PyIsImFzc29jaWF0aW9uX3R5cGUiOm51bGwsInN1cHBvcnRfZW1haWwiOm51bGwsInRvX2VtYWlscyI6bnVsbCwicHJvZHVjdF9pZCI6bnVsbCwiaWQiOjIsInR5cGUiOiJRdWVzdGlvbiIsImR1ZV9ieSI6IjIwMjEtMDQtMTNUMDg6MjQ6MDBaIiwiZnJfZHVlX2J5IjoiMjAyMS0wNC0xMlQwOToyNDowMFoiLCJpc19lc2NhbGF0ZWQiOmZhbHNlLCJkZXNjcmlwdGlvbiI6IjxwPkhlbGxvIHRoZXJlLDwvcD48YnIgLz48cD5J4oCZbSBsb29raW5nIHRvIGJ1eSBhIHBhaXIgb2YgTWFyeSBKYW5lIHNob2VzIGFuZCBJIG5vdGljZWQgdGhhdCB5b3UgaGF2ZSBhIGxvY2FsIHN0b3JlIGluIEFsZG92aWEuIENvdWxkIHlvdSBsZXQgbWUga25vdyBpZiB0aGUgTWFyeSBKYW5lIHNob2VzIGFyZSBhdmFpbGFibGUgaW4gU2l6ZSA4PyBJIGNhbiBwaWNrIGl0IHVwIGZyb20gdGhlcmUuPC9wPjxiciAvPjxwPlRoYW5rcyxcbjxiciAvPkVtaWx5LjwvcD4iLCJkZXNjcmlwdGlvbl90ZXh0IjoiSGVsbG8gdGhlcmUsXG5cblxuSeKAmW0gbG9va2luZyB0byBidXkgYSBwYWlyIG9mIE1hcnkgSmFuZSBzaG9lcyBhbmQgSSBub3RpY2VkIHRoYXQgeW91IGhhdmUgYSBsb2NhbCBzdG9yZSBpbiBBbGRvdmlhLiBDb3VsZCB5b3UgbGV0IG1lIGtub3cgaWYgdGhlIE1hcnkgSmFuZSBzaG9lcyBhcmUgYXZhaWxhYmxlIGluIFNpemUgOD8gSSBjYW4gcGljayBpdCB1cCBmcm9tIHRoZXJlLlxuXG5cblRoYW5rcyxcbkVtaWx5LiIsImN1c3RvbV9maWVsZHMiOnsiY2ZfdGVzdF9jaGVja2JveCI6bnVsbCwiY2ZfY3VzdG9tX2ludGVnZXIiOm51bGwsImNmX2N1c3RvbV9kcm9wZG93biI6bnVsbCwiY2ZfY3VzdG9tX2RlY2ltYWwiOm51bGx9LCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyMzo1NloiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyNDowMVoiLCJ0YWdzIjpbXSwiYXR0YWNobWVudHMiOltdLCJzb3VyY2VfYWRkaXRpb25hbF9pbmZvIjpudWxsfQ==
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:42 GMT
+- request:
+ method: get
+ uri: "/tickets/2/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:43 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 41f76ddb-e235-4d53-8b57-0a2718bc3391
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '22'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '48'
+ X-Trace-Id:
+ - 00-3c980018c5223e200ac0ace62624c38a-db5b3be2c2e42744-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:42 GMT
+- request:
+ method: get
+ uri: "/tickets/2/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:43 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 635cb374-a015-43b8-8349-7320904a4e5f
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '21'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '62'
+ X-Trace-Id:
+ - 00-0b3dfc928201a5bbdcf32a91e0ae99c4-d9ea2e3214bb06f5-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ W3siYm9keSI6IjxkaXY+SGV5IEVtaWx5LDwvZGl2PlxuPGJyPjxkaXY+VGhhbmtzIGZvciB3cml0aW5nIHRvIHVzIVxuPGJyPkkgY2FuIGNvbmZpcm0gdGhhdCBvdXIgQWxkb3ZpYSBzdG9yZSBkb2VzIGhhdmUgdGhlIE1hcnkgSmFuZSBzaG9lcyBpbiBzaXplIDguIEnigJl2ZSBhc2tlZCB0aGVtIHRvIGJsb2NrIGEgcGFpciBmb3IgeW91LiBGZWVsIGZyZWUgdG8gcGljayB0aGVtIHVwIGFueXRpbWUgOik8L2Rpdj5cbjxicj48ZGl2PkNoZWVycyxcbjxicj5SZWJlY2NhLjwvZGl2PlxuPGJyPjxkaXY+PC9kaXY+XG48aHI+XG48ZGl2PjwvZGl2PlxuPGRpdj5QLlMuIFRoaXMgaXMgYSBzYW1wbGUgZW1haWwgdGhhdOKAmXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIHRpY2tldCBieSBGcmVzaGRlc2suIDxhIGhyZWY9XCJodHRwczovL3N1cHBvcnQuZnJlc2hkZXNrLmNvbS9zdXBwb3J0L3NvbHV0aW9ucy9hcnRpY2xlcy8zNzU0MS1mb3J3YXJkLWFuZC1jb252ZXJ0LXlvdXItc3VwcG9ydC1lbWFpbHMtdG8tdGlja2V0cy1pbi1mcmVzaGRlc2tcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCI+U2VlIGhvdyB5b3UgY2FuIHN0YXJ0IGNvbnZlcnRpbmcgZW1haWw8L2E+IGZyb20gY3VzdG9tZXJzIGludG8gdGlja2V0cyBpbiB5b3VyIGhlbHBkZXNrLjwvZGl2PiIsImJvZHlfdGV4dCI6IkhleSBFbWlseSwgICBUaGFua3MgZm9yIHdyaXRpbmcgdG8gdXMhXG4gSSBjYW4gY29uZmlybSB0aGF0IG91ciBBbGRvdmlhIHN0b3JlIGRvZXMgaGF2ZSB0aGUgTWFyeSBKYW5lIHNob2VzIGluIHNpemUgOC4gSeKAmXZlIGFza2VkIHRoZW0gdG8gYmxvY2sgYSBwYWlyIGZvciB5b3UuIEZlZWwgZnJlZSB0byBwaWNrIHRoZW0gdXAgYW55dGltZSA6KSAgIENoZWVycyxcbiBSZWJlY2NhLiAgICAgIFAuUy4gVGhpcyBpcyBhIHNhbXBsZSBlbWFpbCB0aGF04oCZcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgdGlja2V0IGJ5IEZyZXNoZGVzay4gU2VlIGhvdyB5b3UgY2FuIHN0YXJ0IGNvbnZlcnRpbmcgZW1haWwgZnJvbSBjdXN0b21lcnMgaW50byB0aWNrZXRzIGluIHlvdXIgaGVscGRlc2suIiwiaWQiOjgwMDIwMzQ5NDUwLCJpbmNvbWluZyI6ZmFsc2UsInByaXZhdGUiOmZhbHNlLCJ1c2VyX2lkIjo4MDAxNDQwMDQ4MCwic3VwcG9ydF9lbWFpbCI6InN1cHBvcnRAbmV3YWNjb3VudDE2MTc5NzQ2MzQ3NTYuZnJlc2hkZXNrLmNvbSIsInNvdXJjZSI6MCwiY2F0ZWdvcnkiOjMsInRvX2VtYWlscyI6WyJyYWNoZWxAZnJlc2hkZXNrLmNvbSJdLCJmcm9tX2VtYWlsIjoic3VwcG9ydEBuZXdhY2NvdW50MTYxNzk3NDYzNDc1Ni5mcmVzaGRlc2suY29tIiwiY2NfZW1haWxzIjpbXSwiYmNjX2VtYWlscyI6W10sImVtYWlsX2ZhaWx1cmVfY291bnQiOm51bGwsIm91dGdvaW5nX2ZhaWx1cmVzIjpudWxsLCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyMzo1NloiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyNDowMVoiLCJhdHRhY2htZW50cyI6W10sImF1dG9fcmVzcG9uc2UiOmZhbHNlLCJ0aWNrZXRfaWQiOjIsInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9LHsiYm9keSI6IjxkaXY+PC9kaXY+IiwiYm9keV90ZXh0IjoiIiwiaWQiOjgwMDIwMzQ5NDUyLCJpbmNvbWluZyI6dHJ1ZSwicHJpdmF0ZSI6ZmFsc2UsInVzZXJfaWQiOjgwMDE0NDAwNDc4LCJzdXBwb3J0X2VtYWlsIjpudWxsLCJzb3VyY2UiOjYsImNhdGVnb3J5Ijo3LCJ0b19lbWFpbHMiOm51bGwsImZyb21fZW1haWwiOm51bGwsImNjX2VtYWlscyI6W10sImJjY19lbWFpbHMiOm51bGwsImVtYWlsX2ZhaWx1cmVfY291bnQiOm51bGwsIm91dGdvaW5nX2ZhaWx1cmVzIjpudWxsLCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyNDowMVoiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyNDowMVoiLCJhdHRhY2htZW50cyI6W10sImF1dG9fcmVzcG9uc2UiOmZhbHNlLCJ0aWNrZXRfaWQiOjIsInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9XQ==
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:43 GMT
+- request:
+ method: get
+ uri: "/tickets/3"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:43 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - f9aa758c-e375-44ec-aa3a-7b5c8811801c
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '20'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '72'
+ X-Trace-Id:
+ - 00-e04dace543dc190b3e0eb907fa61f66d-387c9f8ddfe23f05-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOltdLCJmd2RfZW1haWxzIjpbXSwicmVwbHlfY2NfZW1haWxzIjpbXSwidGlja2V0X2NjX2VtYWlscyI6W10sImZyX2VzY2FsYXRlZCI6ZmFsc2UsInNwYW0iOmZhbHNlLCJlbWFpbF9jb25maWdfaWQiOm51bGwsImdyb3VwX2lkIjo4MDAwMDM3NDcxOCwicHJpb3JpdHkiOjEsInJlcXVlc3Rlcl9pZCI6ODAwMTQ0MDA0ODEsInJlc3BvbmRlcl9pZCI6bnVsbCwic291cmNlIjo5LCJjb21wYW55X2lkIjpudWxsLCJzdGF0dXMiOjIsInN1YmplY3QiOiJWaW50YWdlIHRhYmxlIGxhbXAgLSBPdXQgb2Ygc3RvY2s/IiwiYXNzb2NpYXRpb25fdHlwZSI6bnVsbCwic3VwcG9ydF9lbWFpbCI6bnVsbCwidG9fZW1haWxzIjpudWxsLCJwcm9kdWN0X2lkIjpudWxsLCJpZCI6MywidHlwZSI6IlF1ZXN0aW9uIiwiZHVlX2J5IjoiMjAyMS0wNC0xNFQxMzoyMzo1NloiLCJmcl9kdWVfYnkiOiIyMDIxLTA0LTEyVDE0OjI0OjAxWiIsImlzX2VzY2FsYXRlZCI6dHJ1ZSwiZGVzY3JpcHRpb24iOiI8cD5IZWxsbyw8L3A+PGJyIC8+PHA+SSBzYXcgYSB2aW50YWdlIHRhYmxlIGxhbXAgb24geW91ciBzaXRlIGxhc3QgbW9udGggYW5kIEnigJlkIGJvb2ttYXJrZWQgaXQgdG8gYnV5IGl0IGxhdGVyIGZvciBhIGZyaWVuZC4gSSBjYW7igJl0IHNlZW0gdG8gZmluZCBpdCBhbnltb3JlIHRob3VnaC4gSXMgaXQgb3V0IG9mIHN0b2NrIG9yIGRvIHlvdSBub3Qgc2VsbCB0aG9zZSBhbnltb3JlPzwvcD48YnIgLz48cD5UaGFua3MsXG48YnIgLz5NYXR0LjwvcD48cD48aHI+PC9wPjxwPlAuUy4gVGhpcyBpcyBhIHNhbXBsZSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gc2VudCB0byB5b3UgZnJvbSB3ZWJzaXRlIHBhZ2UuIDxhIGhyZWYgPSBodHRwczovL3N1cHBvcnQuZnJlc2hkZXNrLmNvbS9zdXBwb3J0L3NvbHV0aW9ucy9hcnRpY2xlcy8zNzY5MC1nZXR0aW5nLWZlZWRiYWNrLWZyb20teW91ci13ZWJzaXRlLXdpdGgtdGhlLWZlZWRiYWNrLXdpZGdldCB0YXJnZXQ9IF9ibGFuaz5TZWUgaG93IHlvdSBjYW4gYWRkIHlvdXIgb3duIGZlZWRiYWNrIHdpZGdldDwvYT4gb24geW91ciB3ZWJzaXRlIG9yIGFwcDwvcD4iLCJkZXNjcmlwdGlvbl90ZXh0IjoiSGVsbG8sXG5cblxuSSBzYXcgYSB2aW50YWdlIHRhYmxlIGxhbXAgb24geW91ciBzaXRlIGxhc3QgbW9udGggYW5kIEnigJlkIGJvb2ttYXJrZWQgaXQgdG8gYnV5IGl0IGxhdGVyIGZvciBhIGZyaWVuZC4gSSBjYW7igJl0IHNlZW0gdG8gZmluZCBpdCBhbnltb3JlIHRob3VnaC4gSXMgaXQgb3V0IG9mIHN0b2NrIG9yIGRvIHlvdSBub3Qgc2VsbCB0aG9zZSBhbnltb3JlP1xuXG5cblRoYW5rcyxcbk1hdHQuXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuUC5TLiBUaGlzIGlzIGEgc2FtcGxlIG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBzZW50IHRvIHlvdSBmcm9tIHdlYnNpdGUgcGFnZS4gU2VlIGhvdyB5b3UgY2FuIGFkZCB5b3VyIG93biBmZWVkYmFjayB3aWRnZXQgKGh0dHBzOi8vc3VwcG9ydC5mcmVzaGRlc2suY29tL3N1cHBvcnQvc29sdXRpb25zL2FydGljbGVzLzM3NjkwLWdldHRpbmctZmVlZGJhY2stZnJvbS15b3VyLXdlYnNpdGUtd2l0aC10aGUtZmVlZGJhY2std2lkZ2V0KSBvbiB5b3VyIHdlYnNpdGUgb3IgYXBwIiwiY3VzdG9tX2ZpZWxkcyI6eyJjZl90ZXN0X2NoZWNrYm94IjpudWxsLCJjZl9jdXN0b21faW50ZWdlciI6bnVsbCwiY2ZfY3VzdG9tX2Ryb3Bkb3duIjpudWxsLCJjZl9jdXN0b21fZGVjaW1hbCI6bnVsbH0sImNyZWF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEzOjIzOjU2WiIsInVwZGF0ZWRfYXQiOiIyMDIxLTA0LTE0VDE2OjU5OjQ2WiIsInRhZ3MiOltdLCJhdHRhY2htZW50cyI6W10sInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:43 GMT
+- request:
+ method: get
+ uri: "/tickets/3/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:43 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 4254321b-3fbd-950c-94ce-ab39fe10ce34
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '19'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '59'
+ X-Trace-Id:
+ - 00-461c0c91c254096a6b38ba0d362f36c8-6fccb9c9b735c4a5-01
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:43 GMT
+- request:
+ method: get
+ uri: "/tickets/3/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:44 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - fac84179-c92f-4c6c-8b01-b508d727bade
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '18'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '52'
+ X-Trace-Id:
+ - 00-3209551df6d826fac76ea7ca8cdc10a9-28f08152c1dbdeab-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ W3siYm9keSI6IjxkaXY+SGkgTWF0dCw8L2Rpdj5cbjxicj48ZGl2PlRoYW5rcyBmb3Igd3JpdGluZyBpbiE8L2Rpdj5cbjxicj48ZGl2PknigJltIHNvcnJ5IHRvIHNheSB0aG9zZSB2aW50YWdlIGxhbXBzIGFyZSBjdXJyZW50bHkgb3V0IG9mIHN0b2NrLiBJIGNoZWNrZWQgd2l0aCBvdXIgc3VwcGxpZXIgdGhvdWdoIGFuZCB0aGV5IHRoaW5rIGl0IHNob3VsZCBiZSBhdmFpbGFibGUgYnkgdGhlIGVuZCBvZiBuZXh0IG1vbnRoLiBCdXQgaWYgeW914oCZZCByYXRoZXIgbm90IHdhaXQgdGhhdCBsb25nLCBJ4oCZZCBsb3ZlIHRvIGhlbHAgeW91IGZpbmQgc29tZXRoaW5nIGVsc2UgdG8gZ2lmdCB5b3VyIGZyaWVuZC4gTGV0IG1lIGtub3cgd2hhdCB0aGVpciBpbnRlcmVzdHMgYXJlIGFuZCBJ4oCZbGwgc2VuZCBhY3Jvc3MgYSBsaXN0IDopPC9kaXY+XG48YnI+PGRpdj5DaGVlcnMsXG48YnI+SmFuZXRcbjxicj5TYXVs4oCZcyBFbXBvcml1bSBTdXBwb3J0PC9kaXY+IiwiYm9keV90ZXh0IjoiSGkgTWF0dCwgICBUaGFua3MgZm9yIHdyaXRpbmcgaW4hICAgSeKAmW0gc29ycnkgdG8gc2F5IHRob3NlIHZpbnRhZ2UgbGFtcHMgYXJlIGN1cnJlbnRseSBvdXQgb2Ygc3RvY2suIEkgY2hlY2tlZCB3aXRoIG91ciBzdXBwbGllciB0aG91Z2ggYW5kIHRoZXkgdGhpbmsgaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBieSB0aGUgZW5kIG9mIG5leHQgbW9udGguIEJ1dCBpZiB5b3XigJlkIHJhdGhlciBub3Qgd2FpdCB0aGF0IGxvbmcsIEnigJlkIGxvdmUgdG8gaGVscCB5b3UgZmluZCBzb21ldGhpbmcgZWxzZSB0byBnaWZ0IHlvdXIgZnJpZW5kLiBMZXQgbWUga25vdyB3aGF0IHRoZWlyIGludGVyZXN0cyBhcmUgYW5kIEnigJlsbCBzZW5kIGFjcm9zcyBhIGxpc3QgOikgICBDaGVlcnMsXG4gSmFuZXRcbiBTYXVs4oCZcyBFbXBvcml1bSBTdXBwb3J0IiwiaWQiOjgwMDIwMzQ5NDU0LCJpbmNvbWluZyI6ZmFsc2UsInByaXZhdGUiOmZhbHNlLCJ1c2VyX2lkIjo4MDAxNDQwMDQ4MCwic3VwcG9ydF9lbWFpbCI6InN1cHBvcnRAbmV3YWNjb3VudDE2MTc5NzQ2MzQ3NTYuZnJlc2hkZXNrLmNvbSIsInNvdXJjZSI6MCwiY2F0ZWdvcnkiOjMsInRvX2VtYWlscyI6WyJtYXR0LnJvZ2Vyc0BmcmVzaGRlc2suY29tIl0sImZyb21fZW1haWwiOiJzdXBwb3J0QG5ld2FjY291bnQxNjE3OTc0NjM0NzU2LmZyZXNoZGVzay5jb20iLCJjY19lbWFpbHMiOltdLCJiY2NfZW1haWxzIjpbXSwiZW1haWxfZmFpbHVyZV9jb3VudCI6bnVsbCwib3V0Z29pbmdfZmFpbHVyZXMiOm51bGwsImNyZWF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEzOjIzOjU2WiIsInVwZGF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEzOjI0OjAxWiIsImF0dGFjaG1lbnRzIjpbXSwiYXV0b19yZXNwb25zZSI6ZmFsc2UsInRpY2tldF9pZCI6Mywic291cmNlX2FkZGl0aW9uYWxfaW5mbyI6bnVsbH1d
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:44 GMT
+- request:
+ method: get
+ uri: "/tickets/4"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:44 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - af8ce06a-a712-4479-a0df-f2332a20f057
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '17'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '69'
+ X-Trace-Id:
+ - 00-6ef29c9a9cf1315339527dc1351c731f-566addc3b3bf0af5-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOm51bGwsImZ3ZF9lbWFpbHMiOm51bGwsInJlcGx5X2NjX2VtYWlscyI6bnVsbCwidGlja2V0X2NjX2VtYWlscyI6bnVsbCwiZnJfZXNjYWxhdGVkIjp0cnVlLCJzcGFtIjpmYWxzZSwiZW1haWxfY29uZmlnX2lkIjpudWxsLCJncm91cF9pZCI6ODAwMDAzNzQ3MTgsInByaW9yaXR5Ijo0LCJyZXF1ZXN0ZXJfaWQiOjgwMDE0NDAwNDgyLCJyZXNwb25kZXJfaWQiOm51bGwsInNvdXJjZSI6MSwiY29tcGFueV9pZCI6bnVsbCwic3RhdHVzIjoyLCJzdWJqZWN0IjoiSG93IG11Y2ggdGltZSBkb2VzIGl0IHRha2UgdG8gZ2V0IG15IG1vbmV5IGJhY2shPz8/PyIsImFzc29jaWF0aW9uX3R5cGUiOm51bGwsInN1cHBvcnRfZW1haWwiOm51bGwsInRvX2VtYWlscyI6bnVsbCwicHJvZHVjdF9pZCI6bnVsbCwiaWQiOjQsInR5cGUiOiJSZWZ1bmRzIGFuZCBSZXR1cm5zIiwiZHVlX2J5IjoiMjAyMS0wNC0wOVQxNzoyMzo1NloiLCJmcl9kdWVfYnkiOiIyMDIxLTA0LTA5VDE0OjIzOjU2WiIsImlzX2VzY2FsYXRlZCI6dHJ1ZSwiZGVzY3JpcHRpb24iOiI8cD5IaSw8L3A+PGJyIC8+PHA+SSBoYWQgY2FuY2VsZWQgbXkgb3JkZXIgSUQgNjg1NCAoUGVyY2VwdGlvbiBTb3VuZCA5LjUpIGxhc3Qgd2VlayBhbmQgSeKAmXZlIGJlZW4gd2FpdGluZyBmb3IgbXkgbW9uZXkgZXZlciBzaW5jZS4gSXQncyBiZWVuIGEgd2hpbGUgc2luY2UgeW91ciB0ZWFtIGluaXRpYXRlZCB0aGUgcHJvY2Vzcy4gQW55IHVwZGF0ZSBvbiB0aGlzPzwvcD4iLCJkZXNjcmlwdGlvbl90ZXh0IjoiSGksXG5cblxuSSBoYWQgY2FuY2VsZWQgbXkgb3JkZXIgSUQgNjg1NCAoUGVyY2VwdGlvbiBTb3VuZCA5LjUpIGxhc3Qgd2VlayBhbmQgSeKAmXZlIGJlZW4gd2FpdGluZyBmb3IgbXkgbW9uZXkgZXZlciBzaW5jZS4gSXQncyBiZWVuIGEgd2hpbGUgc2luY2UgeW91ciB0ZWFtIGluaXRpYXRlZCB0aGUgcHJvY2Vzcy4gQW55IHVwZGF0ZSBvbiB0aGlzPyIsImN1c3RvbV9maWVsZHMiOnsiY2ZfdGVzdF9jaGVja2JveCI6bnVsbCwiY2ZfY3VzdG9tX2ludGVnZXIiOm51bGwsImNmX2N1c3RvbV9kcm9wZG93biI6bnVsbCwiY2ZfY3VzdG9tX2RlY2ltYWwiOm51bGx9LCJjcmVhdGVkX2F0IjoiMjAyMS0wNC0wOVQxMzoyMzo1NloiLCJ1cGRhdGVkX2F0IjoiMjAyMS0wNC0xMlQxMzowMTo0MloiLCJ0YWdzIjpbXSwiYXR0YWNobWVudHMiOltdLCJzb3VyY2VfYWRkaXRpb25hbF9pbmZvIjpudWxsfQ==
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:44 GMT
+- request:
+ method: get
+ uri: "/tickets/4/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:44 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 7a226a9c-429c-4fa5-8156-c265431d9517
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '16'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '73'
+ X-Trace-Id:
+ - 00-969d25618e6fd9f3ed97753b840a325d-ad2e54cf5bae73ca-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:44 GMT
+- request:
+ method: get
+ uri: "/tickets/4/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:44 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 86d20d73-a824-42dc-a6f9-c0488c021088
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '15'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '51'
+ X-Trace-Id:
+ - 00-88d838e961c3f95e934b7d26538eaa57-6b85430920901702-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:44 GMT
+- request:
+ method: get
+ uri: "/tickets/5"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:45 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - fc0f6071-dc16-4341-ada0-e33ee029a1d1
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '14'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '82'
+ X-Trace-Id:
+ - 00-56716957161d3c0651e55f17317ea545-672428414a871781-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOltdLCJmd2RfZW1haWxzIjpbXSwicmVwbHlfY2NfZW1haWxzIjpbXSwidGlja2V0X2NjX2VtYWlscyI6W10sImZyX2VzY2FsYXRlZCI6ZmFsc2UsInNwYW0iOmZhbHNlLCJlbWFpbF9jb25maWdfaWQiOm51bGwsImdyb3VwX2lkIjo4MDAwMDM3NDcxNywicHJpb3JpdHkiOjMsInJlcXVlc3Rlcl9pZCI6ODAwMTQ0MDA0ODMsInJlc3BvbmRlcl9pZCI6bnVsbCwic291cmNlIjoxLCJjb21wYW55X2lkIjpudWxsLCJzdGF0dXMiOjMsInN1YmplY3QiOiJNeSByZXR1cm4gd2FzIG5vdCBwaWNrZWQgdXAiLCJhc3NvY2lhdGlvbl90eXBlIjpudWxsLCJzdXBwb3J0X2VtYWlsIjpudWxsLCJ0b19lbWFpbHMiOm51bGwsInByb2R1Y3RfaWQiOm51bGwsImlkIjo1LCJ0eXBlIjoiUmVmdW5kcyBhbmQgUmV0dXJucyIsImR1ZV9ieSI6IjIwMjEtMDQtMTNUMDg6MjQ6MDhaIiwiZnJfZHVlX2J5IjoiMjAyMS0wNC0xMlQwOToyNDowOFoiLCJpc19lc2NhbGF0ZWQiOmZhbHNlLCJkZXNjcmlwdGlvbiI6IjxwPkhpLDwvcD48YnIgLz48cD5NeSBSZXR1cm4gSUQgaXMgMzUzMDMxMDAgYW5kIHRoZSBwcm9kdWN0IGhhc27igJl0IGJlZW4gcGlja2VkIHVwIGFuZCByZXBsYWNlZC4gVGhlIHJlcXVlc3Qgd2FzIHJhaXNlZCBhbG1vc3QgYSB3ZWVrIGFnby4gUGxlYXNlIGV4cGVkaXRlLjwvcD4iLCJkZXNjcmlwdGlvbl90ZXh0IjoiSGksXG5cblxuTXkgUmV0dXJuIElEIGlzIDM1MzAzMTAwIGFuZCB0aGUgcHJvZHVjdCBoYXNu4oCZdCBiZWVuIHBpY2tlZCB1cCBhbmQgcmVwbGFjZWQuIFRoZSByZXF1ZXN0IHdhcyByYWlzZWQgYWxtb3N0IGEgd2VlayBhZ28uIFBsZWFzZSBleHBlZGl0ZS4iLCJjdXN0b21fZmllbGRzIjp7ImNmX3Rlc3RfY2hlY2tib3giOm51bGwsImNmX2N1c3RvbV9pbnRlZ2VyIjpudWxsLCJjZl9jdXN0b21fZHJvcGRvd24iOm51bGwsImNmX2N1c3RvbV9kZWNpbWFsIjpudWxsfSwiY3JlYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTM6MjM6NTZaIiwidXBkYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTM6MjQ6MDhaIiwidGFncyI6W10sImF0dGFjaG1lbnRzIjpbXSwic291cmNlX2FkZGl0aW9uYWxfaW5mbyI6bnVsbH0=
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:45 GMT
+- request:
+ method: get
+ uri: "/tickets/5/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:45 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - bf7bdb1c-93d9-4893-b357-b63dbec63d39
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '13'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '64'
+ X-Trace-Id:
+ - 00-ba7125f6a402a568f85c62b3d78401da-fe508ce733606e45-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:45 GMT
+- request:
+ method: get
+ uri: "/tickets/5/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:45 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 89639ed7-2aa2-4eaa-b88a-c238a94a62dc
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '12'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '73'
+ X-Trace-Id:
+ - 00-12b89e79d2eed6cb70e897273b731a2e-d634374ea4e209c0-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ W3siYm9keSI6IjxkaXY+SGF2ZSB3ZSBhc3NpZ25lZCBhIGRlbGl2ZXJ5IGV4ZWN1dGl2ZSB0byBwaWNrIHVwIHRoZSBpdGVtIGFuZCByZXBsYWNlIHRoZSBjdXN0b21lcuKAmXMgb3JkZXI/PC9kaXY+IiwiYm9keV90ZXh0IjoiSGF2ZSB3ZSBhc3NpZ25lZCBhIGRlbGl2ZXJ5IGV4ZWN1dGl2ZSB0byBwaWNrIHVwIHRoZSBpdGVtIGFuZCByZXBsYWNlIHRoZSBjdXN0b21lcuKAmXMgb3JkZXI/IiwiaWQiOjgwMDIwMzQ5NDU5LCJpbmNvbWluZyI6ZmFsc2UsInByaXZhdGUiOnRydWUsInVzZXJfaWQiOjgwMDE0NDAwNDgwLCJzdXBwb3J0X2VtYWlsIjoic3VwcG9ydEBuZXdhY2NvdW50MTYxNzk3NDYzNDc1Ni5mcmVzaGRlc2suY29tIiwic291cmNlIjowLCJjYXRlZ29yeSI6MiwidG9fZW1haWxzIjpbInBvbGx5QGZyZXNoZGVzay5jb20iXSwiZnJvbV9lbWFpbCI6InN1cHBvcnRAbmV3YWNjb3VudDE2MTc5NzQ2MzQ3NTYuZnJlc2hkZXNrLmNvbSIsImNjX2VtYWlscyI6W10sImJjY19lbWFpbHMiOltdLCJlbWFpbF9mYWlsdXJlX2NvdW50IjpudWxsLCJvdXRnb2luZ19mYWlsdXJlcyI6bnVsbCwiY3JlYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTM6MjM6NTZaIiwidXBkYXRlZF9hdCI6IjIwMjEtMDQtMDlUMTM6MjQ6MDJaIiwiYXR0YWNobWVudHMiOltdLCJhdXRvX3Jlc3BvbnNlIjpmYWxzZSwidGlja2V0X2lkIjo1LCJzb3VyY2VfYWRkaXRpb25hbF9pbmZvIjpudWxsfV0=
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:45 GMT
+- request:
+ method: get
+ uri: "/tickets/6"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:46 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 6a2d8ab9-ee95-4824-9f44-7f7e09089707
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '11'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '70'
+ X-Trace-Id:
+ - 00-4ded956ad444c739d2fb3c7f271ea41e-4555f7e671b81a59-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ eyJjY19lbWFpbHMiOm51bGwsImZ3ZF9lbWFpbHMiOm51bGwsInJlcGx5X2NjX2VtYWlscyI6bnVsbCwidGlja2V0X2NjX2VtYWlscyI6bnVsbCwiZnJfZXNjYWxhdGVkIjp0cnVlLCJzcGFtIjpmYWxzZSwiZW1haWxfY29uZmlnX2lkIjpudWxsLCJncm91cF9pZCI6ODAwMDAzNzQ3MTgsInByaW9yaXR5IjoyLCJyZXF1ZXN0ZXJfaWQiOjgwMDE0NDAwNDg0LCJyZXNwb25kZXJfaWQiOm51bGwsInNvdXJjZSI6MSwiY29tcGFueV9pZCI6bnVsbCwic3RhdHVzIjoyLCJzdWJqZWN0IjoiSG93IGRvIEkgcGxhY2UgYSBjdXN0b20gb3JkZXI/IiwiYXNzb2NpYXRpb25fdHlwZSI6bnVsbCwic3VwcG9ydF9lbWFpbCI6bnVsbCwidG9fZW1haWxzIjpudWxsLCJwcm9kdWN0X2lkIjpudWxsLCJpZCI6NiwidHlwZSI6IkJ1bGsgb3JkZXJzIiwiZHVlX2J5IjoiMjAyMS0wNC0xMlQxNDoyMzo1NloiLCJmcl9kdWVfYnkiOiIyMDIxLTA0LTEyVDEyOjIzOjU2WiIsImlzX2VzY2FsYXRlZCI6dHJ1ZSwiZGVzY3JpcHRpb24iOiI8cD5JIHdhbnQgdG8gcHVyY2hhc2UgYW4gYXNzb3J0ZWQgc2V0IG9mIHJldGFpbCBlcXVpcG1lbnQuIEnigJltIG5vdCBhYmxlIHRvIGJ1aWxkIG15IGJ1bmRsZS4gQ2FuIHlvdSBoZWxwIG1lIHdpdGggdGhpcyBwdXJjaGFzZT8gTG9va2luZyBmb3J3YXJkIHRvIG1vcmUgaW5mb3JtYXRpb24hPC9wPiIsImRlc2NyaXB0aW9uX3RleHQiOiJJIHdhbnQgdG8gcHVyY2hhc2UgYW4gYXNzb3J0ZWQgc2V0IG9mIHJldGFpbCBlcXVpcG1lbnQuIEnigJltIG5vdCBhYmxlIHRvIGJ1aWxkIG15IGJ1bmRsZS4gQ2FuIHlvdSBoZWxwIG1lIHdpdGggdGhpcyBwdXJjaGFzZT8gTG9va2luZyBmb3J3YXJkIHRvIG1vcmUgaW5mb3JtYXRpb24hIiwiY3VzdG9tX2ZpZWxkcyI6eyJjZl90ZXN0X2NoZWNrYm94IjpudWxsLCJjZl9jdXN0b21faW50ZWdlciI6bnVsbCwiY2ZfY3VzdG9tX2Ryb3Bkb3duIjpudWxsLCJjZl9jdXN0b21fZGVjaW1hbCI6bnVsbH0sImNyZWF0ZWRfYXQiOiIyMDIxLTA0LTA5VDEzOjIzOjU2WiIsInVwZGF0ZWRfYXQiOiIyMDIxLTA0LTEyVDE3OjU5OjUzWiIsInRhZ3MiOltdLCJhdHRhY2htZW50cyI6W10sInNvdXJjZV9hZGRpdGlvbmFsX2luZm8iOm51bGx9
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:45 GMT
+- request:
+ method: get
+ uri: "/tickets/6/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:46 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 9e998561-b44f-43a8-9354-8e6146199298
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '10'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '47'
+ X-Trace-Id:
+ - 00-5a1fb32b7b857d1a63e6055b419eec53-44c8af02921bc9ad-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:46 GMT
+- request:
+ method: get
+ uri: "/tickets/6/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:46 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 20bca244-b483-4dfa-820a-a1dba8946a4b
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '9'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '44'
+ X-Trace-Id:
+ - 00-4269b93522f040b01b644b92d56959b2-eb4102efe28e7feb-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:46 GMT
+- request:
+ method: get
+ uri: "/tickets/7"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:46 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - e7febff6-becd-4aa4-b0da-3b2883f7527b
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '8'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '73'
+ X-Trace-Id:
+ - 00-c933f173c1fb6fb224239e82f8481ef5-87e4c44900a2311e-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '{"cc_emails":null,"fwd_emails":null,"reply_cc_emails":null,"ticket_cc_emails":null,"fr_escalated":true,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":1,"requester_id":80014400481,"responder_id":null,"source":1,"company_id":null,"status":2,"subject":"How
+ can I get a refund for my order?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":7,"type":"Refunds
+ and Returns","due_by":"2021-04-14T13:23:56Z","fr_due_by":"2021-04-12T13:23:56Z","is_escalated":true,"description":"Hi
+ there,
I need a refund for the headphones that I purchased last
+ week. My order ID is #53467. The product was damaged when I received it. Can
+ you please tell me how I can get a refund?
Best,\n Matt.
","description_text":"Hi
+ there,\n\n\nI need a refund for the headphones that I purchased last week.
+ My order ID is #53467. The product was damaged when I received it. Can you
+ please tell me how I can get a refund?\n\n\nBest,\nMatt.","custom_fields":{"cf_test_checkbox":null,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-04-09T13:23:56Z","updated_at":"2021-04-14T16:59:46Z","tags":[],"attachments":[],"source_additional_info":null}'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:46 GMT
+- request:
+ method: get
+ uri: "/tickets/7/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:47 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - f26fd401-8d8d-4216-acad-116376438c1d
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '7'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '81'
+ X-Trace-Id:
+ - 00-da1a9d8162ee7ad569f26c3a0b70119a-f3d8de6954c6a187-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:47 GMT
+- request:
+ method: get
+ uri: "/tickets/7/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:47 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - d7a6ce2f-82ef-4e83-8707-e3e7a8149c1e
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '6'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '58'
+ X-Trace-Id:
+ - 00-0f85c0830d4e26fc58c0ffb7a7914a2a-04f5bcd055794157-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:47 GMT
+- request:
+ method: get
+ uri: "/tickets/12"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:47 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - c9dae012-5af1-43c3-91ed-5eb08f473dfa
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '5'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '72'
+ X-Trace-Id:
+ - 00-59cb7dfceac7351c34e53dbd80a5d8a1-5dd9be96a925d307-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":true,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":1,"requester_id":80014400475,"responder_id":80014400475,"source":3,"company_id":null,"status":2,"subject":"test
+ example","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":12,"type":null,"due_by":"2021-04-15T21:00:00Z","fr_due_by":"2021-04-13T21:00:00Z","is_escalated":true,"description":"","description_text":"Testing
+ example.","custom_fields":{"cf_test_checkbox":true,"cf_custom_integer":999,"cf_custom_dropdown":"key2","cf_custom_decimal":"1.0"},"created_at":"2021-04-12T20:33:21Z","updated_at":"2021-04-15T23:59:43Z","tags":[],"attachments":[],"source_additional_info":null}'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:47 GMT
+- request:
+ method: get
+ uri: "/tickets/12/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:47 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - f5f0f459-ff90-492e-9861-9a9ad9c3336c
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '4'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '65'
+ X-Trace-Id:
+ - 00-f8db495f583f8942d17ebd72858087f3-e837cb9440a01567-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:47 GMT
+- request:
+ method: get
+ uri: "/tickets/12/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:48 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 942ca56a-02da-4435-8eed-8af92a91b48c
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '3'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '70'
+ X-Trace-Id:
+ - 00-d0fed41d3b2ce15ab37fe05b0d3aa846-3e2307aede031d76-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"body":"","body_text":"attachment","id":80020855130,"incoming":false,"private":true,"user_id":80014400475,"support_email":null,"source":2,"category":2,"to_emails":[],"from_email":null,"cc_emails":[],"bcc_emails":null,"email_failure_count":null,"outgoing_failures":null,"created_at":"2021-04-12T20:56:31Z","updated_at":"2021-04-12T20:56:31Z","attachments":[{"id":80007951898,"name":"1a3496b9-53d9-494d-bbb0-e1d2e22074f8.jpg","content_type":"image/jpeg","size":6108,"created_at":"2021-04-12T20:56:28Z","updated_at":"2021-04-12T20:56:31Z","attachment_url":"https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80007951898/original/1a3496b9-53d9-494d-bbb0-e1d2e22074f8.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210519%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210519T130748Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=24d5bee83365cc71ceb6ca7209b8fbee001e52b3086a5ca841e8d25aaf8d095b","thumb_url":"https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80007951898/thumb/1a3496b9-53d9-494d-bbb0-e1d2e22074f8.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210519%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210519T130748Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=44f124936c979e5c5dce46d85be48b7ec7aaf595f0d795d02bfe2f504ab8b237"}],"auto_response":false,"ticket_id":12,"source_additional_info":null}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:48 GMT
+- request:
+ method: get
+ uri: https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80007951898/original/1a3496b9-53d9-494d-bbb0-e1d2e22074f8.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP/20210519/eu-central-1/s3/aws4_request&X-Amz-Date=20210519T130748Z&X-Amz-Expires=300&X-Amz-Signature=24d5bee83365cc71ceb6ca7209b8fbee001e52b3086a5ca841e8d25aaf8d095b&X-Amz-SignedHeaders=host
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - s3.eu-central-1.amazonaws.com
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ X-Amz-Id-2:
+ - QzkaYQQNgtevSWuv0grxQMVOCVSTsM5D4hL2yTHXKeM9/bbixxTdUTtsdDPxXlUoeAbLz75IpX0=
+ X-Amz-Request-Id:
+ - JZFMFHD8WH4245FK
+ Date:
+ - Wed, 19 May 2021 13:07:49 GMT
+ Last-Modified:
+ - Mon, 12 Apr 2021 20:56:29 GMT
+ Etag:
+ - '"09151ef6db66e8e097e45e4040f1e785"'
+ X-Amz-Server-Side-Encryption:
+ - AES256
+ X-Amz-Version-Id:
+ - WzwUbygKbUbvG_4mXgwdM8_lu6JnYcfz
+ Accept-Ranges:
+ - bytes
+ Content-Type:
+ - image/jpeg
+ Content-Length:
+ - '6108'
+ Server:
+ - AmazonS3
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ 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
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:48 GMT
+- request:
+ method: get
+ uri: "/tickets/13"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:48 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 648d6cbb-16e4-4ebc-b3f5-dbff964405f8
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '2'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '58'
+ X-Trace-Id:
+ - 00-f2d6e75e8210779e12c0efce25c6120d-8807422f7c6454f5-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '{"cc_emails":[],"fwd_emails":[],"reply_cc_emails":[],"ticket_cc_emails":[],"fr_escalated":false,"spam":false,"email_config_id":null,"group_id":80000374718,"priority":1,"requester_id":80014400819,"responder_id":80014400475,"source":3,"company_id":null,"status":2,"subject":"Inline
+ Images Failing?","association_type":null,"support_email":null,"to_emails":null,"product_id":null,"id":13,"type":null,"due_by":"2021-05-17T12:29:27Z","fr_due_by":"2021-05-15T12:29:27Z","is_escalated":false,"description":"\n
Inline images
+ in the first article might not be working, see following:
\n
\n
","description_text":"Inline
+ images in the first article might not be working, see following:","custom_fields":{"cf_test_checkbox":false,"cf_custom_integer":null,"cf_custom_dropdown":null,"cf_custom_decimal":null},"created_at":"2021-05-14T12:29:27Z","updated_at":"2021-05-17T15:02:00Z","tags":[],"attachments":[{"id":80012226688,"content_type":"image/png","size":11447,"name":"standalone_attachment.png","attachment_url":"https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226688/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210519%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210519T130748Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=c99c487e55463fda32dc1b715c031ee606f3808ad5aeb1c5cbbacd07e34100fa","created_at":"2021-05-14T12:29:16Z","updated_at":"2021-05-14T12:29:27Z"}],"source_additional_info":null}'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:48 GMT
+- request:
+ method: get
+ uri: "/tickets/13/time_entries?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:49 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 1e9c7cd2-a0e1-4063-8c3f-88d5b161fcbf
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '1'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '65'
+ X-Trace-Id:
+ - 00-6e29060c0ce3cda062310f4a88f05fb0-202f6e88864c6e7d-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: "[]"
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:48 GMT
+- request:
+ method: get
+ uri: https://eucattachment.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY0NzksImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.cdYIOOSi7ckCFIZlQ9eynELMzJp1ECVeTLlQMCDgKo4
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - eucattachment.freshdesk.com
+ response:
+ status:
+ code: 302
+ message: Found
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:49 GMT
+ Content-Type:
+ - text/html; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 302 Found
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - bedf6f54-2b39-4d1f-9133-33d19e383fa8
+ Location:
+ - https://.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY0NzksImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.cdYIOOSi7ckCFIZlQ9eynELMzJp1ECVeTLlQMCDgKo4
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Fri, 01 Jan 1990 00:00:00 GMT
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Envoy-Upstream-Service-Time:
+ - '29'
+ X-Trace-Id:
+ - 00-f4cb3faeab4caa4d825b96d2536de415-73e5c309a0272bf3-00
+ Server:
+ - fwe
+ body:
+ encoding: UTF-8
+ string: You are being redirected .
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:49 GMT
+- request:
+ method: get
+ uri: https://.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY0NzksImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.cdYIOOSi7ckCFIZlQ9eynELMzJp1ECVeTLlQMCDgKo4
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - ".freshdesk.com"
+ response:
+ status:
+ code: 302
+ message: Found
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:49 GMT
+ Content-Type:
+ - text/html; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 302 Found
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 53ea6663-611c-49c2-bb0f-838f0e4d8206
+ Location:
+ - https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226479/original/yFItWVM4ixB6kDrdEkjebK3iFpDtyU4OJA.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210519%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210519T130749Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=90e4876577bf9dcf13d184ef28244dc7191cceac17ecd68481fe5992783b1293
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Fri, 01 Jan 1990 00:00:00 GMT
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Envoy-Upstream-Service-Time:
+ - '31'
+ X-Trace-Id:
+ - 00-c82b431cf76225af996193e8b1a7b7da-af1df58ca38b0de6-00
+ Server:
+ - fwe
+ body:
+ encoding: UTF-8
+ string: You are being redirected .
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:49 GMT
+- request:
+ method: get
+ uri: https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226479/original/yFItWVM4ixB6kDrdEkjebK3iFpDtyU4OJA.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP/20210519/eu-central-1/s3/aws4_request&X-Amz-Date=20210519T130749Z&X-Amz-Expires=300&X-Amz-Signature=90e4876577bf9dcf13d184ef28244dc7191cceac17ecd68481fe5992783b1293&X-Amz-SignedHeaders=host
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - s3.eu-central-1.amazonaws.com
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ X-Amz-Id-2:
+ - DLlv5Cd9iKXKfQi20VyqZ9qion1EA0mqAuq09/sd0KucWolpOshRHT9c3yKLiumjWklCun4NBWw=
+ X-Amz-Request-Id:
+ - CC67931NW78HSNPV
+ Date:
+ - Wed, 19 May 2021 13:07:50 GMT
+ Last-Modified:
+ - Fri, 14 May 2021 12:28:04 GMT
+ Etag:
+ - '"872c04e6d6d90a1e6b250dfa36d5b58e"'
+ X-Amz-Server-Side-Encryption:
+ - AES256
+ X-Amz-Version-Id:
+ - nbEMUFqzOklAYrQ8U3CPjixUY92hVFZ7
+ Accept-Ranges:
+ - bytes
+ Content-Type:
+ - image/png
+ Content-Length:
+ - '11447'
+ Server:
+ - AmazonS3
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ 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
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:49 GMT
+- request:
+ method: get
+ uri: https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226688/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP/20210519/eu-central-1/s3/aws4_request&X-Amz-Date=20210519T130748Z&X-Amz-Expires=300&X-Amz-Signature=c99c487e55463fda32dc1b715c031ee606f3808ad5aeb1c5cbbacd07e34100fa&X-Amz-SignedHeaders=host
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - s3.eu-central-1.amazonaws.com
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ X-Amz-Id-2:
+ - r98wKuKimZJ3FJ34ngaHEB4jmeJ2vXEAQSlFQx9ffms2H0hqgRvNYYVg+qKJ6PkGTQEgryvbXfA=
+ X-Amz-Request-Id:
+ - CC60A71478GNZHJ3
+ Date:
+ - Wed, 19 May 2021 13:07:50 GMT
+ Last-Modified:
+ - Fri, 14 May 2021 12:29:17 GMT
+ Etag:
+ - '"872c04e6d6d90a1e6b250dfa36d5b58e"'
+ X-Amz-Server-Side-Encryption:
+ - AES256
+ X-Amz-Version-Id:
+ - Vodp5Pp115VO_RfynyiOSxXg2Dl3CSKf
+ Accept-Ranges:
+ - bytes
+ Content-Type:
+ - image/png
+ Content-Length:
+ - '11447'
+ Server:
+ - AmazonS3
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ 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
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:50 GMT
+- request:
+ method: get
+ uri: "/tickets/13/conversations?page=1&per_page=100"
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Content-Type:
+ - application/json
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Ruby
+ Host:
+ - ".freshdesk.com"
+ Authorization:
+ - Basic
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:50 GMT
+ Content-Type:
+ - application/json; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 200 OK
+ Pragma:
+ - no-cache
+ X-Request-Id:
+ - 0efdeb79-0ced-4f09-9d6e-ffb5787170ff
+ X-Freshdesk-Api-Version:
+ - latest=v2; requested=v2
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - must-revalidate, no-cache, no-store, private, max-age=0
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Wed, 13 Oct 2010 00:00:00 UTC
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Fw-Ratelimiting-Managed:
+ - 'true'
+ X-Ratelimit-Total:
+ - '40'
+ X-Ratelimit-Remaining:
+ - '0'
+ X-Ratelimit-Used-Currentrequest:
+ - '1'
+ X-Envoy-Upstream-Service-Time:
+ - '59'
+ X-Trace-Id:
+ - 00-44bedd2bd31a4d98bb7d8b42b72e5aad-d8cc5a5f1b878d33-00
+ Server:
+ - fwe
+ body:
+ encoding: ASCII-8BIT
+ string: '[{"body":"\n
Let''s see if inline images work in a subsequent article:
\n
\n
","body_text":"Let''s
+ see if inline images work in a subsequent article:","id":80027218656,"incoming":false,"private":true,"user_id":80014400475,"support_email":null,"source":2,"category":2,"to_emails":["info@.org"],"from_email":null,"cc_emails":[],"bcc_emails":null,"email_failure_count":null,"outgoing_failures":null,"created_at":"2021-05-14T12:30:19Z","updated_at":"2021-05-14T12:30:19Z","attachments":[{"id":80012226885,"name":"standalone_attachment.png","content_type":"image/png","size":11447,"created_at":"2021-05-14T12:30:16Z","updated_at":"2021-05-14T12:30:19Z","attachment_url":"https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210519%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210519T130750Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=a69b2ff37c00c70095a825375cd4da06341913865889ef44c070c3c7b76c6e45","thumb_url":"https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/thumb/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210519%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210519T130750Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=6bed6038adfadd6572ddc0199a60f007dc5810750cf581a44c4d47d163965141"}],"auto_response":false,"ticket_id":13,"source_additional_info":null}]'
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:50 GMT
+- request:
+ method: get
+ uri: https://eucattachment.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY4NTMsImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.705lNehzm--aO36CGFg0SW73j0NG3UWcRcN1_DXgtwc
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - eucattachment.freshdesk.com
+ response:
+ status:
+ code: 302
+ message: Found
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:50 GMT
+ Content-Type:
+ - text/html; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 302 Found
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - ef70aa82-4825-9221-b4a2-082ef6294de3
+ Location:
+ - https://.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY4NTMsImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.705lNehzm--aO36CGFg0SW73j0NG3UWcRcN1_DXgtwc
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Fri, 01 Jan 1990 00:00:00 GMT
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Envoy-Upstream-Service-Time:
+ - '28'
+ X-Trace-Id:
+ - 00-afe91596e9efb0b4875403d3d4e3f2c3-367141cc12b9e605-01
+ Server:
+ - fwe
+ body:
+ encoding: UTF-8
+ string: You are being redirected .
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:50 GMT
+- request:
+ method: get
+ uri: https://.freshdesk.com/inline/attachment?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6ODAwMTIyMjY4NTMsImRvbWFpbiI6InphbW1hZC5mcmVzaGRlc2suY29tIiwiYWNjb3VudF9pZCI6MTg5MDU2MH0.705lNehzm--aO36CGFg0SW73j0NG3UWcRcN1_DXgtwc
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - ".freshdesk.com"
+ response:
+ status:
+ code: 302
+ message: Found
+ headers:
+ Date:
+ - Wed, 19 May 2021 13:07:50 GMT
+ Content-Type:
+ - text/html; charset=utf-8
+ Transfer-Encoding:
+ - chunked
+ Connection:
+ - keep-alive
+ Status:
+ - 302 Found
+ X-Rack-Cache:
+ - miss
+ Cache-Control:
+ - no-cache, no-store, max-age=0, must-revalidate
+ Pragma:
+ - no-cache
+ X-Xss-Protection:
+ - 1; mode=block
+ X-Request-Id:
+ - 4fd368cc-2d8f-4ce9-ba72-1303e549170d
+ Location:
+ - https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226853/original/TpY8Hl-f_c0ygDHxmOTJ1j0PxYOwKsBC3g.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP%2F20210519%2Feu-central-1%2Fs3%2Faws4_request&X-Amz-Date=20210519T130750Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=ceb69ecc02c76b723a97906a02d95a8369aabbf74ca65f3e5f12ce3ea6890afc
+ X-Ua-Compatible:
+ - IE=Edge,chrome=1
+ X-Frame-Options:
+ - SAMEORIGIN
+ X-Content-Type-Options:
+ - nosniff
+ Expires:
+ - Fri, 01 Jan 1990 00:00:00 GMT
+ Set-Cookie:
+ - _x_w=5_2; path=/; HttpOnly; secure
+ X-Envoy-Upstream-Service-Time:
+ - '31'
+ X-Trace-Id:
+ - 00-33445dd81e9684515a0c75bfd339f275-ec9018ee285e66cc-00
+ Server:
+ - fwe
+ body:
+ encoding: UTF-8
+ string: You are being redirected .
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:50 GMT
+- request:
+ method: get
+ uri: https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226853/original/TpY8Hl-f_c0ygDHxmOTJ1j0PxYOwKsBC3g.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP/20210519/eu-central-1/s3/aws4_request&X-Amz-Date=20210519T130750Z&X-Amz-Expires=300&X-Amz-Signature=ceb69ecc02c76b723a97906a02d95a8369aabbf74ca65f3e5f12ce3ea6890afc&X-Amz-SignedHeaders=host
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - s3.eu-central-1.amazonaws.com
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ X-Amz-Id-2:
+ - bZqzfad78+YvF6jSAPpikY9NooFrQQKd5vwN/4p1jO01GGpSFb/L2WBjELTENeI024B8Z06hhdg=
+ X-Amz-Request-Id:
+ - Q2DSVGXR0HCA2DZE
+ Date:
+ - Wed, 19 May 2021 13:07:51 GMT
+ Last-Modified:
+ - Fri, 14 May 2021 12:30:11 GMT
+ Etag:
+ - '"872c04e6d6d90a1e6b250dfa36d5b58e"'
+ X-Amz-Server-Side-Encryption:
+ - AES256
+ X-Amz-Version-Id:
+ - GtawCVOmQR2l7S30g7JU9URJ5yprBwfY
+ Accept-Ranges:
+ - bytes
+ Content-Type:
+ - image/png
+ Content-Length:
+ - '11447'
+ Server:
+ - AmazonS3
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ iVBORw0KGgoAAAANSUhEUgAAARoAAAEaCAYAAADOs5i6AAABSGlDQ1BJQ0MgUHJvZmlsZQAAKJFjYGASSSwoyGFhYGDIzSspCnJ3UoiIjFJgf8rAysDHwMugwmCYmFxc4BgQ4ANUwgCjUcG3awyMIPqyLsisb5uWWWy4+pEn6s7Pnjm8Xwww1aMArpTU4mQg/QeI05ILikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8gWSM5IBJrB+ALI1klCEk9HYkPtBQEeF1cfH4VQI3Mjg0ACziUdlKRWlIBo5/yCyqLM9IwSBUdgKKUqeOYl6+koGBkYGTIwgMIcovpzIDgsGcXOIMTyFzEwWHxlYGCegBBLmsnAsL2VgUHiFkJMZQEDA38LA8O28wWJRYlwBzB+YylOMzaCsHmcGBhY7/3//1mNgYF9MgPD3wn///9e9P//38VA8+8wMBzIAwDZVWJ3a0JO9AAAAIplWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAACQAAAAAQAAAJAAAAABAAOShgAHAAAAEgAAAHigAgAEAAAAAQAAARqgAwAEAAAAAQAAARoAAAAAQVNDSUkAAABTY3JlZW5zaG905JSzHAAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAdZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDYuMC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MjgyPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjI4MjwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOlVzZXJDb21tZW50PlNjcmVlbnNob3Q8L2V4aWY6VXNlckNvbW1lbnQ+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgolSuHyAAAAHGlET1QAAAACAAAAAAAAAI0AAAAoAAAAjQAAAI0AABoOGsabCAAAGdpJREFUeAHsnQn8TdUWx5eKXhIVJWQoUxNKA6lMyRNJGaNIZMqUKXMy/fUiMk8lU6aEzFGmJCqeoVfx8oqUFEqDoYG3f+ff3v99z//O95x7z+6s/fn4n3322Wefdda693v3XnvtLUu2xU+dI07GaeDMQ+ONk5kF9q8GsjBozDQ+g8ZMu/lVagaNoZZn0BhqOJ+KzaAx1PAMGkMN51OxGTSGGp5BY6jhfCo2g8ZQwzNoDDWcT8Vm0BhqeAaNoYbzqdgMGkMNz6Ax1HA+FZtBY6jhGTSGGs6nYjNoDDU8g8ZQw/lUbAaNoYZn0BhqOJ+KzaAx1PAMGkMN51OxGTSGGp5BY6jhfCo2g8ZQwzNoDDWcT8Vm0BhqeAaNoYbzqdgMGkMNz6Ax1HA+FZtBY6jhGTSGGs6nYjNoDDU8g8ZQw/lUbAaNoYZn0BhqOJ+KzaAx1PAMGkMN51OxGTSGGp5BY6jhfCo2g8ZQwzNoDDWcT8X2PGjK5LqaCmW/nHC8NGt2Ki2ObqUTv5+kjUf/S8sO76YDJ4+59RhH2mXQOKJGbiRJGvAcaC7NehE9Vqg8VcpTnCrmKSHgclGSVBH4mJkHt1KPPQvpx99PBV7wyBmDxiOGYDGi0oBnQFNRgKVj0Sr0YL4yUQmejEq7Thyi6ptf8iRsGDTJ+ATwM5zSQMpBA8D0u66W1YNx6qWcbGfc/vXUTfRsvJYYNF6zCMsTTgMpAw2GRFPLNvVUDyaUokqsedZzPhsGTShrcbkXNZAS0GB4BMikyv8SqyG6ix7NWNGz8VJi0HjJGixLJA0kHTQjStW3fDGRBPPSdcxC1d822UsiEYPGU+ZgYSJoIKmgQS+mmZhRMi1tElPe9wmnsJcSg8ZL1mBZImkgaaB5vVxrI/wxwRTGoAmmFS5jDUSvgaSAxtSejFQjg0Zqgo+sgfg04DpoXhQ+mQ4iPsbkxKAx2Xosuxc04CpoMLuEIZPpiUFjugVZ/lRrwDXQYOp6b/XBjk5hHzx5nL4Ua5B2i4hdLA3AM7D2qUj23NZ6KLeUyaBxS7Pcrl804BpoXhYzTE0dmGE6IYCCGBasPQq30BGLLjGj5cYwjUHjl68Dv6dbGnAFNFhWsPbupxOWechnKwVk1sW01qiw6N3AL1Q7X+mEny8bYNBITfCRNRCfBlwBzRoBGay+jjehF/Pkjlm09PCugCbQawFAABP8Qw8H/wAC/NMTejeY7XIiMWic0KK/2/j+2A/0xoq1dGHWrFS3VjXKlfMSXynEcdAk2psBZBAch5XTMsGpPKJUPQsussx+BHAGf7aCZh3cpi45BRsGjVIpZ+LQwO+//0G3VKtPR4//YN1domgR2rRkRhwthb9lyKjJNG7aHFVp68o5VKRgAXWeyozjoFlYrk1Cw5ZWoicDf4xMscbgYOOqhmK5gNxHBltPYNlDIslPoBkx4VWaPv9Npa6ZY9OobOkb1Hm4zLAxU+m1N1aoKqvnTqar8+dV537NbNjyIT3SpnvA67+z8BW6sWSxgLJETwYMH0+TZy5Qzby3bBYVLVJInacy4yhoMAt0pNaIuN9nlgAMhkwyxTsEs+8jA38RelrxJj+Bpu+w0fTKnEVKVYWvzk/4UuS4OLsqC5XpOWQkzdAg5aUPeiiZEylfvnYDvbtth2qic6umlD/vFepcZo58f4zKVK0rTy1d7l6/mLJf9A9V5kTGS6A5eeo0DRo5kc6dO2e9mqOgSXSoom/HkGigH/w7DbZNsV4y0eGcn0EDBTapW4tGDnzG0mW4P34DjR3K6MHdfNN1QVU0b8kqGjV5Jl2c/SLq1q451apWMWi9RAq9BJrvjh6n0lUeVq/jKGgSGTbpvRk4evdVH6SEjDcDXw8ggZSIbH4HDfQ37aUhVPPee5ANmRg0oUETUmkOXvANaDBsinePGfQ+5CyTUzE48NdgK06kRHpbDBqyuvubl86iq67ME/KrwaBh0MgPh2s9Gkw9f1Clt3xOzMe8K7orB24iwLI/WLabSC+JQZOu1Sp33UGvTXiBzjsvi13N1nmsoPn8i4P07tbt9NXhI3Ts+I8CYrmpYP58VK1i+aBA++OPP+idzdvUuB/+kNI3lMwkC/wCazZuUfWuuiJPyCHNWlHvz7NnrTby5slNt5S6PlN7esFPP/9CWz7aaRW9OncxbXz/I3W5T+dWhBklpJw5clCF22+28vgDh/DpM2es88ty5aJyZUupa/bMb7/9Lt5zK/33fwfo62+/o/PPO1+8ZwnLeVxStJ8tW1b7LdZ5tD2ab458T7s/2avayJIli9D5neI556kyZCDH2k3vW3IcOvwtZcuajQpcdSWVErLcfUfZoJ+D7bs/oe+PHafjP5ygrgNeUO05NnRKZF0TlhYUX9PfEipRf4p6s78y+vAp3j1cGDQZWh3auxO1bFIvo0DLRQuaQ98coV5DR9Hb4kMcKjV+uCYN7tkxwAn968lTVLRcDXVL6etL0JoFU9W5zHz2+RdU+eHm8pSKFi5I7y2frc5l5hvxJS57XwN5Sg1qV6exaX3VebDMth17qM7jHYJdCiiDE33bqrmqrFj5++mXX09a56HkBiCnzHqdhouZP1lXNaBlnu/bhZo/8pBWkp6NBjSHvztKNZu0pcMCNjI1rFODRg3qGQCa6fOX0IgJ09WUvKwrj3g/fBYAKD3Vf7ILbdYc5PKaY6DpLzYY73ddTdluTEf9i+w0aBBdjPgapA+r9BFro2KPK9Dli+nFXKwcLzQjiWR3cPbu1Iowba2n9YtepeuLX6sXWfloQLP7033UpO0zIT/AeqM3lChK8yaPoCvzXK6K7R/kz7euCoARKqKn0Tstfcgsb9yx9nXKL36N9bRszQZq1W2AKhr/fD+qV+s+dR4s4xZo0Ft7qtcQWvpWdFvGPt6oDg3t1YkuuOACJWYk0KCXUbtpe9p/4Ct1D+A6anAvuuD8862ys2fPUW/xIzBjQUaIg6ocJGOHnt0+8hbHQJPILJH+RXYTNPFOc+vyScWl+pgs0GCKetKMBTRr4TL1yhgerJ0/lS68MJsqQyYSaPArfU+dZgG/priv/K2l6YYSxeijnR8TQKSnGlXupuljhqqiCdPn0aAXJ6rzRdNGBwxRcKFZx960ZsMWVQcZ9FTwpdKT/Yu58503gg7Z9Hv2f3mQnh/7ilX0/ke7AoB5xy2lKO8Vua1rgNrAHu3VrZF6NC9NmSXafVnVl5lKd95mBd39e8+nmXTTo30L6tb2cVmV7O+jhxf89MuvVL/F0wFt1K1Zjcak9VGQQUPT5y2xepuqUZHJc/lldO895enU6dO0Tgxd7b0tfbYNM2uf7Ntv1Vn/3geqGcdAE++XGJLoX2QGjbJN2EwyQXPVlVdQ1Xot6MChb5RMbZs1pOe0LxIuRAKNPXI1n/CxrJozKeDLves/e+mfj7RWz0FmzsQXqOrd5ayyPZ+KbVUbPqmuo8fVudVj6hxRuAXL3qvOZSbYsAjvhC8FUjzRuvben/6Fk8+Vx3CggV7L3d9YVrWOjercT0N6daRLclysyhcsfYs69U1T5wDAznVvKFCEAs2p02eocdvutHX7bnXvg/+sQhP+1V/diwv2eB+U9evShto/0Zjgx0H6488/qVOfNFq08m3rHH8wpY9315NrzmAGja5m9/PJBA2iS3d+/BnVaNwm4MUWTB1JFcvfqsrCgQYf0OvuekD9GiIAcOVrE5XzVDUiMqvXb6bmnTJ8JTok0LUvUaGmagcAAohk+lD0ijA8QMIz5K8v8vu2rFQOTPzCl7gzY6jfoUUT60sl24nm6BRoxk+bS4NHTVKPxJBxhdDNRf+4UJXJDIZ6GPLJpEM4GGgKFchPj3fqY/VE5D21q1emiYCMNuzCNfuQs2n92jR8QGBEM+rBqV1P9I7g+JVJ7z2hzPOgkYLrx2j9P7o/Rr9f5uOFod7jkm2l+phs0OB9R0+dHeCvwS/qu2/OpMsuzWmpIxxotny4k+q26KzUhl/s0UN6qXN75qZKDwUMS77ZtUFBolO/YbTgzdXqlkM716lfZnTd/zUufWiDocVEMdSSsFn3xjQxRCtq3bdJzHY1bNVVtWGHproQJuMUaABwgFymJdPHiOFk8P+x9VvhzF286h1ZlSrcdjOVubGkdW4HzUaxnurFidMD/D6IhZoy4rlMkEEDDzXvGNDreX/FHLqmUHCfpr13ZZ8kYNDEsRSBQZO+Xga9krpPdKYP/r1HfdAfuK8SvTxykHUeDjSzFy6n7gOHq/swE9S1XYZ/QV34K9NeOEb19Om7yxTQsApav64D5MFmHZR86BVMn7eYXl+2xmpK/zK8OGkGDR8/TT3iiw/XBO1BqApBMk6BRh9W4TF731se1+puO2gwu6X7vBCeMHPsMMqaNcOBrL+WXY5xw/qqIZNeD/kdojejL1WxD6VdA41TzmD7C+E81T2aSD2lYDK7XZaKHg3e6auvv6XbazQKeD30TNBDCQeakZNn0AvjMr7YAQ1EcYKeU/FrC1s18at+87311F0vPNuNmjV4kH4Ww6Hifw2HMFT6THxhl721gdr1TAchpmJnj3/euq9R624qBsY+/FINR8g4AZozZ36jwrdlzHShl/jxxiURnhz8sh009lqP1X+ARgzoYS+2zkP5toJWDlIIxzJ8PjK5BppoYSAF0Y+RegzRth0JCPEOnSK1q79LsvKpAg3ez96jQBm62ZNmzg+5qHLQyEk04dWMuBLcE0tau+BlKnV9cXWL7siVPhzMiDRpl74mC36IqS8OzOTgPLj9bWsIdvUtGQ5jxOu0eiz2Ff5OgObETz9TSeG7kglDO/TQ4kmRQIM2Jw8fQHVqVM3UvF2OTBUiFNhnB10DTSIBe14Hjb48IoK+k3Y5laDBSz7Vc3DAzMOtYiuJksWuoTmL0mOWUEd3EGKfFMw6yYTeBWY+QqUfT/wkhg85RNf9PKtKjSp3Uc5LcqjqQ1+aQmNfec06l72AgSMm0MQZ860yLALFYlAkHUpLZoyl7MLJWr1RxsxWqLgg6+Ywf5wADZzb+ctUDnjK17vWBwTPBVwMcxINaHA7lpIUuyZ9OCybQ3R0gTKB9hgztI+8HPT4w48nxHA2l3WtoNgO5E7hL5LJNdAksgTB66C5Y/2wgI24pDJTeUw1aPALWLnuE5liYnSd6KCZ/+Yq6twvfdiCOj07tKQubZrp1WPKI/oUwWEyISDvkbY9aN/+L62iD1bPo0IF8ll5OIfhJEbq/tQTlFt8OWRAHyC1Z8PikL4I66YQf5wADZq2O77j3bDKDhqAfPSQ3lTr0XZqGh/Pw1Q+wgqwklxPdjkOfCR2BLTFSun1w+VdAw0e+p1YVJlL7EkTa8LueNgiIlRyauiEFeFY8xRLwo5/V4p1WF5LqQYN9LF1+y4xU9EppGp00Pxn7+d0b/2Wqi4ck3MnZTiH1YUoM5hiLXJbdVUbMT3PiY2fkOzh/++LtUkPCyc2EnpeBfLlVTMxWOqA8Pt4kh004WaudEerfQlC6+7PKXkgR1qfztSicd2gIsEJiyUKSGdFL6Rts0ZU5e47rHM7aKT+/3fgEFV44FGrjvwjh5vyHMcWT/ejle+8q4rgTIe+4kmugiaRrRjC9RqcAE28iyqXHd5N9cWOfV5LXgANdJI2eiqNeXl2UPXID7q8iKA0PejPHr4u62HTpAait3Lg0GGrKJcYMm0WEcoyaEzWe6x9L7VeSo+ZaSOCCfWoXCwOLHRrNXlbwDGUzyKgUogT+xcbgYMIIAyWwoFmxdqN1LJr4A+t3SeFNhF4V03AWl9CgClsLLREssuj63/F25uoZZcMZy3qSyc68khvrl5HbXoMTD8RfzEzuHz2BDXbpy6IzMLlawTYJ6ii/l3bWBMCsgDLHW6o+KA8Jccig9FiIlsx2HfFUxKKTKKgwdYV2K0Pw7tYk31r0Vjvd6u+V0CD2Qp0zfVpVPnO+gcdZVjG0GPgCHnZOj7brR1Vr1RBbDlZkP4U0+fbd39K/Z8fE9Be66YNaNAzmRcyTpu7iPqkjQ5oDyeYWbIv9kMAIAIB7WnPhiV0Re7L7MVRndufj2FY93bNqVKF2wlwvPyydP8FGgsHGgAEi0B1CCNq+hkRB4SeH4Y423bsJoQI6O+A1eFYgiFTONCgDnp8k7StPlH21rwpKg4HcqDnoy+4RI8G8Ui3lbnRCoA89sOP1lavemgA2rEv38AC0XylK+OSlRwFTaJbecoNxjcd/Tzg/3BKBDRY0oA9g+OBDDQkt5lIV5d3/noFNNAI1v/cVbtpJuXYQQPHZ8PWXYOu7tV7JHpDwZYpyOt7hT+m0kOZY3GCLbTEIsGeg0fKW62jfQgTcDGKE3sQon6LffgWDjS4D7FJiAGKJelRwbgvEmiwcLOuiOjV46Cg3/ViluvSXOlBl/ow0y5LKBvZl4HI+/QAQEdBgwckMnySAjpxlA7mRL6Q+q5/TsjkZBuJvFc4Oex+BzssQt0brLcS7F7s59L2mUEBIfGh2kQPYenMcXRt4eA9Ufxqlqr8cEAEsf1XXrYdzE8BZzSc0omkUD2lWEEDGbA3TtMOvSOKgy88giQri56TniKBBnWxF01FsbBVRkujrHrlCjR9dJqKvIafBv6aaFLHlo9S36czZvD0e/R1a46DxulFkbrgseQR+4Id+xLZjEvfyyaWZyejrlugsX9Yo50BwZcea2r0VdOh7kWE8UIRrTtNbIIebMgFwHRp01RMTz8QMVoX0cYYUsjUv0tbat+isTwNOOK/PNGHBcFWfgfcEMUJnNKr122mma8vJfRwZLLvgaP3aIItQpT3fXHwa5o6eyFhWGZP6H3cfvNN1Kvjk0Hhi/VSWDclUyj925dfoD4c4nCMy4Re6hQhh77ZvLyGI+JmsPexHtukX5d5bN41T8w4Og4aPCDewDgpXKJHbKR1+/o06li0qiN75CQqjxv3uwUaN2QN1yZWDB/5/qj4hT1FOXJkpyJiQyU9XibcvV67Bqfz6d9+o7MCpDkvuUT1EOKRExHD2F0PusmWLZtwzF6thjfxtBfvPQDp12IHRMwinS/2rMFWrtgCQ+5fE227roAmVb0aTEWjF9N9z0JrGvvv2puBcf8uoIn2g8r1zNaAK6CBSpzaYDyUesftX0/dBFCCpQ7iP42DAznejdK97JuR78ugkZrgowkacA00+JLvqz44rgC+aBSHGaovxRDJnjC7FC9g0BZ6RSXE/sXyf7q0t++VcwaNVyzBckSjAddAg4cnsv4pGuHdqONlB7D+vgwaXRuc97oGXAUNXj6R7SOSrTwvrtIOpQMGTSjNcLkXNeA6aPDSbvtrnFCsCX4Z/T0ZNLo2OO91DSQFNFCCVwL5ghnENMjgHRg0wSzJZV7VQNJAAwV4sWdjImSgSwYNtMDJFA0kFTRQipd8Nib5ZOwfKAaNXSN87mUNJB00UAZmo9C7iWfvGieUiSlsbP2A9VCmJgaNqZbzp9wpAQ1UjVgXrKpuWqh8UjWPoRIih70eJxNJKQyaSBri617SQMpAI5WA5QqI4sXRzYTeC/4PbpN7Mbp+GDS6NjjvdQ2kHDRSQQBNJ7EIsna+0rLIkSN6MDPFv78LYKRSGDRSE3w0QQOeAY1UFoZU8OHgH+ATqx8H/hdABYsr8c/0IZLUi/3IoLFrhM+9rAHPgcauLKxdwn6/cg1Tadt2nLKngq1Asf4JRz8kBo0frPz3eUfPg+bvo2pn34RB46w+uTV3NcCgcVe/rrXOoHFNtdywCxpg0Lig1GQ0yaBJhpb5GU5pgEHjlCaT3A6DJskK58clpAEGTULqS93NDJrU6Z6fHLsGGDSx68wTdzBoPGEGFiJKDTBoolSU16oxaLxmEZYnnAYYNOG04+FrDBoPG4dFy6QBBk0mlZhRwKAxw04sZboGGDSGfhIYNIYazqdiM2gMNTyDxlDD+VRsBo2hhmfQGGo4n4rNoDHU8AwaQw3nU7EZNIYankFjqOF8KjaDxlDDM2gMNZxPxWbQGGp4Bo2hhvOp2AwaQw3PoDHUcD4Vm0FjqOEZNIYazqdiM2gMNTyDxlDD+VRsBo2hhmfQGGo4n4rNoDHU8AwaQw3nU7EZNIYankFjqOF8KjaDxlDDM2gMNZxPxWbQGGp4Bo2hhvOp2AwaQw3PoDHUcD4Vm0FjqOEZNIYazqdiM2gMNTyDxlDD+VRsBo2hhmfQGGo4n4rNoDHU8AwaQw3nU7EZNIYankFjqOF8KjaDxlDDM2gMNZxPxWbQGGp4Bo2hhvOp2AwaQw3PoDHUcD4Vm0FjqOEZNIYazqdiM2gMNTyDxlDD+VRsBo2hhmfQGGo4n4qdpViFWud8+u5Gv/bmZXOMlp+F95cGGDSG2ptBY6jhfCo2g8ZQwzsNmryX5zRUEyy2CRpg0JhgpSAyMmiCKIWLPKsBBo1nTRNeMAZNeP3wVW9pgEHjLXtELQ2DJmpVcUUPaIBB4wEjxCMCgyYerfE9qdIAgyZVmk/wuQyaBBXItydVAwyapKrbuYcxaJzTJbfkvgYYNO7r2JUnMGhcUSs36pIGGDQuKdbtZhk0bmuY23dSAwwaJ7WZxLYYNElUNj8qYQ0waBJWYWoaYNCkRu/81Pg0wKCJT28pv4tBk3ITsAAxaIBBE4OyvFSVQeMla7AskTTAoImkIY9eZ9B41DAsVlANMGiCqsX7hQwa79uIJczQAIMmQxdG5Rg0RpnL98IyaAz9CDBoDDWcT8Vm0BhqeAaNoYbzqdgMGkMNz6Ax1HA+FZtBY6jhGTSGGs6nYjNoDDU8g8ZQw/lUbAaNoYZn0BhqOJ+KzaAx1PAMGkMN51OxGTSGGp5BY6jhfCo2g8ZQwzNoDDWcT8X+PwAAAP//X/QiAgAADo9JREFU7Z0NjBXVGYYPqbTLFoks0JUiVAoNkEgUWpuCjQkkBlpM+OlPulVrXdOgYKMuEdOFUkIXGrWgpoAS41KrsqQ/qKmNNCQ1IVKa0rI1mLBN3YogpRQRUylsiw2972zPeHb2zt65s3POzHfPe5LduT8zZ75533uffOc7M3OHTJ694KJiE6fAK7/ckWnMjQ0jMu2PnVEBU4EhBI0ph5zHBI0crxipUgSN0E8BQSPUOE/DJmiEGk/QCDXO07AJGqHGEzRCjfM0bIJGqPEEjVDjPA2boBFqPEEj1DhPwyZohBpP0Ag1ztOwCRqhxhM0Qo3zNGyCRqjxBI1Q4zwNm6ARajxBI9Q4T8MmaIQaT9AINc7TsAkaocYTNEKN8zRsgkao8QSNUOM8DZugEWo8QSPUOE/DJmiEGk/QCDXO07AJGqHGEzRCjfM0bFGgmTLpyn42nT7zrnr7nXf7vV7rLxA0te5wbR1foUEz46qpaub0aWrKpIlqdMNlscqfO9+jurrfUJ2HDqvO17oUntd6I2hq3eHaOr5CgmbhvDnqhutnqfphdanU3negU73w65drOtMhaFJ9NLhRTgoUCjTXXXuNWjhvbr/s5djf/q4OlrIVZCp4rBuynFEjL1MTxo1VyH6iDcDpeP6lmsxwCJqo23xeZAUKARpkLs1Ni9XMq6aFWqH2gqyk6/U3EmcmGGYhEzJrOajfbN6+Qx09/gGgwp0IfkDQCDbPw9BzB82EcZer5q8tDrIS6H++pyfIQl75fWdqO6ZOnljKjOaEwEEmtPOFl9Rg+kwdjKUNCRpLwrJbKwrkChoMfdauWBbWYv7cfUT9qH1H7FBHZyoACeBx9PiJYCgVV/wFbPCnW/vO52oGNgSNdpVLCQrkBhoMl1Yuuy3MZPYd+JN6smNXP81Qt7nu2hkKcIlrGF5htqnztcP9hlkYTt1eGpYNq+stLK/duLUmhlEETdynga8XUYHcQAPIaHiUgwzew5BqoGntcoKiroM/s6Ev7A8N2c/Ktk2xWZO5XZEfEzRFdoexRRXIBTTIMu66rSmIBZkIhku6IdPBexpCeB11m67Xj4QZCzIY/T6GU+hv/Mcv110EWQ2GSVhPt89/dkYALjwvBza9npQlQSPFKcYJBZyDBiBBXQaZCgBy3/c/yC6iwym8//zul9WevfsrugXwYIiE6W7dojWZbzd/PZwGf3Dr9j4g0ttIWRI0UpxinFDAOWjMAi3OcdEQiUIGhWHUbKq9vADT202LvhC6u3l7R3AODl4A3B5c3RK8h0Ly2o2PhetJe0DQSHPM73idgwZfdHzhcZ4MshndKtVs9HpJluYwKVqTMUEnuTBM0CT5JHCdoijgFDRmbcbMZkwwRGs2aYUy+zxYmo3a3N4RdGVmNZJrNQRN2k8Gt8tDAaegub1pSWmq+prgOO9atSGc+bl/eXNwcl20ZjNYQcyajLk//TqyHbwusRE0El3zN2anoFm74s7gvBnUXx7Y0h6qjuwD58qgXoNrmrJqyF6aFn2xVOc5E5xtrPs16ziY6q62DqT7yXNJ0OSpPvddrQJOQdO+aV0QH4CCoZPNhksbkLGUg4h5Xk10ZspmTFn2TdBkqSb7sq2AM9C4/HLr+gxAg4JvOdho6JU7wc+26Fn0T9BkoSL7cKVALqCxeQ6LhgwERM3nez8kaJJ8mBobRiRZjetQgVQK1BRoopBBHSju9hA6o5E688SMJtXnnRvlpEDNgKYayEBrDRoX9SIb3hI0NlRln7YUyAU05tm61R4YZpL0ZQaYvUKrFjLYRoOGNRqooRSHTr068L8dBZyBBuEP5ssdvUEW+kORF7eGwHQ1GmoyAw2XgpVK/9AXrrdCI2gCGQiaXhn435ICTkGzZUNrcF+Yas/+Nc8ojtMhKWSwvZkB2SxMx8WaxescOmWhIvtwpYBT0KQ5IxdDJfMufKipAFS4LcSi+XPCG1qZlzRUEs88Q7m5ZU2l1Qv5PkFTSFsYVIwCTkFjZhJJ6zTmWbzRk+twxfdD320JYFPN1dib17cGtw+tNrOK0TCXlwmaXGTnTlMq4BQ0AAO+5GhJv+T6Oqjo1d76eM2rsZNkJybsouDSfUpYEjQSXGKMWgGnoMFOzWFLkvqIBk30+ih9ANWCRt+mAjWd5a0yL6jEsRM0+hPApQQFnIPGvE1DkuGOBlP0vjJaXPM+NpUyGhNK1dR09L6KtCRoiuQGY6mkgHPQIKBqvvDmjBPAhCwI0In2U+kMX3NKG792iUsTJDeCRrJ7/sWeC2ggM4q4+sS7SrUSPVul7QFwRjeMDH8PaqBrmrBNdOYqyZBN76uoS4KmqM4wrnIK5AYaZBiov+jfWxpoFgpFZAyhyv2+dqXzZ6L3IpZ6gl7UPIImqgifF1mB3EADUcxbR+B5pboJ1scNspChYPiEn1PZd6AzHEqhD7MBZiuXNYeZT6Xhlblt0R8TNEV3iPGZCuQKGgRiTjfjOe7vu7N0U6xy95DB+0mbef4NtqklyOB4CBqowCZFgdxBA6GQeaAOo2s2eA1DHGQr1QIH9yReOG9ukPWgH7RKmVLvWrL+EzSy/PI92kKABiaglgLY4JcnzYbCL7IRLDFbpGec9DoYRmEbDKumTJrYBzA4ye/Jjr6/WKm3k74kaKQ76Ff8hQGNlh3AwPR3FDj6fSwBG4AprqFAnPQXLuP6KPrrBE3RHWJ8pgKFA40OThd+Z06fGs5M6ffKLQGXg4e6gttGZPlLCuX2VYTXCJoiuMAYkipQWNCYB4AaDoZFOouZMG5sqXZzJshs9HAKM1A+NYLGJ7flH6sI0MiXOfsjIGiy15Q92lOAoLGnrdWeCRqr8rLzjBUgaDIW1FV3BI0rpbmfLBQgaLJQMYc+CJocROcuUytA0KSWLt8NCZp89efeq1OAoKlOr8KsTdAUxgoGkkABgiaBSEVchaApoiuMKU4BgiZOmYK/TtAU3CCG10cBgqaPHHKeEDRyvGKkShE0Qj8FBI1Q4zwNm6ARajxBI9Q4T8MmaIQaT9AINc7TsAkaocYTNEKN8zRsgkao8QSNUOM8DZugEWo8QSPUOE/DJmiEGk/QCDXO07AJGqHGEzRCjfM0bIJGqPEEjVDjPA2boBFqPEEj1DhPwyZohBpP0Ag1ztOwCRqhxhM0Qo3zNGyCRqjxBI1Q4zwNm6ARajxBI9Q4T8MmaIQaT9AINc7TsAkaocYTNEKN8zRsgkao8QSNUOM8DZugEWo8QSPUOE/DJmiEGk/QCDXO07AJGqHGEzRCjfM0bIJGqPEEjVDjPA2boBFqPEEj1DhPwyZohBpP0Ag1ztOwCRqhxhM0Qo3zNGyCRqjxBI1Q4zwNm6ARajxBI9Q4T8MmaIQaT9AINc7TsAkaocYTNEKN8zRsgkao8QSNUOM8DZugEWo8QSPUOE/DJmiEGk/QCDXO07AJGqHGEzRCjfM0bIJGqPEEjVDjPA2boBFqPEEj1DhPwyZohBpP0Ag1ztOwCRqhxhM0Qo3zNOzEoKn7yIfVpcM/qobV1amhl3xIqSFDPJXs/4d98aK68P5/1fmeHvXe2X+pnn//x6keBI1TubmzQSqQCDRjRo1UIy4dPshd1fbm/3zvrDp1+oyzgyRonEnNHWWgQEXQjG0co+qH1WWwq9rv4tz5HnXi5CknB0rQOJGZO8lIgQFBw0ymepVdZTYETfXecIv8FIgFDWoy48Y25heZ4D0fP3HSes2GoBH8AfEw9FjQMJtJ/2lwkdUQNOn94ZbuFYgFzYRxY9XQoZe4j6gG9njhwvvq6PETVo+EoLEqLzvPWIFY0Ez6xBWcwk4rdmnqu/vNt9JunWg7giaRTFypIArEg+bK8QUJUWYY3UeOWQ2coLEqLzvPWAGCJmNBdXcEjVaCSypQGhxNnr3gYjkhJjGjKSdL4tcImsRScUUPFCBoLJlM0FgSlt2KVICgsWQbQWNJWHYrUgGCxpJtBI0lYdmtSAUIGku2ETSWhGW3IhUgaCzZRtBYEpbdilSAoLFkG0FjSVh2K1IBgsaSbQSNJWHZrUgFCBpLthE0loRltyIVIGgs2UbQWBKW3YpUgKCxZBtBY0lYditSAYLGkm0EjSVh2a1IBQgaS7YRNJaEZbciFSBoLNlG0FgSlt2KVICgsWQbQWNJWHYrUgGCxpJtBI0lYdmtSAUIGku2ETSWhGW3IhUgaCzZRtBYEpbdilTAOWhw0/ObltyosGwcMyoX0U6eOh3cPPzZXS9au4k4QZOLtdxpQRVwCprZn7latSy9VQ2vH1YIOc6eO682bXtK/fYPr2YeD0GTuaTsULACzkAzvL5e/fjRthAy+//4qrVsopIfyKZmffrqYDXA5pt3r1Znz52rtFlV7xM0VcnFlWtcAWegWTx/rlp6y1cCOZe3rs8NMtpPwGbLhlXB021P/0w9t/s3+q1MlgRNJjKykxpRwBloVpSGTDdc/zn1j7ffUd+4u/cLnreGP3l0vfrY6Aa1Z+/v1MbSECrLRtBkqSb7kq6AM9A8tLpFTZ/2KXXo8F/UfW2bCqGbzZgImkJYzCAKooBz0HS/eUwtb90w4OHfvGRBKfuZlXpWCrNKe/buV8/s+tWA+9myobU0+zXeCvwImgGl55ueKeAcNNAXsFn38DYFIESb/vJHX0/zPA5qmFZfc+/SADLo10aWRdCkcYzb1KoCzkCD4usdt3w1GD5BTEDg/rZH+sz23PylGxWyGbS/Hn0r9bQzptE/OeGKoB9kNc/84sXgMf5h9uuB1ff0gczjT/808+I0QRNKzgdUwP1P4powiUJAZzOAzLLvrB+UPVt/sCqATTSrGWj/g9phZGOCJiIIn3qtgLOMxlRZF2FxDsuXv9USvrX72ceCx1EAhStU8cAEyvyb7gy3/PkTm4JzeWwMl8KdlB4QNKYafOy7ArmABkObNffeEWh/6z2rw1qNbdCgNvPUI23Bftc9/HjqoVmSDw1Bk0QlruOLAv8D2DRw5b0Y0iwAAAAASUVORK5CYII=
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:51 GMT
+- request:
+ method: get
+ uri: https://s3.eu-central-1.amazonaws.com/euc-cdn.freshdesk.com/data/helpdesk/attachments/production/80012226885/original/standalone_attachment.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAS6FNSMY2RG7BSUFP/20210519/eu-central-1/s3/aws4_request&X-Amz-Date=20210519T130750Z&X-Amz-Expires=300&X-Amz-Signature=a69b2ff37c00c70095a825375cd4da06341913865889ef44c070c3c7b76c6e45&X-Amz-SignedHeaders=host
+ body:
+ encoding: US-ASCII
+ string: ''
+ headers:
+ Accept-Encoding:
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
+ Accept:
+ - "*/*"
+ User-Agent:
+ - Zammad User Agent
+ Host:
+ - s3.eu-central-1.amazonaws.com
+ response:
+ status:
+ code: 200
+ message: OK
+ headers:
+ X-Amz-Id-2:
+ - MugGhrBCRzw6ld53vyNXsgFnAqaOR1Ji8Yu0OM8QC499ZUnPinGkqob9KqLqKXJcdbVubbU0+6o=
+ X-Amz-Request-Id:
+ - RHTHNR3GA5EEM3ZX
+ Date:
+ - Wed, 19 May 2021 13:07:52 GMT
+ Last-Modified:
+ - Fri, 14 May 2021 12:30:17 GMT
+ Etag:
+ - '"872c04e6d6d90a1e6b250dfa36d5b58e"'
+ X-Amz-Server-Side-Encryption:
+ - AES256
+ X-Amz-Version-Id:
+ - q1pYZeQo92u_ky4af9CrTwOpi5JS5WqT
+ Accept-Ranges:
+ - bytes
+ Content-Type:
+ - image/png
+ Content-Length:
+ - '11447'
+ Server:
+ - AmazonS3
+ body:
+ encoding: ASCII-8BIT
+ string: !binary |-
+ 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
+ http_version:
+ recorded_at: Wed, 19 May 2021 13:07:51 GMT
+recorded_with: VCR 4.0.0