demarches-normaliennes/app/jobs/helpscout_create_conversation_job.rb

63 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class HelpscoutCreateConversationJob < ApplicationJob
queue_as :critical # user feedback is critical
def max_attempts = 15 # ~10h
class FileNotScannedYetError < StandardError
end
retry_on FileNotScannedYetError, wait: :exponentially_longer, attempts: 10
attr_reader :contact_form
attr_reader :api
def perform(contact_form)
@contact_form = contact_form
if contact_form.piece_jointe.attached?
raise FileNotScannedYetError if contact_form.piece_jointe.virus_scanner.pending?
end
@api = Helpscout::API.new
create_conversation
contact_form.delete
rescue StandardError
contact_form.delete if executions >= max_attempts
raise
end
private
def create_conversation
response = api.create_conversation(
contact_form.email.presence || contact_form.user.email,
contact_form.subject,
contact_form.text,
safe_blob
)
if response.success?
conversation_id = response.headers['Resource-ID']
if contact_form.phone.present?
api.add_phone_number(contact_form.email, contact_form.phone)
end
api.add_tags(conversation_id, contact_form.tags)
else
fail "Error while creating conversation: #{response.response_code} '#{response.body}'"
end
end
def safe_blob
return if !contact_form.piece_jointe.virus_scanner&.safe?
return if contact_form.piece_jointe.byte_size.zero? # HS don't support empty attachment
contact_form.piece_jointe
end
end