summaryrefslogtreecommitdiff
path: root/app/graphql/resolvers/concerns/caching_array_resolver.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/resolvers/concerns/caching_array_resolver.rb')
-rw-r--r--app/graphql/resolvers/concerns/caching_array_resolver.rb17
1 files changed, 16 insertions, 1 deletions
diff --git a/app/graphql/resolvers/concerns/caching_array_resolver.rb b/app/graphql/resolvers/concerns/caching_array_resolver.rb
index 4f2c8b98928..e7555dcf42c 100644
--- a/app/graphql/resolvers/concerns/caching_array_resolver.rb
+++ b/app/graphql/resolvers/concerns/caching_array_resolver.rb
@@ -43,8 +43,10 @@
# (i.e. `resolve(**args).sync == query_for(query_input(**args)).to_a`).
#
# Classes may implement:
-# - #item_found(A, R) (return value is ignored)
# - max_union_size Integer (the maximum number of queries to run in any one union)
+# - preload -> Preloads|NilClass (a set of preloads to apply to each query)
+# - #item_found(A, R) (return value is ignored)
+# - allowed?(R) -> Boolean (if this method returns false, the value is not resolved)
module CachingArrayResolver
MAX_UNION_SIZE = 50
@@ -62,6 +64,7 @@ module CachingArrayResolver
queries.in_groups_of(max_union_size, false).each do |group|
by_id = model_class
.from_union(tag(group), remove_duplicates: false)
+ .preload(preload) # rubocop: disable CodeReuse/ActiveRecord
.group_by { |r| r[primary_key] }
by_id.values.each do |item_group|
@@ -75,6 +78,16 @@ module CachingArrayResolver
end
end
+ # Override to apply filters on a per-item basis
+ def allowed?(item)
+ true
+ end
+
+ # Override to specify preloads for each query
+ def preload
+ nil
+ end
+
# Override this to intercept the items once they are found
def item_found(query_input, item)
end
@@ -94,6 +107,8 @@ module CachingArrayResolver
end
def found(loader, key, value)
+ return unless allowed?(value)
+
loader.call(key) do |vs|
item_found(key, value)
vs << value