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

Include pagination when rendering expanded hierarchies

parent 20a08965
module WithPagination module WithPagination
attr_accessor :paginator
def with_pagination(request, response) def with_pagination(request, response)
tap { @paginator = Gitlab::Serializer::Pagination.new(request, response) } tap { self.paginator = Gitlab::Serializer::Pagination.new(request, response) }
end end
def paginated? def paginated?
@paginator.present? paginator.present?
end end
# super is `BaseSerializer#represent` here. # super is `BaseSerializer#represent` here.
......
class GroupChildSerializer < BaseSerializer class GroupChildSerializer < BaseSerializer
include WithPagination include WithPagination
attr_reader :hierarchy_root attr_reader :hierarchy_root, :should_expand_hierarchy
entity GroupChildEntity entity GroupChildEntity
def expand_hierarchy(hierarchy_root = nil) def expand_hierarchy(hierarchy_root = nil)
tap do
@hierarchy_root = hierarchy_root @hierarchy_root = hierarchy_root
@expand_hierarchy = true @should_expand_hierarchy = true
self end
end end
def represent(resource, opts = {}, entity_class = nil) def represent(resource, opts = {}, entity_class = nil)
if @expand_hierarchy if should_expand_hierarchy
paginator.paginate(resource) if paginated?
represent_hierarchies(resource, opts) represent_hierarchies(resource, opts)
else else
super(resource, opts) super(resource, opts)
...@@ -33,15 +35,15 @@ class GroupChildSerializer < BaseSerializer ...@@ -33,15 +35,15 @@ class GroupChildSerializer < BaseSerializer
def represent_hierarchy(hierarchy, opts) def represent_hierarchy(hierarchy, opts)
serializer = self.class.new(parameters) serializer = self.class.new(parameters)
result = if hierarchy.is_a?(Hash) if hierarchy.is_a?(Hash)
hierarchy.map do |parent, children| hierarchy.map do |parent, children|
serializer.represent(parent, opts) serializer.represent(parent, opts)
.merge(children: Array.wrap(serializer.represent_hierarchy(children, opts))) .merge(children: Array.wrap(serializer.represent_hierarchy(children, opts)))
end end
elsif hierarchy.is_a?(Array)
hierarchy.map { |child| serializer.represent_hierarchy(child, opts) }
else else
serializer.represent(hierarchy, opts) serializer.represent(hierarchy, opts)
end end
result
end end
end end
...@@ -152,6 +152,10 @@ describe GroupsController do ...@@ -152,6 +152,10 @@ describe GroupsController do
describe 'GET #show' do describe 'GET #show' do
context 'pagination' do context 'pagination' do
before do
allow(Kaminari.config).to receive(:default_per_page).and_return(2)
end
context 'with only projects' do context 'with only projects' do
let!(:other_project) { create(:project, :public, namespace: group) } let!(:other_project) { create(:project, :public, namespace: group) }
let!(:first_page_projects) { create_list(:project, Kaminari.config.default_per_page, :public, namespace: group ) } let!(:first_page_projects) { create_list(:project, Kaminari.config.default_per_page, :public, namespace: group ) }
...@@ -288,6 +292,14 @@ describe GroupsController do ...@@ -288,6 +292,14 @@ describe GroupsController do
expect(group_json['id']).to eq(public_subgroup.id) expect(group_json['id']).to eq(public_subgroup.id)
expect(matched_group_json['id']).to eq(matched_group.id) expect(matched_group_json['id']).to eq(matched_group.id)
end 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 end
context 'queries per rendered element', :request_store do 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