From 106268146cc561ef200173b7607078b47d405434 Mon Sep 17 00:00:00 2001 From: Goreorto Date: Mon, 18 May 2015 17:28:14 -0500 Subject: [PATCH 1/2] Adds default value to filter option --- lib/jsonapi/request.rb | 11 ++++++++++- lib/jsonapi/resource.rb | 10 +++++----- test/controllers/controller_test.rb | 16 ++++++++++++++++ test/fixtures/active_record.rb | 22 ++++++++++++++++++++++ test/test_helper.rb | 1 + 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/lib/jsonapi/request.rb b/lib/jsonapi/request.rb index 8bb6c6545..c9a7ebab7 100644 --- a/lib/jsonapi/request.rb +++ b/lib/jsonapi/request.rb @@ -31,6 +31,7 @@ def setup(params) when 'index' parse_fields(params[:fields]) parse_include_directives(params[:include]) + set_default_filters parse_filters(params[:filter]) parse_sort_criteria(params[:sort]) parse_pagination(params[:page]) @@ -39,6 +40,7 @@ def setup(params) @source_id = @source_klass.verify_key(params.require(@source_klass._as_parent_key), @context) parse_fields(params[:fields]) parse_include_directives(params[:include]) + set_default_filters parse_filters(params[:filter]) parse_sort_criteria(params[:sort]) parse_pagination(params[:page]) @@ -161,7 +163,7 @@ def parse_include_directives(include) def parse_filters(filters) return unless filters - @filters = {} + filters.each do |key, value| filter = unformat_key(key) if @resource_klass._allowed_filter?(filter) @@ -172,6 +174,13 @@ def parse_filters(filters) end end + def set_default_filters + @resource_klass._allowed_filters.each do |filter, opts| + next if opts[:default].nil? || !@filters[filter].nil? + @filters[filter] = opts[:default] + end + end + def parse_sort_criteria(sort_criteria) return unless sort_criteria diff --git a/lib/jsonapi/resource.rb b/lib/jsonapi/resource.rb index 3e2c41990..933685bb9 100644 --- a/lib/jsonapi/resource.rb +++ b/lib/jsonapi/resource.rb @@ -276,11 +276,11 @@ def model_name(model) end def filters(*attrs) - @_allowed_filters.merge(attrs) + @_allowed_filters.merge!(attrs.inject( Hash.new ) { |h, attr| h[attr] = {}; h }) end - def filter(attr) - @_allowed_filters.add(attr.to_sym) + def filter(attr, opts={}) + @_allowed_filters[attr.to_sym] = opts end def primary_key(key) @@ -477,7 +477,7 @@ def _as_parent_key end def _allowed_filters - !@_allowed_filters.nil? ? @_allowed_filters : Set.new([:id]) + !@_allowed_filters.nil? ? @_allowed_filters : { :id => {} } end def _resource_name_from_type(type) @@ -502,7 +502,7 @@ def _model_class end def _allowed_filter?(filter) - _allowed_filters.include?(filter) + !_allowed_filters[filter].nil? end def module_path diff --git a/test/controllers/controller_test.rb b/test/controllers/controller_test.rb index 0e2a426af..6cccf41d3 100644 --- a/test/controllers/controller_test.rb +++ b/test/controllers/controller_test.rb @@ -2306,3 +2306,19 @@ def test_books_paged_pagination_invalid_page_format_interpret_int assert_equal 'Book 20', json_response['data'][0]['attributes']['title'] end end + +class CategoriesControllerTest < ActionController::TestCase + def test_index_default_filter + get :index + assert_response :success + assert json_response['data'].is_a?(Array) + assert_equal 3, json_response['data'].size + end + + def test_index_default_filter_override + get :index, { filter: { status: 'inactive' } } + assert_response :success + assert json_response['data'].is_a?(Array) + assert_equal 4, json_response['data'].size + end +end diff --git a/test/fixtures/active_record.rb b/test/fixtures/active_record.rb index d91aea459..39ea4561c 100644 --- a/test/fixtures/active_record.rb +++ b/test/fixtures/active_record.rb @@ -162,6 +162,11 @@ t.string :numero_telefone t.timestamps null: false end + + create_table :categories, force: true do |t| + t.string :name + t.string :status, limit: 10 + end end ### MODELS @@ -329,6 +334,9 @@ class LineItem < ActiveRecord::Base class NumeroTelefone < ActiveRecord::Base end +class Category < ActiveRecord::Base +end + ### PORO Data - don't do this in a production app $breed_data = BreedData.new $breed_data.add(Breed.new(0, 'persian')) @@ -368,6 +376,9 @@ class BreedsController < JSONAPI::ResourceController class FactsController < JSONAPI::ResourceController end +class CategoriesController < JSONAPI::ResourceController +end + ### CONTROLLERS module Api module V1 @@ -728,6 +739,10 @@ class FactResource < JSONAPI::Resource attribute :cool end +class CategoryResource < JSONAPI::Resource + filter :status, default: 'active' +end + module Api module V1 class WriterResource < JSONAPI::Resource @@ -941,3 +956,10 @@ class BadlyNamedAttributesResource < JSONAPI::Resource betay = Planet.create(name: 'Beta X', description: 'Newly discovered Planet Y', planet_type_id: unknown.id) betaz = Planet.create(name: 'Beta X', description: 'Newly discovered Planet Z', planet_type_id: unknown.id) betaw = Planet.create(name: 'Beta W', description: 'Newly discovered Planet W') +Category.create(name: 'Category A', status: 'active') +Category.create(name: 'Category B', status: 'active') +Category.create(name: 'Category C', status: 'active') +Category.create(name: 'Category D', status: 'inactive') +Category.create(name: 'Category E', status: 'inactive') +Category.create(name: 'Category F', status: 'inactive') +Category.create(name: 'Category G', status: 'inactive') diff --git a/test/test_helper.rb b/test/test_helper.rb index e422e6f54..8e228ed32 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -88,6 +88,7 @@ def count_queries(&block) jsonapi_resources :moons jsonapi_resources :preferences jsonapi_resources :facts + jsonapi_resources :categories namespace :api do namespace :v1 do From a32bca448b121181412507331e173e8557ef56df Mon Sep 17 00:00:00 2001 From: Goreorto Date: Tue, 19 May 2015 16:55:12 -0500 Subject: [PATCH 2/2] ensures options is a hash --- lib/jsonapi/resource.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/jsonapi/resource.rb b/lib/jsonapi/resource.rb index 933685bb9..a2ef341c6 100644 --- a/lib/jsonapi/resource.rb +++ b/lib/jsonapi/resource.rb @@ -279,8 +279,8 @@ def filters(*attrs) @_allowed_filters.merge!(attrs.inject( Hash.new ) { |h, attr| h[attr] = {}; h }) end - def filter(attr, opts={}) - @_allowed_filters[attr.to_sym] = opts + def filter(attr, *args) + @_allowed_filters[attr.to_sym] = args.extract_options! end def primary_key(key)