Class: Decidim::Api::RecursionAnalyzer
- Inherits:
-
GraphQL::Analysis::AST::Analyzer
- Object
- GraphQL::Analysis::AST::Analyzer
- Decidim::Api::RecursionAnalyzer
- Defined in:
- lib/decidim/api/recursion_analyzer.rb
Constant Summary collapse
- IGNORED_FIELDS =
%w(node edges nodes ofType).freeze
- RECURSION_THRESHOLD =
2
Instance Method Summary collapse
-
#initialize(query) ⇒ RecursionAnalyzer
constructor
A new instance of RecursionAnalyzer.
- #on_enter_field(node, _parent, visitor) ⇒ Object
-
#on_leave_field(node, _parent, visitor) ⇒ Object
Visitors are all defined on the AST::Analyzer base class We override them for custom analyzers.
- #result ⇒ Object
Constructor Details
#initialize(query) ⇒ RecursionAnalyzer
Returns a new instance of RecursionAnalyzer.
16 17 18 19 20 21 |
# File 'lib/decidim/api/recursion_analyzer.rb', line 16 def initialize(query) super @node_visits = {} @recurring_fields = {} end |
Instance Method Details
#on_enter_field(node, _parent, visitor) ⇒ Object
23 24 25 26 27 28 29 30 31 32 |
# File 'lib/decidim/api/recursion_analyzer.rb', line 23 def on_enter_field(node, _parent, visitor) return if skip_node?(node, visitor) node_name = node.name node_visits[node_name] ||= 0 node_visits[node_name] += 1 times_encountered = @node_visits[node_name] recurring_fields[node_name] = times_encountered if recursion_too_deep?(node_name, times_encountered) end |
#on_leave_field(node, _parent, visitor) ⇒ Object
Visitors are all defined on the AST::Analyzer base class We override them for custom analyzers.
36 37 38 39 40 41 42 |
# File 'lib/decidim/api/recursion_analyzer.rb', line 36 def on_leave_field(node, _parent, visitor) return if skip_node?(node, visitor) node_name = node.name node_visits[node_name] ||= 0 node_visits[node_name] -= 1 end |
#result ⇒ Object
44 45 46 47 48 |
# File 'lib/decidim/api/recursion_analyzer.rb', line 44 def result @recurring_fields = @recurring_fields.select { |k, v| recursion_too_deep?(k, v) } Decidim::Api::Errors::RecursionLimitExceededError.new I18n.t("decidim.api.errors.recursion_limit_exceeded_error") if @recurring_fields.any? end |