From 8790e389be671d447fe0383cff6ad6b73dcaec0d Mon Sep 17 00:00:00 2001 From: Thorsten Eckel Date: Tue, 25 May 2021 12:30:12 +0000 Subject: [PATCH] Fixes issue #865 - Freshdesk import --- .rubocop/todo.yml | 2 + .../app/controllers/import_freshdesk.coffee | 194 + .../app/controllers/import_zendesk.coffee | 7 +- .../app/views/import/freshdesk.jst.eco | 109 + .../app/views/import/zendesk.jst.eco | 4 +- app/assets/stylesheets/zammad.scss | 8 + .../import_freshdesk_controller.rb | 143 + app/controllers/import_zendesk_controller.rb | 1 + config/routes/import_freshdesk.rb | 10 + db/seeds/settings.rb | 38 + lib/import/base.rb | 2 +- lib/import/freshdesk.rb | 15 + .../sequence/import/freshdesk/agent.rb | 26 + .../sequence/import/freshdesk/company.rb | 27 + .../import/freshdesk/company_field.rb | 22 + .../import/freshdesk/connection_test.rb | 20 + .../sequence/import/freshdesk/contact.rb | 27 + .../import/freshdesk/contact_field.rb | 22 + .../sequence/import/freshdesk/conversation.rb | 23 + .../import/freshdesk/conversations.rb | 19 + .../sequence/import/freshdesk/description.rb | 25 + .../sequence/import/freshdesk/full.rb | 33 + .../import/freshdesk/generic_field.rb | 18 + .../import/freshdesk/generic_object.rb | 22 + .../sequence/import/freshdesk/group.rb | 26 + .../sequence/import/freshdesk/ticket.rb | 33 + .../sequence/import/freshdesk/ticket_field.rb | 22 + .../sequence/import/freshdesk/time_entries.rb | 19 + .../sequence/import/freshdesk/time_entry.rb | 20 + lib/sequencer/unit/common/model/tags.rb | 30 + .../model_class/ticket/time_accounting.rb | 12 + lib/sequencer/unit/freshdesk/connected.rb | 22 + .../unit/import/freshdesk/agent/mapping.rb | 76 + lib/sequencer/unit/import/freshdesk/agents.rb | 10 + .../freshdesk/agents/groups_permissions.rb | 29 + .../unit/import/freshdesk/companies.rb | 10 + .../unit/import/freshdesk/company/mapping.rb | 24 + .../unit/import/freshdesk/company_fields.rb | 10 + .../unit/import/freshdesk/contact/mapping.rb | 37 + .../unit/import/freshdesk/contact_fields.rb | 10 + .../unit/import/freshdesk/contacts/blocked.rb | 19 + .../unit/import/freshdesk/contacts/default.rb | 16 + .../unit/import/freshdesk/contacts/deleted.rb | 19 + .../freshdesk/conversation/attachments.rb | 78 + .../freshdesk/conversation/inline_images.rb | 74 + .../import/freshdesk/conversation/mapping.rb | 66 + .../import/freshdesk/description/mapping.rb | 67 + .../unit/import/freshdesk/field_map.rb | 14 + .../unit/import/freshdesk/group/mapping.rb | 24 + lib/sequencer/unit/import/freshdesk/groups.rb | 10 + lib/sequencer/unit/import/freshdesk/id_map.rb | 14 + lib/sequencer/unit/import/freshdesk/map_id.rb | 22 + .../import/freshdesk/mapping/custom_fields.rb | 34 + .../unit/import/freshdesk/model_class.rb | 27 + .../import/freshdesk/object_attribute/add.rb | 21 + .../freshdesk/object_attribute/config.rb | 127 + .../freshdesk/object_attribute/field_map.rb | 24 + .../object_attribute/migration_execute.rb | 19 + .../object_attribute/sanitized_name.rb | 24 + .../import/freshdesk/object_attribute/skip.rb | 21 + .../unit/import/freshdesk/object_count.rb | 27 + .../unit/import/freshdesk/perform.rb | 25 + .../unit/import/freshdesk/request.rb | 33 + .../import/freshdesk/request/conversation.rb | 22 + .../unit/import/freshdesk/request/generic.rb | 28 + .../unit/import/freshdesk/request/ticket.rb | 19 + .../import/freshdesk/request/time_entry.rb | 22 + .../unit/import/freshdesk/requester.rb | 56 + .../unit/import/freshdesk/resources.rb | 18 + .../import/freshdesk/sub_sequence/field.rb | 16 + .../import/freshdesk/sub_sequence/generic.rb | 48 + .../import/freshdesk/sub_sequence/object.rb | 16 + .../import/freshdesk/ticket/conversations.rb | 33 + .../import/freshdesk/ticket/description.rb | 28 + .../unit/import/freshdesk/ticket/fetch.rb | 35 + .../unit/import/freshdesk/ticket/mapping.rb | 59 + .../unit/import/freshdesk/ticket/tags.rb | 20 + .../import/freshdesk/ticket/time_entries.rb | 33 + .../unit/import/freshdesk/ticket_fields.rb | 10 + .../unit/import/freshdesk/tickets.rb | 10 + .../import/freshdesk/time_entry/mapping.rb | 60 + spec/factories/object_manager_attribute.rb | 13 + spec/integration/freshdesk_spec.rb | 99 + .../sequence/import/freshdesk/agent_spec.rb | 88 + .../import/freshdesk/company_field_spec.rb | 63 + .../sequence/import/freshdesk/company_spec.rb | 68 + .../import/freshdesk/contact_field_spec.rb | 70 + .../sequence/import/freshdesk/contact_spec.rb | 86 + .../import/freshdesk/conversation_spec.rb | 102 + .../sequence/import/freshdesk/group_spec.rb | 39 + .../import/freshdesk/ticket_field_spec.rb | 157 + .../sequence/import/freshdesk/ticket_spec.rb | 174 + .../unit/freshdesk/connected_spec.rb | 29 + .../checks_import_examples.rb | 2 +- spec/system/import/freshdesk_spec.rb | 137 + test/data/vcr_cassettes/freshdesk_import.yml | 4300 +++++++++++++++++ 96 files changed, 7963 insertions(+), 9 deletions(-) create mode 100644 app/assets/javascripts/app/controllers/import_freshdesk.coffee create mode 100644 app/assets/javascripts/app/views/import/freshdesk.jst.eco create mode 100644 app/controllers/import_freshdesk_controller.rb create mode 100644 config/routes/import_freshdesk.rb create mode 100644 lib/import/freshdesk.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/agent.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/company.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/company_field.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/connection_test.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/contact.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/contact_field.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/conversation.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/conversations.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/description.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/full.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/generic_field.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/generic_object.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/group.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/ticket.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/ticket_field.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/time_entries.rb create mode 100644 lib/sequencer/sequence/import/freshdesk/time_entry.rb create mode 100644 lib/sequencer/unit/common/model/tags.rb create mode 100644 lib/sequencer/unit/common/model_class/ticket/time_accounting.rb create mode 100644 lib/sequencer/unit/freshdesk/connected.rb create mode 100644 lib/sequencer/unit/import/freshdesk/agent/mapping.rb create mode 100644 lib/sequencer/unit/import/freshdesk/agents.rb create mode 100644 lib/sequencer/unit/import/freshdesk/agents/groups_permissions.rb create mode 100644 lib/sequencer/unit/import/freshdesk/companies.rb create mode 100644 lib/sequencer/unit/import/freshdesk/company/mapping.rb create mode 100644 lib/sequencer/unit/import/freshdesk/company_fields.rb create mode 100644 lib/sequencer/unit/import/freshdesk/contact/mapping.rb create mode 100644 lib/sequencer/unit/import/freshdesk/contact_fields.rb create mode 100644 lib/sequencer/unit/import/freshdesk/contacts/blocked.rb create mode 100644 lib/sequencer/unit/import/freshdesk/contacts/default.rb create mode 100644 lib/sequencer/unit/import/freshdesk/contacts/deleted.rb create mode 100644 lib/sequencer/unit/import/freshdesk/conversation/attachments.rb create mode 100644 lib/sequencer/unit/import/freshdesk/conversation/inline_images.rb create mode 100644 lib/sequencer/unit/import/freshdesk/conversation/mapping.rb create mode 100644 lib/sequencer/unit/import/freshdesk/description/mapping.rb create mode 100644 lib/sequencer/unit/import/freshdesk/field_map.rb create mode 100644 lib/sequencer/unit/import/freshdesk/group/mapping.rb create mode 100644 lib/sequencer/unit/import/freshdesk/groups.rb create mode 100644 lib/sequencer/unit/import/freshdesk/id_map.rb create mode 100644 lib/sequencer/unit/import/freshdesk/map_id.rb create mode 100644 lib/sequencer/unit/import/freshdesk/mapping/custom_fields.rb create mode 100644 lib/sequencer/unit/import/freshdesk/model_class.rb create mode 100644 lib/sequencer/unit/import/freshdesk/object_attribute/add.rb create mode 100644 lib/sequencer/unit/import/freshdesk/object_attribute/config.rb create mode 100644 lib/sequencer/unit/import/freshdesk/object_attribute/field_map.rb create mode 100644 lib/sequencer/unit/import/freshdesk/object_attribute/migration_execute.rb create mode 100644 lib/sequencer/unit/import/freshdesk/object_attribute/sanitized_name.rb create mode 100644 lib/sequencer/unit/import/freshdesk/object_attribute/skip.rb create mode 100644 lib/sequencer/unit/import/freshdesk/object_count.rb create mode 100644 lib/sequencer/unit/import/freshdesk/perform.rb create mode 100644 lib/sequencer/unit/import/freshdesk/request.rb create mode 100644 lib/sequencer/unit/import/freshdesk/request/conversation.rb create mode 100644 lib/sequencer/unit/import/freshdesk/request/generic.rb create mode 100644 lib/sequencer/unit/import/freshdesk/request/ticket.rb create mode 100644 lib/sequencer/unit/import/freshdesk/request/time_entry.rb create mode 100644 lib/sequencer/unit/import/freshdesk/requester.rb create mode 100644 lib/sequencer/unit/import/freshdesk/resources.rb create mode 100644 lib/sequencer/unit/import/freshdesk/sub_sequence/field.rb create mode 100644 lib/sequencer/unit/import/freshdesk/sub_sequence/generic.rb create mode 100644 lib/sequencer/unit/import/freshdesk/sub_sequence/object.rb create mode 100644 lib/sequencer/unit/import/freshdesk/ticket/conversations.rb create mode 100644 lib/sequencer/unit/import/freshdesk/ticket/description.rb create mode 100644 lib/sequencer/unit/import/freshdesk/ticket/fetch.rb create mode 100644 lib/sequencer/unit/import/freshdesk/ticket/mapping.rb create mode 100644 lib/sequencer/unit/import/freshdesk/ticket/tags.rb create mode 100644 lib/sequencer/unit/import/freshdesk/ticket/time_entries.rb create mode 100644 lib/sequencer/unit/import/freshdesk/ticket_fields.rb create mode 100644 lib/sequencer/unit/import/freshdesk/tickets.rb create mode 100644 lib/sequencer/unit/import/freshdesk/time_entry/mapping.rb create mode 100644 spec/integration/freshdesk_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/agent_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/company_field_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/company_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/contact_field_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/contact_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/conversation_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/group_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/ticket_field_spec.rb create mode 100644 spec/lib/sequencer/sequence/import/freshdesk/ticket_spec.rb create mode 100644 spec/lib/sequencer/unit/freshdesk/connected_spec.rb create mode 100644 spec/system/import/freshdesk_spec.rb create mode 100644 test/data/vcr_cassettes/freshdesk_import.yml 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') %>: +

+
+ +
+
+ + <%- @freshdeskDomain %> +
+
+
+ <%- @Icon('diagonal-cross', 'icon-error') %> + <%- @Icon('checkmark') %> +
+
+
+
+
+
+ <%- @T('Go Back') %> +
<%- @T('Enter credentials') %>
+
+
+ +
+

<%- @T('%s credentials', 'Freshdesk') %>

+
+

+ <%- @T('Enter your %s API token gained from your account profile settings.', 'Freshdesk') %> +

+

+ <%- @T('Attention: These will be your login password after the import is completed.') %> +

+
+ +
+ +
+
+ <%- @Icon('diagonal-cross', 'icon-error') %> + <%- @Icon('checkmark') %> +
+
+
+
+
+
+ <%- @T('Go Back') %> +
<%- @T('Migrate %s Data', '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 @@
- +
<%- @Icon('diagonal-cross', 'icon-error') %> @@ -108,4 +108,4 @@
- \ 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":"
Testing example.
","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":"
attachment
","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 |- + 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 + 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 |- + 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 +recorded_with: VCR 4.0.0