class Wallaby::ActiveRecord::ModelServiceProvider

Model service provider for {Wallaby::ActiveRecord}

Public Instance Methods

collection(params, authorizer) click to toggle source

@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
create(resource, params, authorizer) click to toggle source

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
destroy(resource, _params, _authorizer) click to toggle source

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
find(id, _params, _authorizer) click to toggle source

@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
new(_params, _authorizer) click to toggle source

@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
paginate(query, params) click to toggle source

@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
permit(params, action, authorizer) click to toggle source

@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
update(resource, params, authorizer) click to toggle source

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

ensure_attributes_for(authorizer, action, resource) click to toggle source

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) click to toggle source

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
normalizer() click to toggle source

@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
param_key() click to toggle source

@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
permitted_fields() click to toggle source

@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
permitter() click to toggle source

@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
querier() click to toggle source

@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(action, resource, params, authorizer) click to toggle source

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
unknown_attribute_error() click to toggle source

@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
valid?(resource) click to toggle source

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
validator() click to toggle source

@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