Skip to content

Commit

Permalink
Merge pull request #1 from socio-labs/feature/improve_serializer_param
Browse files Browse the repository at this point in the history
Feature/improve serializer param
  • Loading branch information
metekabak committed Apr 30, 2021
2 parents 9a5bd71 + 9a4e66d commit b6bc867
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 61 deletions.
1 change: 1 addition & 0 deletions .ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
2.6.6
16 changes: 13 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,20 @@ Please follow the
[JSON:API Serializer guide](https://github.com/jsonapi-serializer/jsonapi-serializer#serializer-definition)
on how to define a serializer.

To provide a different naming scheme implement the `jsonapi_serializer_class`
To provide a different naming scheme use `serializer_class` parameter or implement the `jsonapi_serializer_class`
method in your resource or application controller.

Here's an example:
Here's an example for `serializer_class` parameter:
```ruby
class CustomNamingController < ActionController::Base
def index
render jsonapi: Model.all,
serializer_class: MySerializer
end
end
```

Here's an example for `jsonapi_serializer_class` method:
```ruby
class CustomNamingController < ActionController::Base

Expand Down Expand Up @@ -287,7 +297,7 @@ class MyController < ActionController::Base

def index
jsonapi_paginate(Model.all) do |paginated|
render jsonapi: paginated
render jsonapi_paginate: paginated
end
end

Expand Down
12 changes: 9 additions & 3 deletions lib/jsonapi/rails.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ def self.add_errors_renderer!
errors = []
model = resource.instance_variable_get('@base')

if respond_to?(:jsonapi_serializer_class, true)
if options[:serializer_class]
model_serializer = options[:serializer_class]
elsif respond_to?(:jsonapi_serializer_class, true)
model_serializer = jsonapi_serializer_class(model, false)
else
model_serializer = JSONAPI::Rails.serializer_class(model, false)
Expand Down Expand Up @@ -114,7 +116,9 @@ def self.add_renderer!
options[opt] ||= send(method_name) if respond_to?(method_name, true)
end

if respond_to?(:jsonapi_serializer_class, true)
if options[:serializer_class]
serializer_class = options[:serializer_class]
elsif respond_to?(:jsonapi_serializer_class, true)
serializer_class = jsonapi_serializer_class(resource, many)
else
serializer_class = JSONAPI::Rails.serializer_class(resource, many)
Expand Down Expand Up @@ -143,7 +147,9 @@ def self.add_renderer!
options[opt] ||= send(method_name) if respond_to?(method_name, true)
end

if respond_to?(:jsonapi_serializer_class, true)
if options[:serializer_class]
serializer_class = options[:serializer_class]
elsif respond_to?(:jsonapi_serializer_class, true)
serializer_class = jsonapi_serializer_class(resource, many)
else
serializer_class = JSONAPI::Rails.serializer_class(resource, many)
Expand Down
11 changes: 9 additions & 2 deletions spec/dummy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ class UserSerializer
end
end

class MyUserSerializer < UserSerializer
attribute :full_name do |object, _|
"#{object.first_name} #{object.last_name}"
end
end

class Dummy < Rails::Application
secrets.secret_key_base = '_'
config.hosts << 'www.example.com' if config.respond_to?(:hosts)
Expand Down Expand Up @@ -91,14 +97,15 @@ def index
result = filtered.result

if params[:sort].to_s.include?('notes_quantity')
render jsonapi: result.group('id').to_a
render jsonapi_paginate: result.group('id').to_a
return
end

result = result.to_a if params[:as_list]

jsonapi_paginate(result) do |paginated|
render jsonapi: paginated
render jsonapi_paginate: paginated,
serializer_class: MyUserSerializer
end
end
end
Expand Down
17 changes: 17 additions & 0 deletions spec/fetching_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,23 @@
end
end

context 'returns customers and full name' do
let(:params) do
{ fields: { full_name: true } }
end

it do
expect(response).to have_http_status(:ok)
expect(response_json['data'].size).to eq(users.size)

response_json['data'].each do |item|
user = users.detect { |u| u.id == item['id'].to_i }
expect(item).to have_attribute('full_name')
.with_value("#{user.first_name} #{user.last_name}")
end
end
end

context 'returns customers included and sparse fields' do
let(:params) do
{
Expand Down
138 changes: 85 additions & 53 deletions spec/pagination_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,18 @@
.to eq(
'many' => true,
'pagination' => {
'current' => 1,
'records' => 0
'total_page' => 1,
'total_count' => 0,
}
)
end

def query_str(parms, page: nil)
parms = parms.deep_merge(page: { number: page }) if page

"?#{CGI.unescape(parms.to_query)}"
end

context 'with users' do
let(:first_user) { create_user }
let(:second_user) { create_user }
Expand All @@ -41,14 +47,14 @@
expect(response_json['data'][1]).to have_id(second_user.id.to_s)
expect(response_json['data'][2]).to have_id(first_user.id.to_s)

expect(response_json).to have_link('self')
expect(response_json).not_to have_link(:prev)
expect(response_json).not_to have_link(:next)
expect(response_json).not_to have_link(:first)
expect(response_json).not_to have_link(:last)
expect(response_json).to have_link('current')
expect(response_json).to have_link(:prev)
expect(response_json).to have_link(:next)
expect(response_json).to have_link(:first)
expect(response_json).to have_link(:last)

expect(URI.parse(response_json['links']['self']).query)
.to eq(CGI.unescape(params.to_query))
expect(URI.parse(response_json['links']['current']).query)
.to eq(CGI.unescape(params.deep_merge(page: { number: 1 }).to_query))
end

context 'on page 2 out of 3' do
Expand All @@ -70,13 +76,16 @@
expect(response_json['data'][0]).to have_id(second_user.id.to_s)

expect(response_json['meta']['pagination']).to eq(
'current' => 2,
'first' => 1,
'prev' => 1,
'next' => 3,
'last' => 3,
'records' => 3
'total_count'=> 3,
'total_page'=> 3
)
expect(response_json['links']).to eq(
'current' => query_str(params),
'first' => query_str(params, page: 1),
'prev' => query_str(params, page: 1),
'next' => query_str(params, page: 3),
'last' => query_str(params, page: 3),
)
end
end

Expand All @@ -86,25 +95,28 @@
expect(response_json['data'][0]).to have_id(second_user.id.to_s)

expect(response_json['meta']['pagination']).to eq(
'current' => 2,
'first' => 1,
'prev' => 1,
'next' => 3,
'last' => 3,
'records' => 3
'total_count'=> 3,
'total_page'=> 3
)
expect(response_json['links']).to eq(
'current' => query_str(params),
'first' => query_str(params, page: 1),
'prev' => query_str(params, page: 1),
'next' => query_str(params, page: 3),
'last' => query_str(params, page: 3),
)

expect(response_json).to have_link(:self)
expect(response_json).to have_link(:current)
expect(response_json).to have_link(:prev)
expect(response_json).to have_link(:first)
expect(response_json).to have_link(:next)
expect(response_json).to have_link(:last)

qry = CGI.unescape(params.to_query)
expect(URI.parse(response_json['links']['self']).query).to eq(qry)
expect(URI.parse(response_json['links']['current']).query).to eq(qry)

qry = CGI.unescape(params.deep_merge(page: { number: 2 }).to_query)
expect(URI.parse(response_json['links']['self']).query).to eq(qry)
expect(URI.parse(response_json['links']['current']).query).to eq(qry)

qry = CGI.unescape(params.deep_merge(page: { number: 1 }).to_query)
expect(URI.parse(response_json['links']['prev']).query).to eq(qry)
Expand All @@ -128,19 +140,24 @@
expect(response_json['data'].size).to eq(1)

expect(response_json['meta']['pagination']).to eq(
'current' => 3,
'first' => 1,
'prev' => 2,
'records' => 3
'total_count'=> 3,
'total_page'=> 3
)
expect(response_json['links']).to eq(
'current' => query_str(params),
'first' => query_str(params, page: 1),
'prev' => query_str(params, page: 2),
'next' => nil,
'last' => query_str(params, page: 3),
)

expect(response_json).to have_link(:self)
expect(response_json).to have_link(:current)
expect(response_json).to have_link(:prev)
expect(response_json).to have_link(:first)
expect(response_json).not_to have_link(:next)
expect(response_json).not_to have_link(:last)
expect(response_json).to have_link(:next)
expect(response_json).to have_link(:last)

expect(URI.parse(response_json['links']['self']).query)
expect(URI.parse(response_json['links']['current']).query)
.to eq(CGI.unescape(params.to_query))

qry = CGI.unescape(params.deep_merge(page: { number: 2 }).to_query)
Expand Down Expand Up @@ -168,10 +185,15 @@
expect(response_json['data'].size).to eq(0)

expect(response_json['meta']['pagination']).to eq(
'current' => 5,
'first' => 1,
'prev' => 4,
'records' => 3
'total_count'=> 3,
'total_page'=> 3
)
expect(response_json['links']).to eq(
'current' => query_str(params),
'first' => query_str(params, page: 1),
'prev' => query_str(params, page: 4),
'next' => nil,
'last' => query_str(params, page: 3),
)
end
end
Expand All @@ -181,19 +203,24 @@
expect(response_json['data'].size).to eq(0)

expect(response_json['meta']['pagination']).to eq(
'current' => 5,
'first' => 1,
'prev' => 4,
'records' => 3
'total_count'=> 3,
'total_page'=> 3
)
expect(response_json['links']).to eq(
'current' => query_str(params),
'first' => query_str(params, page: 1),
'prev' => query_str(params, page: 4),
'next' => nil,
'last' => query_str(params, page: 3),
)

expect(response_json).to have_link(:self)
expect(response_json).to have_link(:current)
expect(response_json).to have_link(:prev)
expect(response_json).to have_link(:first)
expect(response_json).not_to have_link(:next)
expect(response_json).not_to have_link(:last)
expect(response_json).to have_link(:next)
expect(response_json).to have_link(:last)

expect(URI.parse(response_json['links']['self']).query)
expect(URI.parse(response_json['links']['current']).query)
.to eq(CGI.unescape(params.to_query))

qry = CGI.unescape(params.deep_merge(page: { number: 4 }).to_query)
Expand All @@ -207,7 +234,7 @@
context 'on page 1 out of 3' do
let(:params) do
{
page: { size: 1 },
page: { size: 1, number: 1 },
sort: '-created_at'
}
end
Expand All @@ -218,19 +245,24 @@
expect(response_json['data'][0]).to have_id(third_user.id.to_s)

expect(response_json['meta']['pagination']).to eq(
'current' => 1,
'next' => 2,
'last' => 3,
'records' => 3
'total_count' => 3,
'total_page' => 3,
)
expect(response_json['links']).to eq(
'current' => query_str(params),
'first' => query_str(params, page: 1),
'prev' => nil,
'next' => query_str(params, page: 2),
'last' => query_str(params, page: 3),
)

expect(response_json).not_to have_link(:prev)
expect(response_json).not_to have_link(:first)
expect(response_json).to have_link(:prev)
expect(response_json).to have_link(:first)
expect(response_json).to have_link(:next)
expect(response_json).to have_link(:self)
expect(response_json).to have_link(:current)
expect(response_json).to have_link(:last)

expect(URI.parse(response_json['links']['self']).query)
expect(URI.parse(response_json['links']['current']).query)
.to eq(CGI.unescape(params.to_query))

qry = CGI.unescape(params.deep_merge(page: { number: 2 }).to_query)
Expand Down

0 comments on commit b6bc867

Please sign in to comment.