Skip to content

Commit 016fbb5

Browse files
[FSSDK-9130] fix: invalid identifier error code (#335)
* fix invalid identifier error code
1 parent 0cb4940 commit 016fbb5

File tree

2 files changed

+24
-15
lines changed

2 files changed

+24
-15
lines changed

lib/optimizely/odp/odp_segment_api_manager.rb

+22-14
Original file line numberDiff line numberDiff line change
@@ -58,47 +58,49 @@ def fetch_segments(api_key, api_host, user_key, user_value, segments_to_check)
5858
)
5959
rescue SocketError, Timeout::Error, Net::ProtocolError, Errno::ECONNRESET => e
6060
@logger.log(Logger::DEBUG, "GraphQL download failed: #{e}")
61-
log_failure('network error')
61+
log_segments_failure('network error')
6262
return nil
6363
rescue Errno::EINVAL, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, HTTPUriError => e
64-
log_failure(e)
64+
log_segments_failure(e)
6565
return nil
6666
end
6767

6868
status = response.code.to_i
6969
if status >= 400
70-
log_failure(status)
70+
log_segments_failure(status)
7171
return nil
7272
end
7373

7474
begin
7575
response = JSON.parse(response.body)
7676
rescue JSON::ParserError
77-
log_failure('JSON decode error')
77+
log_segments_failure('JSON decode error')
7878
return nil
7979
end
8080

8181
if response.include?('errors')
82-
error_class = response['errors']&.first&.dig('extensions', 'classification') || 'decode error'
83-
if error_class == 'InvalidIdentifierException'
84-
log_failure('invalid identifier', Logger::WARN)
82+
error = response['errors'].first if response['errors'].is_a? Array
83+
error_code = extract_component(error, 'extensions', 'code')
84+
if error_code == 'INVALID_IDENTIFIER_EXCEPTION'
85+
log_segments_failure('invalid identifier', Logger::WARN)
8586
else
86-
log_failure(error_class)
87+
error_class = extract_component(error, 'extensions', 'classification') || 'decode error'
88+
log_segments_failure(error_class)
8789
end
8890
return nil
8991
end
9092

91-
audiences = response.dig('data', 'customer', 'audiences', 'edges')
93+
audiences = extract_component(response, 'data', 'customer', 'audiences', 'edges')
9294
unless audiences
93-
log_failure('decode error')
95+
log_segments_failure('decode error')
9496
return nil
9597
end
9698

9799
audiences.filter_map do |edge|
98-
name = edge.dig('node', 'name')
99-
state = edge.dig('node', 'state')
100+
name = extract_component(edge, 'node', 'name')
101+
state = extract_component(edge, 'node', 'state')
100102
unless name && state
101-
log_failure('decode error')
103+
log_segments_failure('decode error')
102104
return nil
103105
end
104106
state == 'qualified' ? name : nil
@@ -107,8 +109,14 @@ def fetch_segments(api_key, api_host, user_key, user_value, segments_to_check)
107109

108110
private
109111

110-
def log_failure(message, level = Logger::ERROR)
112+
def log_segments_failure(message, level = Logger::ERROR)
111113
@logger.log(level, format(Optimizely::Helpers::Constants::ODP_LOGS[:FETCH_SEGMENTS_FAILED], message))
112114
end
115+
116+
def extract_component(hash, *components)
117+
hash.dig(*components) if hash.is_a? Hash
118+
rescue TypeError
119+
nil
120+
end
113121
end
114122
end

spec/odp/odp_segment_api_manager_spec.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@
9191
'customer'
9292
],
9393
extensions: {
94-
classification: 'InvalidIdentifierException'
94+
classification: 'DataFetchingException',
95+
code: 'INVALID_IDENTIFIER_EXCEPTION'
9596
}
9697
}
9798
],

0 commit comments

Comments
 (0)