module Roda::Endpoints::Endpoint::Validations

Parameters validations for {Endpoints} based on `Dry::Validation` gem.

Public Instance Methods

defaults(verb = :any, **attributes) click to toggle source
# File lib/roda/endpoints/endpoint/validations.rb, line 15
def defaults(verb = :any, **attributes)
  key = "validations.defaults.#{ns}.#{verb}" if key.is_a?(Symbol)
  container.register key, attributes
end
prepare_validations!() click to toggle source
# File lib/roda/endpoints/endpoint/validations.rb, line 73
def prepare_validations!
  return if @validations_prepared
  (verbs - %i(get head options)).each do |verb|
    key = "validations.#{ns}.#{verb}"
    default = "validations.#{ns}.any"
    unless container.key?(key) || container.key?(default)
      provide_default_validation!
    end
  end
  @validations_prepared = true
end
provide_default_validation!() click to toggle source
# File lib/roda/endpoints/endpoint/validations.rb, line 69
def provide_default_validation!
  validate {} unless container.key?("validations.#{ns}.any")
end
validate(verb = :any, &block) click to toggle source

@param [String, Symbol] verb @param [Proc] block

@example

r.collection :articles do |articles|
  # register validation at 'validations.endpoints.articles.default'
  articles.validate do
    required(:title).filled?
    required(:contents).filled?
  end
  # redefine validation for patch method at
  # 'validations.endpoints.articles.patch'
  articles.validate(:patch) do
    required(:title).filled?
    required(:contents).filled?
    require(:confirm_changes).
  end
end
# File lib/roda/endpoints/endpoint/validations.rb, line 38
def validate(verb = :any, &block)
  defaults = "validations.defaults.#{ns}.#{verb}"
  verb = "validations.#{ns}.#{verb}"
  schema = Dry::Validation.Form(&block)
  container.register(verb) do |params|
    if container.key?(defaults)
      params = f(:deep_merge).call(params, container[defaults])
    end
    validation = schema.call(params)
    if validation.success?
      Right(validation.output)
    else
      Left([:unprocessable_entity, {}, validation])
    end
  end
  schema
end
validation(verb) click to toggle source

@param [Symbol] verb @return [Dry::Validation::Schema::Form]

# File lib/roda/endpoints/endpoint/validations.rb, line 60
def validation(verb)
  if (validation = validation_for(verb))
    container[validation]
  else
    # default validation requires no params and provide no results
    provide_default_validation!
  end
end