Skip to content

Commit a22de53

Browse files
KRED-2061
handle array
1 parent 7308711 commit a22de53

4 files changed

Lines changed: 89 additions & 33 deletions

File tree

lib/xendit_api/client.rb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,10 @@ def initialize(authorization = nil, options = {})
3030

3131
logger = find_logger(options[:logger])
3232
if logger
33-
connection.response :logger, logger, { headers: false, bodies: true, errors: true } do |_log|
34-
faraday.response :logger, {
35-
full_hide_params: options[:filtered_logs] || [],
36-
mask_params: options[:mask_params] || []
37-
}, formatter: FaradayLogFormatter
38-
end
33+
connection.response :logger, logger,
34+
full_hide_params: options[:filtered_logs] || [],
35+
mask_params: options[:mask_params] || [],
36+
formatter: XenditApi::Middleware::FaradayLogFormatter
3937
end
4038
connection.use XenditApi::Middleware::HandleResponseException, logger
4139
connection.adapter Faraday.default_adapter

lib/xendit_api/json_masker.rb

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,28 @@ def initialize(data, options = {})
2020
def to_hash
2121
return @data if @mask_params.empty? && @full_hide_params.empty?
2222

23-
filter(@data)
23+
case @data
24+
when Array
25+
@data.map do |item|
26+
if item.is_a?(Hash)
27+
XenditApi::JsonMasker.new(item, @options).to_hash
28+
else
29+
item
30+
end
31+
end
32+
when Hash
33+
filter(@data)
34+
else
35+
@data
36+
end
2437
end
2538

2639
private
2740

2841
# rubocop:disable Style/CaseLikeIf
2942
def filter(output)
43+
return output unless output.is_a?(Hash)
44+
3045
output.each do |key, value|
3146
output[key] = if value.is_a?(Hash)
3247
XenditApi::JsonMasker.new(value, @options).to_hash
Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,42 @@
11
require 'faraday/logging/formatter'
2+
require 'xendit_api/json_masker'
3+
require 'xendit_api/url_masker'
24

3-
class FaradayLogFormatter < Faraday::Logging::Formatter
4-
MAX_LOG_SIZE = 10_000
5+
module XenditApi
6+
module Middleware
7+
class FaradayLogFormatter < Faraday::Logging::Formatter
8+
MAX_LOG_SIZE = 10_000
59

6-
def initialize(env = {})
7-
@log_opts = env[:logger] || {}
8-
super(logger: env[:logger], options: env[:options])
9-
end
10+
def initialize(env = {})
11+
@logger = env[:logger]
12+
@options = env[:options]
13+
super(logger: env[:logger], options: env[:options])
14+
end
1015

11-
def request(env)
12-
masked_url = UrlMasker.mask(env[:url].to_s, @log_opts)
13-
Rails.logger.info "#{env[:method].upcase} #{masked_url}"
14-
return if env[:request_body].blank?
15-
return if env[:request_body].size > MAX_LOG_SIZE
16+
def request(env)
17+
masked_url = XenditApi::UrlMasker.mask(env[:url].to_s, @options)
18+
@logger.info "#{env[:method].upcase} #{masked_url}"
19+
return if env[:request_body].to_s.empty?
20+
return if env[:request_body].to_s.size > MAX_LOG_SIZE
1621

17-
message = {
18-
body: JsonMasker.mask(env[:request_body], @log_opts)
19-
}
20-
Rails.logger.info({ request: message }.to_json)
21-
end
22+
message = {
23+
body: XenditApi::JsonMasker.mask(env[:request_body], @options)
24+
}
25+
@logger.info({ request: message }.to_json)
26+
end
2227

23-
def response(env)
24-
return if env[:response_body].blank?
25-
return if env[:request_body].to_s.size > MAX_LOG_SIZE
28+
def response(env)
29+
return if env[:response_body].to_s.empty?
30+
return if env[:request_body].to_s.size > MAX_LOG_SIZE
2631

27-
message = {
28-
status: env[:status],
29-
body: JsonMasker.mask(env[:response_body], @log_opts)
30-
}
31-
Rails.logger.info({ response: message }.to_json)
32-
end
32+
message = {
33+
status: env[:status],
34+
body: XenditApi::JsonMasker.mask(env[:response_body], @options)
35+
}
36+
@logger.info({ response: message }.to_json)
37+
end
3338

34-
def exception(exc); end
39+
def exception(exc); end
40+
end
41+
end
3542
end

spec/xendit_api/json_masker_spec.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,42 @@
1515
expect(described_class.mask([], mask_params: %w[card_number expiration_date cvv name email], full_hide_params: %w[amount account_number])).to eq([])
1616
end
1717

18+
it 'returns expected when data is an array' do
19+
parsed = [
20+
{
21+
card_number: '123456789012',
22+
cvv: '123',
23+
address: 'Jakarta',
24+
email: 'hello@email.com'
25+
},
26+
{
27+
card_number: '123456789012',
28+
cvv: '123',
29+
address: 'Jakarta',
30+
email: 'hello@email.com'
31+
}
32+
]
33+
34+
masked = [
35+
{
36+
'card_number' => '*****',
37+
'cvv' => '*****',
38+
'address' => 'Jakarta',
39+
'email' => 'hel************'
40+
},
41+
{
42+
'card_number' => '*****',
43+
'cvv' => '*****',
44+
'address' => 'Jakarta',
45+
'email' => 'hel************'
46+
}
47+
]
48+
49+
output = described_class.mask(parsed.to_json, mask_params: %w[email], full_hide_params: %w[card_number cvv])
50+
51+
expect(output).to eq(masked)
52+
end
53+
1854
it 'returns expected with valid JSON' do
1955
parsed = {
2056
card_number: '1234567890123456',

0 commit comments

Comments
 (0)