Commit 9781ac55 authored by Bob Van Landuyt's avatar Bob Van Landuyt
Browse files

Include pagination when rendering expanded hierarchies

parent 3907962e5b25
module WithPagination
attr_accessor :paginator
def with_pagination(request, response)
tap { @paginator = Gitlab::Serializer::Pagination.new(request, response) }
tap { self.paginator = Gitlab::Serializer::Pagination.new(request, response) }
end
def paginated?
@paginator.present?
paginator.present?
end
# super is `BaseSerializer#represent` here.
......
class GroupChildSerializer < BaseSerializer
include WithPagination
attr_reader :hierarchy_root
attr_reader :hierarchy_root, :should_expand_hierarchy
entity GroupChildEntity
def expand_hierarchy(hierarchy_root = nil)
@hierarchy_root = hierarchy_root
@expand_hierarchy = true
self
tap do
@hierarchy_root = hierarchy_root
@should_expand_hierarchy = true
end
end
def represent(resource, opts = {}, entity_class = nil)
if @expand_hierarchy
if should_expand_hierarchy
paginator.paginate(resource) if paginated?
represent_hierarchies(resource, opts)
else
super(resource, opts)
......@@ -33,15 +35,15 @@ def represent_hierarchies(children, opts)
def represent_hierarchy(hierarchy, opts)
serializer = self.class.new(parameters)
result = if hierarchy.is_a?(Hash)
hierarchy.map do |parent, children|
serializer.represent(parent, opts)
.merge(children: Array.wrap(serializer.represent_hierarchy(children, opts)))
end
else
serializer.represent(hierarchy, opts)
end
result
if hierarchy.is_a?(Hash)
hierarchy.map do |parent, children|
serializer.represent(parent, opts)
.merge(children: Array.wrap(serializer.represent_hierarchy(children, opts)))
end
elsif hierarchy.is_a?(Array)
hierarchy.map { |child| serializer.represent_hierarchy(child, opts) }
else
serializer.represent(hierarchy, opts)
end
end
end
......@@ -152,6 +152,10 @@
describe 'GET #show' do
context 'pagination' do
before do
allow(Kaminari.config).to receive(:default_per_page).and_return(2)
end
context 'with only projects' do
let!(:other_project) { create(:project, :public, namespace: group) }
let!(:first_page_projects) { create_list(:project, Kaminari.config.default_per_page, :public, namespace: group ) }
......@@ -288,6 +292,14 @@
expect(group_json['id']).to eq(public_subgroup.id)
expect(matched_group_json['id']).to eq(matched_group.id)
end
it 'includes pagination headers' do
2.times { |i| create(:group, :public, parent: public_subgroup, name: "filterme#{i}") }
get :children, id: group.to_param, filter: 'filter', per_page: 1, format: :json
expect(response).to include_pagination_headers
end
end
context 'queries per rendered element', :request_store do
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment