lib/validate_params/params_validator.rb in validate-params-0.4.1 vs lib/validate_params/params_validator.rb in validate-params-0.5.0

- old
+ new

@@ -10,17 +10,17 @@ end class_methods do attr_accessor :params_validations, :method - def param(field, type, required: false, default: nil, &block) + def param(field, type, options = {}, &block) @params_validations ||= [] @params_validations << if block yield(ParamBuilder.new(field)) else - ParamBuilder.new.param(field, type, required: required, default: default) + ParamBuilder.new.param(field, type, options) end end def validate_params_for(request_action, &block) @request_action = request_action @@ -37,16 +37,16 @@ self.class.instance_variable_get(:@request_action) || nil end private - def build_error_message(field, type, value) - I18n.t("validate_params.invalid", field: field, type: type, value: value) + def build_error_message(param, type) + I18n.t("validate_params.invalid_type", param: param, type: type) end - def build_required_message(field) - I18n.t("validate_params.required", field: field) + def build_required_message(param) + I18n.t("validate_params.required", param: param) end def error_param_name(field) case field when Array @@ -58,20 +58,31 @@ end end def set_params_defaults params_validations.each do |params_validation| - next if params_validation[:default].blank? + next if params_validation[:options][:default].blank? if params_validation[:field].is_a?(Hash) params_validation[:field].each_key do |key| next if params.dig(key, params_validation[:field][key]) - params.merge!(key => { params_validation[:field][key] => params_validation[:default] }) + value = if params_validation[:options][:default].is_a?(Proc) + params_validation[:options][:default].call + else + params_validation[:options][:default] + end + params.merge!(key => { params_validation[:field][key] => value }) end else - params[params_validation[:field]] ||= params_validation[:default] + value = if params_validation[:options][:default].is_a?(Proc) + params_validation[:options][:default].call + else + params_validation[:options][:default] + end + + params[params_validation[:field]] ||= value end end end def perform_validate_params @@ -85,42 +96,53 @@ params_validation[:field][params_validation[:field].keys.first]) else params[params_validation[:field]] end - next if parameter_value.blank? && !params_validation[:required] + next if parameter_value.blank? && !params_validation[:options][:required] - if parameter_value.blank? && params_validation[:required] - errors << build_required_message(error_param_name(params_validation[:field])) + if parameter_value.blank? && params_validation[:options][:required] + errors << { message: build_required_message(error_param_name(params_validation[:field])) } next end case params_validation[:type].to_s when "Date" if invalid_date?(parameter_value) - errors << build_error_message( - error_param_name(params_validation[:field]), - params_validation[:type], - parameter_value - ) + errors << { + message: build_error_message(error_param_name(params_validation[:field]), params_validation[:type]) + } end when "DateTime" if invalid_datetime?(parameter_value) - errors << build_error_message( - error_param_name(params_validation[:field]), - params_validation[:type], - parameter_value - ) + errors << { + message: build_error_message(error_param_name(params_validation[:field]), params_validation[:type]) + } end when "Integer" - if invalid_integer?(parameter_value) - errors << build_error_message( - error_param_name(params_validation[:field]), - params_validation[:type], - parameter_value - ) + if invalid_integer?(parameter_value) + errors << { + message: build_error_message(error_param_name(params_validation[:field]), params_validation[:type]) + } + next end + + parameter_value = parameter_value.to_i + if params_validation[:options][:in].present? && !params_validation[:options][:in].include?(parameter_value) + errors << { + message: I18n.t("validate_params.invalid_in", param: error_param_name(params_validation[:field])), + valid_values: params_validation[:options][:in] + } + end + when "String" + parameter_value = parameter_value.to_s + if params_validation[:options][:in].present? && !params_validation[:options][:in].include?(parameter_value) + errors << { + message: I18n.t("validate_params.invalid_in", param: error_param_name(params_validation[:field])), + valid_values: params_validation[:options][:in] + } + end end end return if errors.empty? @@ -129,14 +151,14 @@ def invalid_date?(value) return true unless /\d{4}-\d{2}-\d{2}/.match?(value) parsed_date = begin - Date.strptime(value, "%Y-%m-%d") - rescue StandardError - nil - end + Date.strptime(value, "%Y-%m-%d") + rescue StandardError + nil + end parsed_date.blank? || parsed_date.year > 9999 end def invalid_datetime?(value) Time.at(Integer(value)) @@ -144,22 +166,23 @@ rescue ArgumentError, TypeError true end def invalid_integer?(value) - value !~ /\A[-+]?[0-9]+\z/ + value.to_s !~ /\A[-+]?[0-9]+\z/ end class ParamBuilder def initialize(parent_field = nil) @parent_field = parent_field end - def param(field, type, required: false, default: nil) + def param(field, type, options = {}) + if @parent_field - { field: { @parent_field => field }, type: type, required: required, default: default } + { field: { @parent_field => field }, type: type, options: options } else - { field: field, type: type, required: required, default: default } + { field: field, type: type, options: options } end end end end end