ministryofjustice/Claim-for-Crown-Court-Defence

View on GitHub
app/services/zendesk_sender.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
97%
class ZendeskSender
  FEEDBACK_TYPES = {
    feedback: %i[task rating comment reason other_reason],
    bug_report: %i[case_number event outcome email]
  }.freeze

  attr_accessor :ticket_payload

  def self.call(...)
    new(...).call
  end

  def initialize(ticket_payload)
    @ticket_payload = ticket_payload
  end

  def call
    create_ticket
    { success: true, response_message: "#{feedback_type.titleize} submitted" }
  rescue ZendeskAPI::Error::ClientError => e
    catch_error(e)
  end

  private

  def feedback_type
    @ticket_payload.type.humanize
  end

  def feedback_type_attributes
    FEEDBACK_TYPES[@ticket_payload.type.to_sym]
  end

  def description
    feedback_type_attributes.map { |t| "#{t}: #{@ticket_payload.send(t)}" }.join("\n")
  end

  def create_ticket
    ZendeskAPI::Ticket.create!(
      ZENDESK_CLIENT,
      **base_params,
      **email_params,
      **custom_params
    )
  end

  def catch_error(error)
    LogStuff.error(class: self.class.name, action: 'save', error_class: error.class.name, error: error.to_s) do
      "#{feedback_type.titleize} submission failed!"
    end
    { success: false, response_message: "Unable to submit #{feedback_type.downcase}" }
  end

  def reporter_email
    return if @ticket_payload.email.blank? || @ticket_payload.email == 'anonymous'

    @ticket_payload.email
  end

  def subject
    "#{@ticket_payload.type.humanize} (#{Rails.host.env})"
  end

  def base_params
    {
      subject:,
      description:
    }
  end

  def email_params
    return {} if reporter_email.blank?

    { email_ccs: [{ user_email: reporter_email }] }
  end

  def custom_params
    {
      custom_fields: [
        { id: '26047167', value: ticket_payload.referrer },
        { id: '23757677', value: 'advocate_defence_payments' },
        { id: '23791776', value: ticket_payload.user_agent },
        { id: '32342378', value: Rails.host.env }
      ]
    }
  end
end