diff --git a/lib/shopify_api/clients/graphql/client.rb b/lib/shopify_api/clients/graphql/client.rb index 958cc2166..35db8a0ec 100644 --- a/lib/shopify_api/clients/graphql/client.rb +++ b/lib/shopify_api/clients/graphql/client.rb @@ -42,6 +42,7 @@ def query(query:, variables: nil, headers: nil, tries: 1) body_type: "application/json", tries: tries, ), + response_as_struct: Context.response_as_struct || false, ) end end diff --git a/lib/shopify_api/clients/http_client.rb b/lib/shopify_api/clients/http_client.rb index 260ade137..30480f443 100644 --- a/lib/shopify_api/clients/http_client.rb +++ b/lib/shopify_api/clients/http_client.rb @@ -32,8 +32,8 @@ def initialize(base_path:, session: nil) end end - sig { params(request: HttpRequest).returns(HttpResponse) } - def request(request) + sig { params(request: HttpRequest, response_as_struct: T::Boolean).returns(HttpResponse) } + def request(request, response_as_struct: false) request.verify headers = @headers @@ -60,6 +60,11 @@ def request(request) body = res.body end + if response_as_struct && body.is_a?(Hash) + json_body = body.to_json + body = JSON.parse(json_body, object_class: OpenStruct) + end + response = HttpResponse.new(code: res.code.to_i, headers: res.headers.to_h, body: body) if response.headers["x-shopify-api-deprecated-reason"] diff --git a/lib/shopify_api/clients/http_response.rb b/lib/shopify_api/clients/http_response.rb index 985e2fbb2..0196a6e3f 100644 --- a/lib/shopify_api/clients/http_response.rb +++ b/lib/shopify_api/clients/http_response.rb @@ -22,18 +22,13 @@ class HttpResponse params( code: Integer, headers: T::Hash[String, T::Array[String]], - body: T.any(T::Hash[String, T.untyped], String), + body: T.any(T::Hash[String, T.untyped], String, OpenStruct), ).void end def initialize(code:, headers:, body:) @code = code @headers = headers - @body = T.let(body, T.any(OpenStruct, T::Hash[String, T.untyped], String)) - - if Context.graphql_response_object && body.is_a?(Hash) - json_body = body.to_json -+ @body = JSON.parse(json_body, object_class: OpenStruct) - end + @body = body @prev_page_info = T.let(nil, T.nilable(String)) @next_page_info = T.let(nil, T.nilable(String)) diff --git a/lib/shopify_api/context.rb b/lib/shopify_api/context.rb index 5b0f58774..6edc077c3 100644 --- a/lib/shopify_api/context.rb +++ b/lib/shopify_api/context.rb @@ -21,7 +21,7 @@ class Context @active_session = T.let(Concurrent::ThreadLocalVar.new { nil }, T.nilable(Concurrent::ThreadLocalVar)) @user_agent_prefix = T.let(nil, T.nilable(String)) @old_api_secret_key = T.let(nil, T.nilable(String)) - @graphql_response_object = T.let(false, T.nilable(T::Boolean)) + @response_as_struct = T.let(false, T.nilable(T::Boolean)) @rest_resource_loader = T.let(nil, T.nilable(Zeitwerk::Loader)) @@ -44,7 +44,7 @@ class << self user_agent_prefix: T.nilable(String), old_api_secret_key: T.nilable(String), api_host: T.nilable(String), - graphql_response_object: T.nilable(T::Boolean), + response_as_struct: T.nilable(T::Boolean), ).void end def setup( @@ -62,7 +62,7 @@ def setup( user_agent_prefix: nil, old_api_secret_key: nil, api_host: nil, - graphql_response_object: false + response_as_struct: false ) unless ShopifyAPI::AdminVersions::SUPPORTED_ADMIN_VERSIONS.include?(api_version) raise Errors::UnsupportedVersionError, @@ -81,7 +81,7 @@ def setup( @private_shop = private_shop @user_agent_prefix = user_agent_prefix @old_api_secret_key = old_api_secret_key - @graphql_response_object = graphql_response_object + @response_as_struct = response_as_struct @log_level = if valid_log_level?(log_level) log_level.to_sym else @@ -133,7 +133,7 @@ def load_rest_resources(api_version:) attr_reader :log_level sig { returns T.nilable(T::Boolean) } - attr_reader :graphql_response_object + attr_reader :response_as_struct sig { returns(T::Boolean) } def private? diff --git a/test/clients/http_client_test.rb b/test/clients/http_client_test.rb index 2f065bb7a..d1261eba7 100644 --- a/test/clients/http_client_test.rb +++ b/test/clients/http_client_test.rb @@ -270,6 +270,16 @@ def test_json_parser_error assert_equal(502, error.code) end + def test_response_as_struct + stub_request(@request.http_method, "https://#{@shop}#{@base_path}/#{@request.path}") + .with(body: @request.body.to_json, query: @request.query, headers: @expected_headers) + .to_return(body: { "key" => { "nested_key" => "nested_value" } }.to_json, headers: @response_headers) + + response = @client.request(@request, response_as_struct: true) + assert_kind_of(OpenStruct, response.body) + assert_equal("nested_value", response.body.key.nested_key) + end + private def simple_http_test(http_method) diff --git a/test/clients/http_response_test.rb b/test/clients/http_response_test.rb index 226c763d9..98eefff30 100644 --- a/test/clients/http_response_test.rb +++ b/test/clients/http_response_test.rb @@ -45,15 +45,6 @@ def test_next_and_prev assert_equal("page-info", response.prev_page_info) assert_equal("other-page-info", response.next_page_info) end - - def test_object_response - modify_context(graphql_response_object: true) - - # We need to verify that the response body is an OpenStruct object - response = ShopifyAPI::Clients::HttpResponse.new(code: 200, headers: {}, body: { "key" => { "nested_key" => "nested_value" }}) - assert_kind_of(OpenStruct, response.body) - assert_equal("nested_value", response.body.key.nested_key) - end end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index a6224ba4b..d389c9d08 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -51,7 +51,7 @@ def setup private_shop: T.nilable(String), user_agent_prefix: T.nilable(String), old_api_secret_key: T.nilable(String), - graphql_response_object: T.nilable(T::Boolean), + response_as_struct: T.nilable(T::Boolean), ).void end def modify_context( @@ -66,7 +66,7 @@ def modify_context( private_shop: "do-not-set", user_agent_prefix: nil, old_api_secret_key: nil, - graphql_response_object: nil + response_as_struct: nil ) ShopifyAPI::Context.setup( api_key: api_key ? api_key : ShopifyAPI::Context.api_key, @@ -81,7 +81,7 @@ def modify_context( user_agent_prefix: user_agent_prefix ? user_agent_prefix : ShopifyAPI::Context.user_agent_prefix, old_api_secret_key: old_api_secret_key ? old_api_secret_key : ShopifyAPI::Context.old_api_secret_key, log_level: :off, - graphql_response_object: graphql_response_object || ShopifyAPI::Context.graphql_response_object, + response_as_struct: response_as_struct || ShopifyAPI::Context.response_as_struct, ) end end