Module: ApiValidator
- Defined in:
- lib/api_validator.rb,
lib/api_validator/engine.rb,
lib/api_validator/version.rb,
lib/generators/api_validator/install/install_generator.rb
Defined Under Namespace
Modules: Generators Classes: Engine
Constant Summary collapse
- INTEGER_REGEX =
/^[1-9]([0-9]*)?$/- VERSION =
"0.1.3"
Instance Method Summary collapse
- #error_response(message = nil, status = 400) ⇒ Object
- #is_api_validator_applicable?(controller, action) ⇒ Boolean
- #is_in_inclusion?(defination, value) ⇒ Boolean
- #is_integer?(value) ⇒ Boolean
- #is_pattern_match?(value, pattern) ⇒ Boolean
-
#request_validation ⇒ Object
request validation method Input - request params Process - Validate params with there rules & defination Output - report error on invalidity.
- #validate?(key, value, rule, defination, dtd) ⇒ Boolean
- #validate_array_string?(value, separator) ⇒ Boolean
Instance Method Details
#error_response(message = nil, status = 400) ⇒ Object
49 50 51 52 |
# File 'lib/api_validator.rb', line 49 def error_response( = nil, status = 400) response = {status: 'error', message: } render json: response, status: status end |
#is_api_validator_applicable?(controller, action) ⇒ Boolean
45 46 47 |
# File 'lib/api_validator.rb', line 45 def is_api_validator_applicable?(controller, action) VALIDATION_CONFIG[controller].present? && VALIDATION_CONFIG[controller][action].present? end |
#is_in_inclusion?(defination, value) ⇒ Boolean
62 63 64 65 |
# File 'lib/api_validator.rb', line 62 def is_in_inclusion?(defination, value) range = defination.split("..").map(&:to_i) Range.new(range[0], range[-1]) === value.to_i end |
#is_integer?(value) ⇒ Boolean
54 55 56 |
# File 'lib/api_validator.rb', line 54 def is_integer?(value) !!(value =~ INTEGER_REGEX) end |
#is_pattern_match?(value, pattern) ⇒ Boolean
58 59 60 |
# File 'lib/api_validator.rb', line 58 def is_pattern_match?(value, pattern) !!(value =~ pattern) end |
#request_validation ⇒ Object
request validation method Input - request params Process - Validate params with there rules & defination Output - report error on invalidity
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/api_validator.rb', line 9 def request_validation if is_api_validator_applicable?(params[:controller], params[:action]) # validation - parameters defination validation_pd = VALIDATION_CONFIG[params[:controller]][params[:action]] validation_pd.keys.each do |key| next if params.has_key?(key) == false && validation_pd[key]["rules"].has_key?("presence") == false validation_pd[key]["rules"].each do |rule, defination| # when param's value is JSON string then parse it and validate parameters if (rule == "json_string" and defination == true) begin json_data = JSON.parse(params[key]) rescue params[key] json_data = [json_data] unless json_data.class == Array json_data.each do |data| data.keys.each do |json_data_key| if validation_pd[key].has_key?("parameters") next unless validation_pd[key]["parameters"].has_key?(json_data_key) validation_pd[key]["parameters"][json_data_key]["rules"].each do |json_data_rule, json_data_defination| #CAUTION: if nested JSON, this should be recursive return error_response(validation_pd[key]["parameters"][json_data_key]["messages"][json_data_rule]) if validate?(json_data_key, data[json_data_key], json_data_rule, json_data_defination, validation_pd[key]["parameters"][json_data_key]) end end end end rescue JSON::ParserError => e return error_response(validation_pd[key]["messages"][rule], 422) end # when param's value is NOT JSON else return error_response(validation_pd[key]["messages"][rule]) if validate?(key, params[key], rule, defination, validation_pd[key]) end end # param rule loop end end # params list loop end end # main if end end |
#validate?(key, value, rule, defination, dtd) ⇒ Boolean
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/api_validator.rb', line 75 def validate?(key, value, rule, defination, dtd) is_error_found = false case when (rule == "ignore_if_present" and defination.present?) # return error if not present & defination absence is_error_found = true if value.present? == false and params[defination].present? == false when (rule == "presence" and defination == true) # return error if not present is_error_found = true unless value.present? when (rule == "array_string" and defination.present?) # return error if array string invalid is_error_found = true unless validate_array_string?(value, defination) when (rule == "integer" and defination == true) # return error if not match with integer is_error_found = true unless is_integer?(value) when (rule == "min_length" and defination > 0) # return error if minimum length is not achived is_error_found = true unless value.length >= defination when (rule == "max_length" and defination > 0) # return error if maximum length is not achived is_error_found = true unless value.length <= defination when (rule == "max_value" and defination > 0) # return error if param's value is less or equal to defination is_error_found = true unless value.to_f <= defination when (rule=="inclusion" and defination.present?) # return error if param's value is not in between defination is_error_found = true unless is_in_inclusion?(defination, value) when (rule == "pattern" and defination.present?) # return error if pattern doesn't match if dtd["rules"].has_key?("presence") == true || value.present? is_error_found = true unless is_pattern_match?(value, Regexp.new(defination)) end end return is_error_found end |
#validate_array_string?(value, separator) ⇒ Boolean
67 68 69 70 71 72 73 |
# File 'lib/api_validator.rb', line 67 def validate_array_string?(value, separator) parameter_ids = value.split(separator) parameter_ids.each do |parameter| return false unless !!(parameter =~ INTEGER_REGEX) end return true end |