diff options
Diffstat (limited to 'app/graphql/types/design_management/design_fields.rb')
-rw-r--r-- | app/graphql/types/design_management/design_fields.rb | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/app/graphql/types/design_management/design_fields.rb b/app/graphql/types/design_management/design_fields.rb index 364f72a519f..c3a35cfe1ad 100644 --- a/app/graphql/types/design_management/design_fields.rb +++ b/app/graphql/types/design_management/design_fields.rb @@ -43,13 +43,12 @@ module Types end def image_v432x230(parent:) - version = cached_stateful_version(parent) - action = design.actions.up_to_version(version).most_recent.first - - # A `nil` return value indicates that the image has not been processed - return unless action.image_v432x230.file + Gitlab::Graphql::Lazy.with_value(lazy_action(parent)) do |action| + # A `nil` return value indicates that the image has not been processed + next unless action&.image_v432x230&.file - Gitlab::UrlBuilder.build(design, ref: version.sha, size: :v432x230) + Gitlab::UrlBuilder.build(action.design, ref: action.version.sha, size: :v432x230) + end end def event(parent:) @@ -73,6 +72,25 @@ module Types def issue ::Gitlab::Graphql::Loaders::BatchModelLoader.new(::Issue, design.issue_id).find end + + private + + def lazy_action(parent) + version = cached_stateful_version(parent) + + BatchLoader::GraphQL.for([version, design]).batch do |ids, loader| + by_version = ids.group_by(&:first).transform_values { _1.map(&:second) } + designs_by_id = ids.map(&:second).index_by(&:id) + + by_version.each do |v, designs| + actions = ::DesignManagement::Action.most_recent.up_to_version(v).by_design(designs).with_version + actions.each do |action| + action.design = designs_by_id[action.design_id] # eliminate duplicate load + loader.call([v, action.design], action) + end + end + end + end end end end |