setsuzoku 0.11.8 → 0.12.57
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -10
- data/lib/setsuzoku.rb +1 -2
- data/lib/setsuzoku/api_strategy.rb +6 -4
- data/lib/setsuzoku/auth_strategy.rb +28 -14
- data/lib/setsuzoku/credential.rb +16 -0
- data/lib/setsuzoku/has_config_context.rb +27 -0
- data/lib/setsuzoku/pluggable.rb +6 -4
- data/lib/setsuzoku/plugin.rb +1 -1
- data/lib/setsuzoku/rspec/dynamic_spec_helper.rb +4 -3
- data/lib/setsuzoku/service.rb +1 -1
- data/lib/setsuzoku/service/web_service.rb +6 -2
- data/lib/setsuzoku/service/web_service/api_strategies/rest_strategy.rb +35 -16
- data/lib/setsuzoku/service/web_service/api_strategy.rb +16 -9
- data/lib/setsuzoku/service/web_service/auth_strategies/basic_auth_strategy.rb +6 -4
- data/lib/setsuzoku/service/web_service/auth_strategies/custom_auth_strategy.rb +66 -0
- data/lib/setsuzoku/service/web_service/auth_strategies/o_auth_strategy.rb +25 -88
- data/lib/setsuzoku/service/web_service/auth_strategies/strategy_can_use_tokens.rb +175 -0
- data/lib/setsuzoku/service/web_service/auth_strategy.rb +1 -14
- data/lib/setsuzoku/service/web_service/credentials/basic_auth_credential.rb +3 -3
- data/lib/setsuzoku/service/web_service/credentials/custom_auth_credential.rb +46 -0
- data/lib/setsuzoku/service/web_service/credentials/o_auth_credential.rb +41 -35
- data/lib/setsuzoku/service/web_service/credentials/uses_credential_token.rb +68 -0
- data/lib/setsuzoku/service/web_service/service.rb +2 -1
- data/lib/setsuzoku/version.rb +1 -1
- data/setsuzoku.gemspec +0 -1
- data/sorbet/rbi/gems/activesupport.rbi +4 -54
- data/sorbet/rbi/gems/i18n.rbi +2 -2
- data/sorbet/rbi/gems/rspec-core.rbi +3 -155
- data/sorbet/rbi/gems/rspec-expectations.rbi +2 -6
- data/sorbet/rbi/gems/rspec-mocks.rbi +1 -5
- data/sorbet/rbi/gems/rspec-support.rbi +63 -74
- data/sorbet/rbi/gems/rspec.rbi +1 -1
- data/sorbet/rbi/gems/webmock.rbi +1 -5
- data/sorbet/rbi/hidden-definitions/hidden.rbi +3651 -619
- data/sorbet/rbi/sorbet-typed/lib/activesupport/all/activesupport.rbi +17 -17
- data/sorbet/rbi/sorbet-typed/lib/faraday/all/faraday.rbi +685 -0
- data/sorbet/rbi/todo.rbi +1 -0
- metadata +8 -20
- data/lib/setsuzoku/utilities.rb +0 -7
- data/sorbet/rbi/sorbet-typed/lib/bundler/all/bundler.rbi +0 -8684
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/open3.rbi +0 -111
- data/sorbet/rbi/sorbet-typed/lib/ruby/all/resolv.rbi +0 -543
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 354bcd90c475c2613cf86f61b262da5d4437e882ef35cec8f275c19dd3aa2a00
|
4
|
+
data.tar.gz: 864a061588fa66caab9cf5d811bd1e437a9f3a6f58e7869c2d93f94971f68554
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8577f822f98a0185f68d994043f5021ad375672279a93c9e148918e4a8ada56b1bfae756f2d15b4639ea5aab58223349cd31f0ce6386e5cca2b0997b56c34bbb
|
7
|
+
data.tar.gz: 9f4924eb243e5c7c801325d793f6875efc2e50100c95cc271dc49edefae07793366484e7e805f432fa3a0a2461d1a3018a08bce2585c365da7fcb4e7bc79e9fc
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
setsuzoku (0.
|
4
|
+
setsuzoku (0.12.57)
|
5
5
|
activesupport (~> 5.0)
|
6
6
|
faraday (~> 0.11)
|
7
|
-
httparty (~> 0.16.4)
|
8
7
|
nokogiri (~> 1.10)
|
9
8
|
sorbet-runtime (~> 0.5)
|
10
9
|
|
@@ -25,17 +24,10 @@ GEM
|
|
25
24
|
faraday (0.17.3)
|
26
25
|
multipart-post (>= 1.2, < 3)
|
27
26
|
hashdiff (1.0.1)
|
28
|
-
httparty (0.16.4)
|
29
|
-
mime-types (~> 3.0)
|
30
|
-
multi_xml (>= 0.5.2)
|
31
27
|
i18n (1.8.5)
|
32
28
|
concurrent-ruby (~> 1.0)
|
33
|
-
mime-types (3.3.1)
|
34
|
-
mime-types-data (~> 3.2015)
|
35
|
-
mime-types-data (3.2020.0512)
|
36
29
|
mini_portile2 (2.4.0)
|
37
30
|
minitest (5.14.1)
|
38
|
-
multi_xml (0.6.0)
|
39
31
|
multipart-post (2.1.1)
|
40
32
|
nokogiri (1.10.10)
|
41
33
|
mini_portile2 (~> 2.4.0)
|
@@ -57,7 +49,7 @@ GEM
|
|
57
49
|
safe_yaml (1.0.5)
|
58
50
|
sorbet (0.5.5675)
|
59
51
|
sorbet-static (= 0.5.5675)
|
60
|
-
sorbet-runtime (0.5.
|
52
|
+
sorbet-runtime (0.5.5924)
|
61
53
|
sorbet-static (0.5.5675-universal-darwin-14)
|
62
54
|
thread_safe (0.3.6)
|
63
55
|
tzinfo (1.2.7)
|
data/lib/setsuzoku.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# typed: true
|
2
2
|
|
3
3
|
require 'faraday'
|
4
|
-
require 'httparty'
|
5
4
|
require 'nokogiri'
|
6
5
|
require 'sorbet-runtime'
|
7
6
|
require 'active_support'
|
@@ -10,6 +9,7 @@ require 'active_support'
|
|
10
9
|
module Setsuzoku
|
11
10
|
|
12
11
|
autoload :ApiResponse, 'setsuzoku/api_response'
|
12
|
+
autoload :HasConfigContext, 'setsuzoku/has_config_context'
|
13
13
|
autoload :ApiStrategy, 'setsuzoku/api_strategy'
|
14
14
|
autoload :AuthStrategy, 'setsuzoku/auth_strategy'
|
15
15
|
autoload :Credential, 'setsuzoku/credential'
|
@@ -18,7 +18,6 @@ module Setsuzoku
|
|
18
18
|
autoload :Pluggable, 'setsuzoku/pluggable'
|
19
19
|
autoload :Service, 'setsuzoku/service' #needs to load before plugin
|
20
20
|
autoload :Plugin, 'setsuzoku/plugin'
|
21
|
-
autoload :Utilities, 'setsuzoku/utilities'
|
22
21
|
autoload :VERSION, 'setsuzoku/version'
|
23
22
|
|
24
23
|
@@external_api_handler = ExternalApiHandler
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: ignore
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Setsuzoku
|
@@ -7,10 +7,12 @@ module Setsuzoku
|
|
7
7
|
#
|
8
8
|
# Defines all necessary methods for handling interfacing with an external API/Service for any authentication strategy.
|
9
9
|
module ApiStrategy
|
10
|
-
|
11
10
|
extend Forwardable
|
12
11
|
extend T::Sig
|
13
12
|
extend T::Helpers
|
13
|
+
|
14
|
+
include HasConfigContext
|
15
|
+
|
14
16
|
abstract!
|
15
17
|
|
16
18
|
attr_accessor :current_action
|
@@ -35,8 +37,8 @@ module Setsuzoku
|
|
35
37
|
))
|
36
38
|
end
|
37
39
|
def initialize(service:, **args)
|
38
|
-
#TODO: here we need to assign credentials etc, I think.
|
39
40
|
self.service = service
|
41
|
+
self.config_context = args
|
40
42
|
self
|
41
43
|
end
|
42
44
|
|
@@ -71,7 +73,7 @@ module Setsuzoku
|
|
71
73
|
exception = T.let(nil, T.nilable(Setsuzoku::Exception))
|
72
74
|
action_details = case strategy
|
73
75
|
when :auth
|
74
|
-
{ actions: self.
|
76
|
+
{ actions: self.auth_strategy.credential.auth_actions, url: self.auth_strategy.credential.auth_base_url }
|
75
77
|
when :webhook
|
76
78
|
{ actions: self.plugin.api_actions, url: self.plugin.webhook_base_url }
|
77
79
|
else
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: ignore
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Setsuzoku
|
@@ -7,21 +7,20 @@ module Setsuzoku
|
|
7
7
|
#
|
8
8
|
# Defines all necessary methods for handling authentication for any authentication strategy.
|
9
9
|
module AuthStrategy
|
10
|
-
|
11
10
|
extend Forwardable
|
12
11
|
extend T::Sig
|
13
12
|
extend T::Helpers
|
13
|
+
|
14
|
+
include HasConfigContext
|
15
|
+
|
14
16
|
abstract!
|
15
17
|
|
16
18
|
attr_accessor :service
|
17
19
|
attr_accessor :credential
|
18
20
|
def_delegators :@service, :plugin, :api_strategy, :external_api_handler
|
19
21
|
|
20
|
-
# Initialize the auth_strategy and provide reference to service.
|
21
|
-
#
|
22
|
-
# @param service [Service] the new instance of service with its correct strategies.
|
23
22
|
#
|
24
|
-
#
|
23
|
+
# initialize
|
25
24
|
sig(:final) do
|
26
25
|
params(
|
27
26
|
service: T.any(
|
@@ -31,19 +30,20 @@ module Setsuzoku
|
|
31
30
|
args: T.untyped
|
32
31
|
).returns(T.any(
|
33
32
|
Setsuzoku::Service::WebService::AuthStrategies::BasicAuthStrategy,
|
33
|
+
Setsuzoku::Service::WebService::AuthStrategies::CustomAuthStrategy,
|
34
34
|
Setsuzoku::Service::WebService::AuthStrategies::OAuthStrategy,
|
35
35
|
T.untyped
|
36
36
|
))
|
37
37
|
end
|
38
|
-
|
38
|
+
# Initialize the auth_strategy and provide reference to service.
|
39
|
+
#
|
40
|
+
# @param service [Service] the new instance of service with its correct strategies.
|
41
|
+
#
|
42
|
+
# @return [AuthStrategy] the new instance of auth_strategy
|
39
43
|
def initialize(service:, **args)
|
40
44
|
self.service = service
|
41
|
-
|
42
|
-
self.
|
43
|
-
credential
|
44
|
-
else
|
45
|
-
self.class.credential_class.stub_credential
|
46
|
-
end
|
45
|
+
self.set_credential!(self.class.credential_class.stub_credential) unless self.plugin.registered_instance
|
46
|
+
self.config_context = args
|
47
47
|
self
|
48
48
|
end
|
49
49
|
|
@@ -55,11 +55,25 @@ module Setsuzoku
|
|
55
55
|
self.plugin.get_registered_instance_val(@credential)
|
56
56
|
end
|
57
57
|
|
58
|
+
#
|
59
|
+
# set_credential!
|
60
|
+
sig { params(credential: T.untyped).void }
|
61
|
+
#
|
62
|
+
# Assign the credential to the auth_strategy.
|
63
|
+
#
|
64
|
+
# @return [void]
|
65
|
+
def set_credential!(credential)
|
66
|
+
if credential
|
67
|
+
self.credential = credential
|
68
|
+
credential.auth_strategy = self
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
58
72
|
# Check if a credential is valid.
|
59
73
|
# Additionally it should revalidate if invalid.
|
60
74
|
#
|
61
75
|
# @return [Boolean] true if the credential is valid.
|
62
|
-
sig {
|
76
|
+
sig { returns(T::Boolean) }
|
63
77
|
def auth_credential_valid?; end
|
64
78
|
|
65
79
|
# Authorize a credential for a specific auth_strategy.
|
data/lib/setsuzoku/credential.rb
CHANGED
@@ -6,8 +6,18 @@ module Setsuzoku
|
|
6
6
|
module Credential
|
7
7
|
extend T::Sig
|
8
8
|
extend T::Helpers
|
9
|
+
extend Forwardable
|
9
10
|
interface!
|
10
11
|
|
12
|
+
attr_accessor :auth_strategy
|
13
|
+
def_delegators :@auth_strategy, :plugin
|
14
|
+
|
15
|
+
# All auth actions that are implemented.
|
16
|
+
#
|
17
|
+
# @return [Hash] all auth endpoint definitions for the API.
|
18
|
+
sig { abstract.returns(T::Hash[T.untyped, T.untyped]) }
|
19
|
+
def auth_actions; end
|
20
|
+
|
11
21
|
# Create a stub implementation of the credential for testing purposes
|
12
22
|
#
|
13
23
|
# @return [Struct] a struct that implements stubbed version of a credential's required methods.
|
@@ -20,6 +30,12 @@ module Setsuzoku
|
|
20
30
|
sig { abstract.returns(String) }
|
21
31
|
def status; end
|
22
32
|
|
33
|
+
# Setter for the status of the credential.
|
34
|
+
#
|
35
|
+
# @return [Hash] the status of the credential.
|
36
|
+
sig { abstract.params(val: T.nilable(String)).returns(String) }
|
37
|
+
def status=(val); end
|
38
|
+
|
23
39
|
# A settings object for the credential.
|
24
40
|
#
|
25
41
|
# @return [Hash] the settings for the credential.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Setsuzoku
|
5
|
+
# Set of methods/functionality for managing a classes config_context
|
6
|
+
module HasConfigContext
|
7
|
+
extend T::Sig
|
8
|
+
extend T::Helpers
|
9
|
+
|
10
|
+
attr_accessor :config_context
|
11
|
+
|
12
|
+
#
|
13
|
+
# get_from_context
|
14
|
+
sig { params(method: Symbol).returns(T.untyped) }
|
15
|
+
#
|
16
|
+
# Retrieve a value from config_context or call the default method implementation for the class.
|
17
|
+
#
|
18
|
+
# @return [Any] the value of the key in config_context, or return value of the method.
|
19
|
+
def get_from_context(method)
|
20
|
+
if self.config_context.key?(method)
|
21
|
+
self.get_registered_instance_val(method)
|
22
|
+
else
|
23
|
+
self.send(method) if self.respond_to?(method)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/setsuzoku/pluggable.rb
CHANGED
@@ -64,10 +64,12 @@ module Setsuzoku
|
|
64
64
|
sig(:final) { params(options: T.untyped).void }
|
65
65
|
def register_plugin(**options)
|
66
66
|
options[:plugin_class].config_context[:required_instance_methods].each do |req_method|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
next if options[:required_instance_methods].key?(req_method)
|
68
|
+
raise Setsuzoku::Exception::UndefinedRequiredMethod.new(
|
69
|
+
registering_instance: self,
|
70
|
+
plugin_class: options[:plugin_class],
|
71
|
+
method_name: req_method
|
72
|
+
)
|
71
73
|
end
|
72
74
|
|
73
75
|
self.plugin_context = self.default_options.merge(options)
|
data/lib/setsuzoku/plugin.rb
CHANGED
@@ -18,7 +18,7 @@ module Setsuzoku
|
|
18
18
|
attr_accessor :registered_instance
|
19
19
|
attr_accessor :service
|
20
20
|
attr_accessor :config_context
|
21
|
-
def_delegators :@service, :auth_strategy, :api_strategy, :exception_handler, :call_external_api, :request_class, :new_credential!
|
21
|
+
def_delegators :@service, :auth_strategy, :api_strategy, :exception_handler, :call_external_api, :request_class, :new_credential!, :set_credential!
|
22
22
|
|
23
23
|
alias :plugin_service :service
|
24
24
|
alias :plugin_request_class :request_class
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: ignore
|
2
2
|
|
3
3
|
require 'active_support/core_ext/class/subclasses'
|
4
4
|
require 'active_support/inflector/methods'
|
@@ -153,11 +153,12 @@ module Setsuzoku
|
|
153
153
|
props.each do |propz|
|
154
154
|
plugin.api_strategy.current_action = action_name
|
155
155
|
default_headers = plugin.api_strategy.request_options(propz[:request_format])[:headers] || { 'Content-Type' => "application/#{propz[:request_format]}" }
|
156
|
+
auth_headers = plugin.auth_strategy.auth_headers || {}
|
156
157
|
if plugin.auth_strategy.is_a?(Setsuzoku::Service::WebService::AuthStrategies::BasicAuthStrategy)
|
157
|
-
basic_auth =
|
158
|
+
basic_auth = auth_headers[:authorization][:basic_auth]
|
158
159
|
auth_header = { 'Authorization' => "Basic #{Base64.encode64("#{basic_auth[:username]}:#{basic_auth[:password]}").gsub("\n", '')}" }
|
159
160
|
elsif plugin.auth_strategy.is_a?(Setsuzoku::Service::WebService::AuthStrategies::OAuthStrategy)
|
160
|
-
auth_header = { 'Authorization' => "Bearer #{
|
161
|
+
auth_header = { 'Authorization' => "Bearer #{auth_headers[:authorization][:token]}" }
|
161
162
|
end
|
162
163
|
default_headers.merge!(auth_header) if auth_header
|
163
164
|
headers = propz[:headers] ? [propz[:headers]] : [default_headers]
|
data/lib/setsuzoku/service.rb
CHANGED
@@ -17,7 +17,7 @@ module Setsuzoku
|
|
17
17
|
attr_accessor :auth_strategy
|
18
18
|
attr_accessor :api_strategy
|
19
19
|
attr_accessor :external_api_handler
|
20
|
-
def_delegators :@auth_strategy, :new_credential!
|
20
|
+
def_delegators :@auth_strategy, :new_credential!, :set_credential!
|
21
21
|
def_delegators :@api_strategy, :call_external_api, :request_class
|
22
22
|
|
23
23
|
def self.included(klass)
|
@@ -6,10 +6,14 @@ require 'setsuzoku/service/web_service/auth_strategy'
|
|
6
6
|
require 'setsuzoku/service/web_service/service'
|
7
7
|
require 'setsuzoku/service/web_service/api_strategies/rest_strategy'
|
8
8
|
require 'setsuzoku/service/web_service/api_strategies/rest_api_request'
|
9
|
-
require 'setsuzoku/service/web_service/auth_strategies/
|
9
|
+
require 'setsuzoku/service/web_service/auth_strategies/strategy_can_use_tokens'
|
10
10
|
require 'setsuzoku/service/web_service/auth_strategies/basic_auth_strategy'
|
11
|
-
require 'setsuzoku/service/web_service/
|
11
|
+
require 'setsuzoku/service/web_service/auth_strategies/custom_auth_strategy'
|
12
|
+
require 'setsuzoku/service/web_service/auth_strategies/o_auth_strategy'
|
13
|
+
require 'setsuzoku/service/web_service/credentials/uses_credential_token'
|
12
14
|
require 'setsuzoku/service/web_service/credentials/basic_auth_credential'
|
15
|
+
require 'setsuzoku/service/web_service/credentials/custom_auth_credential'
|
16
|
+
require 'setsuzoku/service/web_service/credentials/o_auth_credential'
|
13
17
|
|
14
18
|
module Setsuzoku
|
15
19
|
module Service
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: ignore
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
require 'active_support/json'
|
@@ -31,35 +31,46 @@ module Setsuzoku
|
|
31
31
|
# @param options [Any] additional options needed to pass to correctly perform the request.
|
32
32
|
# options are:
|
33
33
|
# media_type - 'json'
|
34
|
+
# attachment_url_key - 'Symbol' the form field to post the attachment in the form.
|
35
|
+
# attachment_urls - 'Array<String>' List of attachment urls to be attached as form files.
|
34
36
|
#
|
35
37
|
# @return [Hash] the parsed response object.
|
36
38
|
sig { override.params(request: RestAPIRequest, action_details: T::Hash[T.untyped, T.untyped], options: T.untyped).returns(Faraday::Response) }
|
37
39
|
def perform_external_call(request:, action_details:, **options)
|
38
40
|
request_properties = self.get_request_properties(action_name: request.action, action_details: action_details, req_params: request.body)
|
39
41
|
request_options = self.request_options(request_properties[:request_format], action_details[:actions][request.action])
|
40
|
-
|
42
|
+
authorization = request_options.delete(:authorization)
|
41
43
|
full_request = self.formulate_request(request_properties, request_options)
|
42
44
|
|
43
45
|
@faraday = Faraday.new(url: request_properties[:formatted_full_url], request: { params_encoder: Faraday::FlatParamsEncoder }) do |faraday|
|
44
|
-
faraday.request(:multipart) if options[:
|
46
|
+
faraday.request(:multipart) if options[:attachment_urls].present?
|
45
47
|
faraday.request(:url_encoded)
|
46
48
|
#TODO: change these to faraday = self.auth_strategy.set_authorization!(request: faraday)
|
47
49
|
unless request.without_headers
|
48
|
-
if
|
49
|
-
|
50
|
-
|
51
|
-
|
50
|
+
if authorization
|
51
|
+
if authorization.key?(:token)
|
52
|
+
faraday.authorization(:Bearer, authorization[:token])
|
53
|
+
elsif authorization.key?(:basic_auth)
|
54
|
+
faraday.request(:basic_auth, authorization[:basic_auth][:username], authorization[:basic_auth][:password])
|
55
|
+
end
|
52
56
|
end
|
53
57
|
end
|
54
58
|
faraday.adapter Faraday.default_adapter
|
55
59
|
end
|
56
60
|
|
57
|
-
if options[:
|
61
|
+
if options[:attachment_urls].present?
|
58
62
|
resp = @faraday.post do |req|
|
59
|
-
io = StringIO.new(full_request)
|
60
63
|
payload = {}
|
61
|
-
|
62
|
-
|
64
|
+
attachments = options[:attachment_urls].map do |url|
|
65
|
+
image = open(url, 'rb')
|
66
|
+
Faraday::UploadIO.new(image, T.must(image).content_type, File.basename(url))
|
67
|
+
end
|
68
|
+
payload[options[:attachment_url_key]] = attachments
|
69
|
+
if request_properties[:request_format] == :json
|
70
|
+
payload[:json] = Faraday::UploadIO.new(StringIO.new(full_request), 'application/json')
|
71
|
+
else
|
72
|
+
payload.merge!(full_request)
|
73
|
+
end
|
63
74
|
req.body = payload
|
64
75
|
end
|
65
76
|
else
|
@@ -110,26 +121,34 @@ module Setsuzoku
|
|
110
121
|
# @return full_request [Hash/String] returns the request body in the format required
|
111
122
|
def formulate_request(request_properties = {}, request_options = {})
|
112
123
|
request_format = request_properties.dig(:request_format).to_s
|
124
|
+
params = request_properties[:req_params].merge(request_options.except(:headers))
|
113
125
|
|
114
126
|
if request_properties[:request_method] == :get || request_properties[:req_params].empty?
|
115
|
-
|
127
|
+
params
|
116
128
|
else
|
117
129
|
# if the header or request format include urlencoded return the body as a hash
|
118
130
|
if request_format.include?('urlencoded')
|
119
|
-
|
131
|
+
params
|
120
132
|
else
|
121
133
|
# return either xml or json
|
122
134
|
if request_properties[:request_format] == :xml
|
123
|
-
convert_hash_to_xml(
|
135
|
+
convert_hash_to_xml(params)
|
124
136
|
else
|
125
|
-
|
137
|
+
params.to_json
|
126
138
|
end
|
127
139
|
end
|
128
140
|
end
|
129
141
|
end
|
130
142
|
|
131
143
|
def request_options(request_format = nil, action_details = {})
|
132
|
-
request_options =
|
144
|
+
request_options = {}
|
145
|
+
(request_options = {})[:headers] = {}
|
146
|
+
request_options[:headers]
|
147
|
+
.merge!(self.auth_strategy.get_from_context(:auth_headers).except(:authorization))
|
148
|
+
.merge!(self.get_from_context(:api_headers))
|
149
|
+
.merge!(action_details[:request_options] || {})
|
150
|
+
request_options[:authorization] = self.auth_strategy.get_from_context(:auth_headers)[:authorization]
|
151
|
+
|
133
152
|
content_type = case request_format
|
134
153
|
when :json
|
135
154
|
'application/json'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# typed:
|
1
|
+
# typed: ignore
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module Setsuzoku
|
@@ -35,12 +35,6 @@ module Setsuzoku
|
|
35
35
|
sig { abstract.returns(T::Hash[T.untyped, T.untyped]) }
|
36
36
|
def api_actions; end
|
37
37
|
|
38
|
-
# Any api request headers that this service needs to set.
|
39
|
-
#
|
40
|
-
# @return [Hash]
|
41
|
-
sig { abstract.returns(T::Hash[Symbol, T.untyped]) }
|
42
|
-
def api_headers; end
|
43
|
-
|
44
38
|
# All dynamic url parameters provided by the plugin.
|
45
39
|
#
|
46
40
|
# @return [Hash(String)] all parameters that need to be replaced dynamically for url requests.
|
@@ -48,6 +42,17 @@ module Setsuzoku
|
|
48
42
|
def dynamic_url_params; end
|
49
43
|
end
|
50
44
|
|
45
|
+
#
|
46
|
+
# api_headers
|
47
|
+
sig { overridable.returns(T::Hash[Symbol, T.untyped]) }
|
48
|
+
#
|
49
|
+
# Specific API headers an API strategy must have when making requests.
|
50
|
+
#
|
51
|
+
# @return [Hash] the additional required headers for a request.
|
52
|
+
def api_headers
|
53
|
+
{}
|
54
|
+
end
|
55
|
+
|
51
56
|
# Perform the external call for the external API.
|
52
57
|
# Each WebService::ApiStrategy must define how this works.
|
53
58
|
#
|
@@ -68,7 +73,7 @@ module Setsuzoku
|
|
68
73
|
# Parse the response from the API for the given request.
|
69
74
|
# This should just convert JSON strings/XML/SQL rows to a formatted response Hash.
|
70
75
|
#
|
71
|
-
# @param response [
|
76
|
+
# @param response [Faraday::Response] the response from the HTTP request.
|
72
77
|
# @param options [Hash] the parsing options. Generally the response_type. e.g. :xml, :json
|
73
78
|
#
|
74
79
|
# @return [Hash] the parsed hash of the response object.
|
@@ -111,7 +116,9 @@ module Setsuzoku
|
|
111
116
|
def convert_xml_to_hash(xml)
|
112
117
|
begin
|
113
118
|
result = Nokogiri::XML(xml)
|
114
|
-
|
119
|
+
key = result.root.name.underscore.to_sym
|
120
|
+
val = xml_node_to_hash(result.root)
|
121
|
+
{ key => val }
|
115
122
|
rescue Exception => e
|
116
123
|
{}
|
117
124
|
end
|