diff --git a/spec/amber/validations/params_spec.cr b/spec/amber/validations/params_spec.cr index f77d32962..a42dd9978 100644 --- a/spec/amber/validations/params_spec.cr +++ b/spec/amber/validations/params_spec.cr @@ -3,6 +3,21 @@ require "../../spec_helper" module Amber::Validators describe Params do describe "#validation" do + context "JSON param" do + it "parses json array as [] of JSON::Any" do + params = json_params_builder({ x: [ 1, 2, 3 ], y: {z: [ 1, 2 ] } }.to_json) + validator = Validators::Params.new(params) + + validator.validation do + required(:x) + required("y") + end + + validator.validate!["x"].should be_a Array(JSON::Any) + validator.validate!["y"].should be_a JSON::Any + end + end + context "required params" do context "when missing" do it "is not valid and has 2 errors" do diff --git a/spec/support/helpers/validations_helper.cr b/spec/support/helpers/validations_helper.cr index e19011dae..b350e83c0 100644 --- a/spec/support/helpers/validations_helper.cr +++ b/spec/support/helpers/validations_helper.cr @@ -1,4 +1,9 @@ module ValidationsHelper + def json_params_builder(body = "") + request = HTTP::Request.new("POST", "/", HTTP::Headers{"Content-Type" => "application/json"}, body) + params = Amber::Router::Params.new(request) + end + def params_builder(body = "") request = HTTP::Request.new("GET", "") params = Amber::Router::Params.new(request) diff --git a/src/amber/validators/params.cr b/src/amber/validators/params.cr index 6e3d44877..d0c3c40d3 100644 --- a/src/amber/validators/params.cr +++ b/src/amber/validators/params.cr @@ -6,7 +6,7 @@ module Amber::Validators class BaseRule getter predicate : (String -> Bool) getter field : String - getter value : String? + getter value : String | Array(JSON::Any) | JSON::Any | Nil getter present : Bool def initialize(field : String | Symbol, @msg : String?, @allow_blank : Bool = true) @@ -31,9 +31,23 @@ module Amber::Validators end private def call_predicate(params : Amber::Router::Params) - @value = params[@field] @present = params.has_key?(@field) + begin + value = JSON.parse(params[@field]) + + if value.is_a? Array(JSON::Any) + @value = value + elsif value.as_a? + @value = value.as_a + else + @value = value + end + rescue + @value = params[@field] + end + + return true if params[@field].blank? && @allow_blank @predicate.call params[@field] unless @predicate.nil? @@ -82,10 +96,11 @@ module Amber::Validators class Params getter raw_params : Amber::Router::Params getter rules = [] of BaseRule - getter params = {} of String => String? + getter params = {} of String => String | Array(JSON::Any) | JSON::Any | Nil getter errors = [] of Error - def initialize(@raw_params); end + def initialize(@raw_params) + end # This will allow params to respond to HTTP::Params methods. # For example: [], []?, add, delete, each, fetch, etc.