Skip to content

Commit

Permalink
send whole request context to model serializer
Browse files Browse the repository at this point in the history
  • Loading branch information
bacarini committed Aug 18, 2015
1 parent 5031eb9 commit 83f9e74
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 41 deletions.
14 changes: 1 addition & 13 deletions lib/action_controller/serialization.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,6 @@ def get_serializer(resource, options = {})
"Please pass 'adapter: false' or see ActiveSupport::SerializableResource#serialize"
options[:adapter] = false
end
if resource.respond_to?(:current_page) && resource.respond_to?(:total_pages)
options[:pagination] = {}
options[:pagination][:original_url] = original_url
options[:pagination][:query_parameters] = query_parameters
end
ActiveModel::SerializableResource.serialize(resource, options) do |serializable_resource|
if serializable_resource.serializer?
serializable_resource.serialization_scope ||= serialization_scope
Expand All @@ -52,6 +47,7 @@ def use_adapter?

[:_render_option_json, :_render_with_renderer_json].each do |renderer_method|
define_method renderer_method do |resource, options|
options.fetch(:context) { options[:context] = request }
serializable_resource = get_serializer(resource, options)
super(serializable_resource, options)
end
Expand All @@ -62,13 +58,5 @@ def serialization_scope(scope)
self._serialization_scope = scope
end
end

def original_url
request.original_url[/\A[^?]+/]
end

def query_parameters
request.query_parameters
end
end
end
11 changes: 9 additions & 2 deletions lib/active_model/serializer/adapter/json_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,18 @@ def add_resource_relationships(attrs, serializer, options = {})
def add_links(options)
links = @hash.fetch(:links) { {} }
resources = serializer.instance_variable_get(:@resource)
@hash[:links] = add_pagination_links(links, resources, options) if options[:pagination]
@hash[:links] = add_pagination_links(links, resources, options) if is_paginated?(resources)
end

def add_pagination_links(links, resources, options)
links.update(JsonApi::PaginationLinks.new(resources).serializable_hash(options))
pagination_links = JsonApi::PaginationLinks.new(resources, options[:context]).serializable_hash(options)
links.update(pagination_links)
end

def is_paginated?(resource)
resource.respond_to?(:current_page) &&
resource.respond_to?(:total_pages) &&
resource.respond_to?(:size)
end
end
end
Expand Down
25 changes: 12 additions & 13 deletions lib/active_model/serializer/adapter/json_api/pagination_links.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@ class JsonApi < Adapter
class PaginationLinks
FIRST_PAGE = 1

attr_reader :collection
attr_reader :collection, :context

def initialize(collection)
raise_unless_any_gem_installed
def initialize(collection, context)
@collection = collection
@context = context
end

def serializable_hash(options = {})
pages_from.each_with_object({}) do |(key, value), hash|
query_parameters = options[:pagination].fetch(:query_parameters) { {} }
params = query_parameters.merge(page: { number: value, size: collection.size }).to_query

hash[key] = "#{url(options)}?#{params}"
Expand All @@ -41,17 +40,17 @@ def pages_from
end
end

def raise_unless_any_gem_installed
return if defined?(WillPaginate) || defined?(Kaminari)
raise <<-EOF
AMS relies on either Kaminari or WillPaginate for pagination.
Please install either dependency by adding one of those to your Gemfile.
EOF
end

def url(options)
self_link = options.fetch(:links) {{}}
self_link.fetch(:self) {} ? options[:links][:self] : options[:pagination][:original_url]
self_link.fetch(:self) {} ? options[:links][:self] : original_url
end

def original_url
@original_url ||= context.original_url[/\A[^?]+/]
end

def query_parameters
@query_parameters ||= context.query_parameters
end
end
end
Expand Down
36 changes: 23 additions & 13 deletions test/adapter/json_api/pagination_links_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ class Serializer
class Adapter
class JsonApi
class PaginationLinksTest < Minitest::Test
URI = 'http://example.com'

def setup
ActionController::Base.cache_store.clear
@array = [
Expand All @@ -18,6 +20,14 @@ def setup
]
end

def mock_request(query_parameters={}, original_url=URI)
context = Minitest::Mock.new
context.expect(:original_url, original_url )
context.expect(:query_parameters, query_parameters)
@options = {}
@options[:context] = context
end

def using_kaminari
Kaminari.paginate_array(@array).page(2).per(1)
end
Expand All @@ -38,11 +48,11 @@ def data
def links
{
links:{
self: "http://example.com?page%5Bnumber%5D=2&page%5Bsize%5D=1",
first: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1",
prev: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1",
next: "http://example.com?page%5Bnumber%5D=3&page%5Bsize%5D=1",
last: "http://example.com?page%5Bnumber%5D=3&page%5Bsize%5D=1"
self: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
prev: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
next: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1"
}
}
end
Expand All @@ -59,7 +69,7 @@ def expected_response_with_pagination_links
end

def expected_response_with_pagination_links_and_additional_params
new_links = links[:links].each_with_object({}) {|(key, value), hash| hash[key] = "#{value}&teste=teste" }
new_links = links[:links].each_with_object({}) {|(key, value), hash| hash[key] = "#{value}&test=test" }
{}.tap do |hash|
hash[:data] = [data.values.flatten.second]
hash.merge! links: new_links
Expand All @@ -70,25 +80,25 @@ def test_pagination_links_using_kaminari
serializer = ArraySerializer.new(using_kaminari)
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)

assert_equal expected_response_with_pagination_links,
adapter.serializable_hash(pagination: { original_url: "http://example.com" })
mock_request
assert_equal expected_response_with_pagination_links, adapter.serializable_hash(@options)
end

def test_pagination_links_using_will_paginate
serializer = ArraySerializer.new(using_will_paginate)
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)

assert_equal expected_response_with_pagination_links,
adapter.serializable_hash(pagination: { original_url: "http://example.com" })
mock_request
assert_equal expected_response_with_pagination_links, adapter.serializable_hash(@options)
end

def test_pagination_links_with_additional_params
serializer = ArraySerializer.new(using_will_paginate)
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
assert_equal expected_response_with_pagination_links_and_additional_params,
adapter.serializable_hash(pagination: { original_url: "http://example.com",
query_parameters: { teste: "teste"}})

mock_request({ test: 'test' })
assert_equal expected_response_with_pagination_links_and_additional_params,
adapter.serializable_hash(@options)
end

def test_not_showing_pagination_links
Expand Down

0 comments on commit 83f9e74

Please sign in to comment.