Skip to content

Commit

Permalink
Refs #38072 - add sorting support to bootc_image api
Browse files Browse the repository at this point in the history
  • Loading branch information
ianballou committed Dec 23, 2024
1 parent 8195888 commit c1b3695
Showing 1 changed file with 24 additions and 10 deletions.
34 changes: 24 additions & 10 deletions app/controllers/katello/api/v2/host_bootc_images_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,35 @@ class Api::V2::HostBootcImagesController < Api::V2::ApiController
end

api :GET, "/hosts/bootc_images", N_("List booted bootc container images for hosts")
param :page, :number, :desc => N_("Page number, starting at 1")
param :per_page, :number, :desc => N_("Number of results per page to return")
param_group :search, Api::V2::ApiController
def bootc_images
bootc_image_map = bootc_host_image_map(params[:search])

page = params[:page].present? ? params[:page].to_i : 1
params[:sort_by] ||= 'bootc_booted_image'
params[:sort_order] ||= 'asc'
if params[:order]
params[:order] = "#{params[:order].split(' ')[0]} #{sanitize_sort_order(params[:order].split(' ')[1])}"
else
params[:order] = "#{params[:sort_by]} #{sanitize_sort_order(params[:sort_order])}"
end
per_page = params[:per_page].present? ? params[:per_page].to_i : Setting[:entries_per_page]
page = params[:page].present? ? params[:page].to_i : 1

bootc_image_map = bootc_host_image_map
paged_images = bootc_image_map.to_a.paginate(page: page, per_page: per_page)
results = paged_images.collect { |image| { image_name: image[0], digests: image[1] } }
results = paged_images.collect { |image| { bootc_booted_image: image[0], digests: image[1] } }
render json: { total: bootc_image_map.size, page: page, per_page: per_page, subtotal: bootc_image_map.size, results: results}
end

private

def sanitize_sort_order(sort_order)
if sort_order.present? && ['asc', 'desc'].include?(sort_order.downcase)
sort_order.downcase
else
'asc'
end

Check failure on line 37 in app/controllers/katello/api/v2/host_bootc_images_controller.rb

View workflow job for this annotation

GitHub Actions / Rubocop / Rubocop

Layout/EmptyLinesAroundMethodBody: Extra empty line detected at method body end.
end

def index_relation
query = resource_class.authorized(:view_hosts).distinct
query.joins(:content_facet).where.not(bootc_booted_image: nil, bootc_booted_digest: nil)
Expand All @@ -32,12 +47,11 @@ def resource_class
::Host::Managed
end

def bootc_host_image_map(host_search)
# TODO: can this be optimized such that it doesn't require two queries?
content_facets = ::Katello::Host::ContentFacet.where(host_id: ::Host::Managed.joins(:content_facet).search_for(host_search).pluck(:id))
def bootc_host_image_map
content_facets = ::Katello::Host::ContentFacet.where(host_id: ::Host::Managed.joins(:content_facet).search_for(params[:search]).pluck(:id))
aggregate_bootc_data = content_facets.where.not(bootc_booted_image: nil, bootc_booted_digest: nil).
select(:bootc_booted_image, :bootc_booted_digest, 'COUNT(hosts.id) as host_count').
joins(:host).group(:bootc_booted_image, :bootc_booted_digest).order(:bootc_booted_image)
joins(:host).group(:bootc_booted_image, :bootc_booted_digest).order(params[:order])
bootc_image_map = Hash.new { |h, k| h[k] = [] }
aggregate_bootc_data.each do |host_image|
bootc_image_map[host_image.bootc_booted_image] << { bootc_booted_digest: host_image.bootc_booted_digest, host_count: host_image.host_count.to_i }
Expand Down

0 comments on commit c1b3695

Please sign in to comment.