@@ -58,47 +58,49 @@ def fetch_segments(api_key, api_host, user_key, user_value, segments_to_check)
58
58
)
59
59
rescue SocketError , Timeout ::Error , Net ::ProtocolError , Errno ::ECONNRESET => e
60
60
@logger . log ( Logger ::DEBUG , "GraphQL download failed: #{ e } " )
61
- log_failure ( 'network error' )
61
+ log_segments_failure ( 'network error' )
62
62
return nil
63
63
rescue Errno ::EINVAL , Net ::HTTPBadResponse , Net ::HTTPHeaderSyntaxError , HTTPUriError => e
64
- log_failure ( e )
64
+ log_segments_failure ( e )
65
65
return nil
66
66
end
67
67
68
68
status = response . code . to_i
69
69
if status >= 400
70
- log_failure ( status )
70
+ log_segments_failure ( status )
71
71
return nil
72
72
end
73
73
74
74
begin
75
75
response = JSON . parse ( response . body )
76
76
rescue JSON ::ParserError
77
- log_failure ( 'JSON decode error' )
77
+ log_segments_failure ( 'JSON decode error' )
78
78
return nil
79
79
end
80
80
81
81
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 )
85
86
else
86
- log_failure ( error_class )
87
+ error_class = extract_component ( error , 'extensions' , 'classification' ) || 'decode error'
88
+ log_segments_failure ( error_class )
87
89
end
88
90
return nil
89
91
end
90
92
91
- audiences = response . dig ( 'data' , 'customer' , 'audiences' , 'edges' )
93
+ audiences = extract_component ( response , 'data' , 'customer' , 'audiences' , 'edges' )
92
94
unless audiences
93
- log_failure ( 'decode error' )
95
+ log_segments_failure ( 'decode error' )
94
96
return nil
95
97
end
96
98
97
99
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' )
100
102
unless name && state
101
- log_failure ( 'decode error' )
103
+ log_segments_failure ( 'decode error' )
102
104
return nil
103
105
end
104
106
state == 'qualified' ? name : nil
@@ -107,8 +109,14 @@ def fetch_segments(api_key, api_host, user_key, user_value, segments_to_check)
107
109
108
110
private
109
111
110
- def log_failure ( message , level = Logger ::ERROR )
112
+ def log_segments_failure ( message , level = Logger ::ERROR )
111
113
@logger . log ( level , format ( Optimizely ::Helpers ::Constants ::ODP_LOGS [ :FETCH_SEGMENTS_FAILED ] , message ) )
112
114
end
115
+
116
+ def extract_component ( hash , *components )
117
+ hash . dig ( *components ) if hash . is_a? Hash
118
+ rescue TypeError
119
+ nil
120
+ end
113
121
end
114
122
end
0 commit comments