Encapsulate reused pagination component in a class

This commit is contained in:
Grzegorz Bizon 2017-02-02 14:37:11 +01:00
parent ac06070147
commit 030adf12ce
3 changed files with 42 additions and 28 deletions

View File

@ -7,12 +7,20 @@ class EnvironmentSerializer < BaseSerializer
tap { @itemize = true }
end
def with_pagination(request, response)
tap { @paginator = Paginator.new(request, response) }
end
def itemized?
@itemize
end
def paginated?
defined?(@paginator)
end
def represent(resource, opts = {})
# resource = paginate(resource) if paginated?
resource = @paginator.paginate(resource) if paginated?
if itemized?
itemize(resource).map do |item|

View File

@ -0,0 +1,23 @@
class Paginator
include API::Helpers::Pagination
def initialize(request, response)
@request = request
@response = response
end
private
# Methods needed by `API::Helpers::Pagination`
#
attr_reader :request
def params
@request.query_parameters
end
def header(header, value)
@response.headers[header] = value
end
end

View File

@ -1,41 +1,24 @@
class PipelineSerializer < BaseSerializer
class InvalidResourceError < StandardError; end
include API::Helpers::Pagination
Struct.new('Pagination', :request, :response)
entity PipelineEntity
def with_pagination(request, response)
tap { @paginator = Paginator.new(request, response) }
end
def paginated?
defined?(@paginator)
end
def represent(resource, opts = {})
if paginated?
raise InvalidResourceError unless resource.respond_to?(:page)
super(paginate(resource.includes(project: :namespace)), opts)
resource = resource.includes(project: :namespace)
super(@paginator.paginate(resource), opts)
else
super(resource, opts)
end
end
def paginated?
defined?(@pagination)
end
def with_pagination(request, response)
tap { @pagination = Struct::Pagination.new(request, response) }
end
private
# Methods needed by `API::Helpers::Pagination`
#
def params
@pagination.request.query_parameters
end
def request
@pagination.request
end
def header(header, value)
@pagination.response.headers[header] = value
end
end