Module: Sinatra::Swagger::ParamValidator

Defined in:
lib/sinatra/swagger/param_validator.rb

Class Method Summary collapse

Class Method Details

.registered(app) ⇒ Object



6
7
8
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/sinatra/swagger/param_validator.rb', line 6

def self.registered(app)
  app.register Swagger::SwaggerLinked

  app.helpers do
    def invalid_params(invalidities)
      content_type :json
      halt(
        400,
        {
          error: 'invalid_params',
          developerMessage: 'Some of the given parameters were invalid according to the Swagger spec.',
          invalidities: invalidities
        }.to_json
      )
    end
  end

  app.before do
    next if swagger_spec.nil?
    _, captures, spec = swagger_spec.values

    invalidities = Hash[(spec['parameters'] || []).map { |details|
      param_name = details['name']

      parameter = case details['in']
      when "query"
        params[param_name]
      when "path"
        captures[param_name]
      else
        raise NotImplementedError, "Can't cope with #{details['in']} parameters right now"
      end

      if !parameter
        next [param_name, :missing] if details['required'] && details['required'] != "false"
        next unless details['default']
        parameter = details['default']
      end

      begin
        parameter = ::Swagger.cast(parameter.to_s, details['type']) if parameter
      rescue ArgumentError
        next [param_name, :incorrect_type]
      end

      if %w{integer number}.include? details['type']
        too_large = details['maximum'] && parameter > details['maximum']
        too_small = details['minimum'] && parameter < details['minimum']
        next [param_name, :out_of_range] if too_large || too_small
      end

      params[param_name] = parameter

      nil
    }.compact]

    invalid_params(invalidities) if invalidities.any?
  end
end