Skip to content

Commit e385293

Browse files
committed
Merge pull request #226 from cerebris/215
Adds default value to filter option
2 parents 44ecd55 + 4d2b9a0 commit e385293

5 files changed

Lines changed: 55 additions & 6 deletions

File tree

lib/jsonapi/request.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ def setup_action(params)
4343
def setup_index_action(params)
4444
parse_fields(params[:fields])
4545
parse_include_directives(params[:include])
46+
set_default_filters
4647
parse_filters(params[:filter])
4748
parse_sort_criteria(params[:sort])
4849
parse_pagination(params[:page])
@@ -53,6 +54,7 @@ def setup_get_related_resource_action(params)
5354
initialize_source(params)
5455
parse_fields(params[:fields])
5556
parse_include_directives(params[:include])
57+
set_default_filters
5658
parse_filters(params[:filter])
5759
parse_sort_criteria(params[:sort])
5860
parse_pagination(params[:page])
@@ -63,6 +65,7 @@ def setup_get_related_resources_action(params)
6365
initialize_source(params)
6466
parse_fields(params[:fields])
6567
parse_include_directives(params[:include])
68+
set_default_filters
6669
parse_filters(params[:filter])
6770
parse_sort_criteria(params[:sort])
6871
parse_pagination(params[:page])
@@ -207,7 +210,7 @@ def parse_include_directives(include)
207210

208211
def parse_filters(filters)
209212
return unless filters
210-
@filters = {}
213+
211214
filters.each do |key, value|
212215
filter = unformat_key(key)
213216
if @resource_klass._allowed_filter?(filter)
@@ -218,6 +221,13 @@ def parse_filters(filters)
218221
end
219222
end
220223

224+
def set_default_filters
225+
@resource_klass._allowed_filters.each do |filter, opts|
226+
next if opts[:default].nil? || !@filters[filter].nil?
227+
@filters[filter] = opts[:default]
228+
end
229+
end
230+
221231
def parse_sort_criteria(sort_criteria)
222232
return unless sort_criteria
223233

lib/jsonapi/resource.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,11 +276,11 @@ def model_name(model)
276276
end
277277

278278
def filters(*attrs)
279-
@_allowed_filters.merge(attrs)
279+
@_allowed_filters.merge!(attrs.inject( Hash.new ) { |h, attr| h[attr] = {}; h })
280280
end
281281

282-
def filter(attr)
283-
@_allowed_filters.add(attr.to_sym)
282+
def filter(attr, *args)
283+
@_allowed_filters[attr.to_sym] = args.extract_options!
284284
end
285285

286286
def primary_key(key)
@@ -480,7 +480,7 @@ def _as_parent_key
480480
end
481481

482482
def _allowed_filters
483-
!@_allowed_filters.nil? ? @_allowed_filters : Set.new([:id])
483+
!@_allowed_filters.nil? ? @_allowed_filters : { :id => {} }
484484
end
485485

486486
def _resource_name_from_type(type)
@@ -505,7 +505,7 @@ def _model_class
505505
end
506506

507507
def _allowed_filter?(filter)
508-
_allowed_filters.include?(filter)
508+
!_allowed_filters[filter].nil?
509509
end
510510

511511
def module_path

test/controllers/controller_test.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2306,3 +2306,19 @@ def test_books_offset_pagination_meta
23062306
JSONAPI.configuration.operations_processor = :active_record
23072307
end
23082308
end
2309+
2310+
class CategoriesControllerTest < ActionController::TestCase
2311+
def test_index_default_filter
2312+
get :index
2313+
assert_response :success
2314+
assert json_response['data'].is_a?(Array)
2315+
assert_equal 3, json_response['data'].size
2316+
end
2317+
2318+
def test_index_default_filter_override
2319+
get :index, { filter: { status: 'inactive' } }
2320+
assert_response :success
2321+
assert json_response['data'].is_a?(Array)
2322+
assert_equal 4, json_response['data'].size
2323+
end
2324+
end

test/fixtures/active_record.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@
162162
t.string :numero_telefone
163163
t.timestamps null: false
164164
end
165+
166+
create_table :categories, force: true do |t|
167+
t.string :name
168+
t.string :status, limit: 10
169+
end
165170
end
166171

167172
### MODELS
@@ -329,6 +334,9 @@ class LineItem < ActiveRecord::Base
329334
class NumeroTelefone < ActiveRecord::Base
330335
end
331336

337+
class Category < ActiveRecord::Base
338+
end
339+
332340
### PORO Data - don't do this in a production app
333341
$breed_data = BreedData.new
334342
$breed_data.add(Breed.new(0, 'persian'))
@@ -381,6 +389,9 @@ class BreedsController < JSONAPI::ResourceController
381389
class FactsController < JSONAPI::ResourceController
382390
end
383391

392+
class CategoriesController < JSONAPI::ResourceController
393+
end
394+
384395
### CONTROLLERS
385396
module Api
386397
module V1
@@ -743,6 +754,10 @@ class FactResource < JSONAPI::Resource
743754
attribute :cool
744755
end
745756

757+
class CategoryResource < JSONAPI::Resource
758+
filter :status, default: 'active'
759+
end
760+
746761
module Api
747762
module V1
748763
class WriterResource < JSONAPI::Resource
@@ -960,3 +975,10 @@ class BadlyNamedAttributesResource < JSONAPI::Resource
960975
betay = Planet.create(name: 'Beta X', description: 'Newly discovered Planet Y', planet_type_id: unknown.id)
961976
betaz = Planet.create(name: 'Beta X', description: 'Newly discovered Planet Z', planet_type_id: unknown.id)
962977
betaw = Planet.create(name: 'Beta W', description: 'Newly discovered Planet W')
978+
Category.create(name: 'Category A', status: 'active')
979+
Category.create(name: 'Category B', status: 'active')
980+
Category.create(name: 'Category C', status: 'active')
981+
Category.create(name: 'Category D', status: 'inactive')
982+
Category.create(name: 'Category E', status: 'inactive')
983+
Category.create(name: 'Category F', status: 'inactive')
984+
Category.create(name: 'Category G', status: 'inactive')

test/test_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ def count_queries(&block)
8888
jsonapi_resources :moons
8989
jsonapi_resources :preferences
9090
jsonapi_resources :facts
91+
jsonapi_resources :categories
9192

9293
namespace :api do
9394
namespace :v1 do

0 commit comments

Comments
 (0)