@@ -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
114122end
0 commit comments