lib/jsonapi_compliable/scoping/base.rb in jsonapi_compliable-0.6.4 vs lib/jsonapi_compliable/scoping/base.rb in jsonapi_compliable-0.6.5
- old
+ new
@@ -1,48 +1,99 @@
module JsonapiCompliable
module Scoping
+ # The interface for scoping logic (filter, paginate, etc).
+ #
+ # This class defines some common behavior, such as falling back on
+ # a default if not part of the user request.
+ #
+ # @attr_reader [Resource] resource The corresponding Resource instance
+ # @attr_reader [Hash] query_hash the Query#to_hash node relevant to the current resource
+ #
+ # @see Scoping::DefaultFilter
+ # @see Scoping::ExtraFields
+ # @see Scoping::Filter
+ # @see Scoping::Paginate
+ # @see Scoping::Sort
+ # @see Scope#initialize
+ # @see Scope#query_hash
+ # @see Query#to_hash
class Base
attr_reader :resource, :query_hash
+ # @param [Resource] resource the Resource instance
+ # @param [Hash] query_hash the Query#to_hash node relevant to the current resource
+ # @param scope the base scope object to chain/modify
+ # @param [Hash] opts configuration options used by subclasses
def initialize(resource, query_hash, scope, opts = {})
@query_hash = query_hash
@resource = resource
@scope = scope
@opts = opts
end
+ # Apply this scoping criteria.
+ # This is where we would chain on pagination, sorting, etc.
+ #
+ # If #apply? returns false, does nothing. Otherwise will apply
+ # the default logic:
+ #
+ # # no block, run default logic via adapter
+ # allow_filter :name
+ #
+ # Or the customized proc:
+ #
+ # allow_filter :name do |scope, value|
+ # scope.where("upper(name) = ?", value.upcase)
+ # end
+ #
+ # @see #apply?
+ # @return the scope object
def apply
if apply?
apply_standard_or_override
else
@scope
end
end
+ # Should we process this scope logic?
+ #
+ # Useful for when we want to explicitly opt-out on
+ # certain requests, or avoid a default in certain contexts.
+ #
+ # @return [Boolean] if we should apply this scope logic
def apply?
true
end
+ # Defines how to call/apply the default scoping logic
+ def apply_standard_scope
+ raise 'override in subclass'
+ end
+
+ # Defines how to call/apply the custom scoping logic provided by the
+ # user.
+ def apply_custom_scope
+ raise 'override in subclass'
+ end
+
+ private
+
+ # If the user customized (by providing a block in the Resource DSL)
+ # then call the custom proc. Else, call the default proc.
def apply_standard_or_override
if apply_standard_scope?
@scope = apply_standard_scope
else
@scope = apply_custom_scope
end
@scope
end
+ # Should we apply the default proc, or a custom one?
def apply_standard_scope?
custom_scope.nil?
- end
-
- def apply_standard_scope
- raise 'override in subclass'
- end
-
- def apply_custom_scope
- raise 'override in subclass'
end
end
end
end