From ff33f2fd3ce8b0655acbdc24220df7e3b9db9e4a Mon Sep 17 00:00:00 2001 From: Omar Bahareth Date: Wed, 27 Dec 2023 18:12:17 +0300 Subject: [PATCH] Fix Parsing of HTTPX::ErrorResponse and Add Hooks for Advanced Logging There are usecases when users of the SDK need to perform custom logic before the request is sent or response is parsed, so they can add context to exception monitoring platforms. This change also adds the following two hooks: - `Client#before_submitting_request` - `Client#before_parsing_response` --- lib/zatca/client.rb | 24 +++++++++++++++++++----- lib/zatca/version.rb | 2 +- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/zatca/client.rb b/lib/zatca/client.rb index 03f9080..75459bd 100644 --- a/lib/zatca/client.rb +++ b/lib/zatca/client.rb @@ -4,6 +4,8 @@ # This wraps the API described here: # https://sandbox.zatca.gov.sa/IntegrationSandbox class ZATCA::Client + attr_accessor :before_submitting_request, :before_parsing_response + # API URLs are not present in developer portal, they can only be found in a PDF # called Fatoora Portal User Manual, here: # https://zatca.gov.sa/en/E-Invoicing/Introduction/Guidelines/Documents/Fatoora%20portal%20user%20manual.pdf @@ -20,7 +22,16 @@ class ZATCA::Client DEFAULT_API_VERSION = "V2".freeze LANGUAGES = %w[ar en].freeze - def initialize(username:, password:, language: "ar", version: DEFAULT_API_VERSION, environment: :production, verbose: false) + def initialize( + username:, + password:, + language: "ar", + version: DEFAULT_API_VERSION, + environment: :production, + verbose: false, + before_submitting_request: nil, + before_parsing_response: nil + ) raise "Invalid language: #{language}, Please use one of: #{LANGUAGES}" unless LANGUAGES.include?(language) @username = username @@ -30,6 +41,9 @@ def initialize(username:, password:, language: "ar", version: DEFAULT_API_VERSIO @verbose = verbose @base_url = ENVIRONMENTS_TO_URLS_MAP[environment.to_sym] || PRODUCTION_BASE_URL + + @before_submitting_request = before_submitting_request + @before_parsing_response = before_parsing_response end # Reporting API @@ -133,6 +147,7 @@ def request(method:, path:, body: {}, headers: {}, authenticated: true) url = "#{@base_url}/#{path}" headers = default_headers.merge(headers) + before_submitting_request&.call(method, url, body, headers) log("Requesting #{method} #{url} with\n\nbody: #{body}\n\nheaders: #{headers}\n") client = if authenticated @@ -142,14 +157,13 @@ def request(method:, path:, body: {}, headers: {}, authenticated: true) end response = client.send(method, url, json: body, headers: headers) + before_parsing_response&.call(response) log("Raw response: #{response}") if response.instance_of?(HTTPX::ErrorResponse) return { - message: response.to_s, - response_headers: response.response&.headers&.to_s, - response_body: response.response&.body&.to_s, - status: response.response&.status + message: response.error&.message, + details: response.to_s } end diff --git a/lib/zatca/version.rb b/lib/zatca/version.rb index 0f12650..97f0b98 100644 --- a/lib/zatca/version.rb +++ b/lib/zatca/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module ZATCA - VERSION = "1.0.2" + VERSION = "1.1.0" end