Skip to content

Commit 62c092d

Browse files
committed
add allowed_scopes to jsonapi_filter and keep it backwards compatible
1 parent cccf5ed commit 62c092d

3 files changed

Lines changed: 22 additions & 7 deletions

File tree

lib/jsonapi/filtering.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,11 @@ def self.extract_attributes_and_predicates(requested_field)
3232
# @param allowed_fields [Array] a list of allowed fields to be filtered
3333
# @param options [Hash] extra flags to enable/disable features
3434
# @return [ActiveRecord::Base] a collection of resources
35-
def jsonapi_filter(resources, allowed_fields, options = {})
35+
def jsonapi_filter(resources, allowed_fields, *allowed_scopes, options)
36+
options = options || {}
37+
allowed_scopes = (allowed_scopes || []).flatten.map(&:to_s)
3638
allowed_fields = allowed_fields.map(&:to_s)
37-
extracted_params = jsonapi_filter_params(allowed_fields)
39+
extracted_params = jsonapi_filter_params(allowed_fields, allowed_scopes)
3840
extracted_params[:sorts] = jsonapi_sort_params(allowed_fields, options)
3941
resources = resources.ransack(extracted_params)
4042
block_given? ? yield(resources) : resources
@@ -47,7 +49,7 @@ def jsonapi_filter(resources, allowed_fields, options = {})
4749
#
4850
# @param allowed_fields [Array] a list of allowed fields to be filtered
4951
# @return [Hash] to be passed to [ActiveRecord::Base#order]
50-
def jsonapi_filter_params(allowed_fields)
52+
def jsonapi_filter_params(allowed_fields, allowed_scopes)
5153
filtered = {}
5254
requested = params[:filter] || {}
5355
allowed_fields = allowed_fields.map(&:to_s)
@@ -62,9 +64,17 @@ def jsonapi_filter_params(allowed_fields)
6264
to_filter = to_filter.split(',')
6365
end
6466

67+
# filter by attributes
68+
# {"first_name_eq"=>"Beau"}
6569
if predicates.any? && (field_names - allowed_fields).empty?
6670
filtered[requested_field] = to_filter
6771
end
72+
73+
# filter by scopes
74+
# {"created_before"=>"2013-02-01"}
75+
if (field_names - allowed_scopes).empty?
76+
filtered[requested_field] = to_filter
77+
end
6878
end
6979

7080
filtered

spec/dummy.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,17 @@ class UsersController < ActionController::Base
8888
def index
8989
allowed_fields = [
9090
:first_name, :last_name, :created_at,
91-
:notes_created_at, :notes_quantity,
91+
:notes_created_at, :notes_quantity
92+
]
93+
allowed_scopes = [
9294
:created_before
9395
]
9496
options = { sort_with_expressions: true }
9597

96-
jsonapi_filter(User.all, allowed_fields, options) do |filtered|
98+
jsonapi_filter(User.all,
99+
allowed_fields,
100+
allowed_scopes,
101+
options) do |filtered|
97102
result = filtered.result
98103

99104
if params[:sort].to_s.include?('notes_quantity')

spec/filtering_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,14 @@
106106
}
107107
end
108108

109-
fit 'ensures ransack scopes are working properly' do
109+
it 'ensures ransack scopes are working properly' do
110110
ransack = User.ransack({ created_before: '2013-02-01' })
111111
expected_sql = 'SELECT "users".* FROM "users" WHERE '\
112112
'(created_at < \'2013-02-01\')'
113113
expect(ransack.result.to_sql).to eq(expected_sql)
114114
end
115115

116-
fit 'should return only' do
116+
it 'should return only' do
117117
expect(response).to have_http_status(:ok)
118118
expect(response_json['data'].size).to eq(1)
119119
expect(response_json['data'][0]).to have_id(third_user.id.to_s)

0 commit comments

Comments
 (0)