class Wallaby::ActiveRecord::ModelServiceProvider
Model service provider for {Wallaby::ActiveRecord}
Public Instance Methods
@note Pagination free here. Since somewhere might need the collection without any pagination @param params [ActionController::Parameters] @param authorizer [Ability] for now @return [ActiveRecord::Relation] relation
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 20 def collection(params, authorizer) query = querier.search params query = query.order params[:sort] if params[:sort].present? authorizer.accessible_for :index, query end
Assign resource with new values and store it in database as new record. @param resource [Object] @param params [ActionController::Parameters] @param authorizer [Wallaby::ModelAuthorizer]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 57 def create(resource, params, authorizer) save __callee__, resource, params, authorizer end
Remove a record from database @param resource [Object]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 71 def destroy(resource, _params, _authorizer) resource.destroy end
@note No mass assignment happens here! Find the record using id. @param id [Integer, String] @return [Object] persisted resource object @raise [Wallaby::ResourceNotFound] when record is not found
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 47 def find(id, _params, _authorizer) @model_class.find id rescue ::ActiveRecord::RecordNotFound raise ResourceNotFound, id end
@note No mass assignment happens here! @return [Object] new resource object
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 38 def new(_params, _authorizer) @model_class.new end
@param query [ActiveRecord::Relation] @param params [ActionController::Parameters] @return [ActiveRecord::Relation] paginated query
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 29 def paginate(query, params) per = (params[:per] || Wallaby.configuration.pagination.page_size).to_i page = [params[:page].to_i, 1].max # starting from page 1 query = query.offset((page - 1) * per).limit(per) query end
@param params [ActionController::Parameters] @param action [String, Symbol] @param authorizer @return [ActionController::Parameters] whitelisted parameters
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 11 def permit(params, action, authorizer) authorized_fields = authorizer.permit_params action, @model_class params.require(param_key).permit(authorized_fields || permitted_fields) end
Assign resource with new values and store it in database as an update. @param resource [Object] @param params [ActionController::Parameters] @param authorizer [Wallaby::ModelAuthorizer]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 65 def update(resource, params, authorizer) save __callee__, resource, params, authorizer end
Protected Instance Methods
To make sure that the record can be updated with the values that are allowed to. @param authorizer [Object] @param action [String] @param resource [Object]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 113 def ensure_attributes_for(authorizer, action, resource) return if authorizer.blank? restricted_conditions = authorizer.attributes_for action, resource resource.assign_attributes restricted_conditions end
Normalize params @param params [ActionController::Parameters]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 96 def normalize(params) normalizer.normalize params end
@return [Wallaby::ActiveRecord::ModelServiceProvider::Normalizer]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 142 def normalizer @normalizer ||= Normalizer.new @model_decorator end
@return [String] param key
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 121 def param_key @model_class.model_name.param_key end
@return [Array] the list of attributes to whitelist for mass assignment
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 126 def permitted_fields @permitted_fields ||= permitter.simple_field_names << permitter.compound_hashed_fields end
@return [Wallaby::ActiveRecord::ModelServiceProvider::Permitter]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 132 def permitter @permitter ||= Permitter.new @model_decorator end
@return [Wallaby::ActiveRecord::ModelServiceProvider::Querier]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 137 def querier @querier ||= Querier.new @model_decorator end
Save the record @param action [String] `create`, `update` @param resource [Object] @param params [ActionController::Parameters] @param authorizer [Wallaby::ModelAuthorizer] @return resource itself @raise [ActiveRecord::StatementInvalid, ActiveModel::UnknownAttributeError, ActiveRecord::UnknownAttributeError]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 84 def save(action, resource, params, authorizer) resource.assign_attributes normalize params ensure_attributes_for authorizer, action, resource resource.save if valid? resource resource rescue ::ActiveRecord::ActiveRecordError, ActiveModel::ForbiddenAttributesError, unknown_attribute_error => e resource.errors.add :base, e.message resource end
@return [Class] ActiveModel::UnknownAttributeError if Rails 4 @return [Class] ActiveRecord::UnknownAttributeError if Rails 5
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 153 def unknown_attribute_error (defined?(::ActiveModel::UnknownAttributeError) ? ::ActiveModel : ::ActiveRecord)::UnknownAttributeError end
See if a resource is valid @param resource [Object] @return [true] if valid @return [false] otherwise
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 104 def valid?(resource) validator.valid? resource end
@return [Wallaby::ActiveRecord::ModelServiceProvider::Validator]
# File lib/adapters/wallaby/active_record/model_service_provider.rb, line 147 def validator @validator ||= Validator.new @model_decorator end