diff options
Diffstat (limited to 'app/graphql/resolvers/issues/base_parent_resolver.rb')
-rw-r--r-- | app/graphql/resolvers/issues/base_parent_resolver.rb | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/app/graphql/resolvers/issues/base_parent_resolver.rb b/app/graphql/resolvers/issues/base_parent_resolver.rb new file mode 100644 index 00000000000..6308e56f049 --- /dev/null +++ b/app/graphql/resolvers/issues/base_parent_resolver.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +module Resolvers + module Issues + class BaseParentResolver < Issues::BaseResolver + prepend ::Issues::LookAheadPreloads + include ::Issues::SortArguments + + argument :state, Types::IssuableStateEnum, + required: false, + description: 'Current state of this issue.' + + # see app/graphql/types/issue_connection.rb + type 'Types::IssueConnection', null: true + + def resolve_with_lookahead(**args) + return Issue.none if resource_parent.nil? + + finder = IssuesFinder.new(current_user, prepare_finder_params(args)) + + issues = Gitlab::Graphql::Loaders::IssuableLoader.new(resource_parent, finder).batching_find_all do |q| + apply_lookahead(q) + end + + if non_stable_cursor_sort?(args[:sort]) + # Certain complex sorts are not supported by the stable cursor pagination yet. + # In these cases, we use offset pagination, so we return the correct connection. + offset_pagination(issues) + else + issues + end + end + + private + + def resource_parent + # The project could have been loaded in batch by `BatchLoader`. + # At this point we need the `id` of the project to query for issues, so + # make sure it's loaded and not `nil` before continuing. + strong_memoize(:resource_parent) do + object.respond_to?(:sync) ? object.sync : object + end + end + end + end +end + +Resolvers::Issues::BaseParentResolver.prepend_mod |