diff --git a/lib/openapi_first/builder.rb b/lib/openapi_first/builder.rb index cddd529f..e6cc1c5f 100644 --- a/lib/openapi_first/builder.rb +++ b/lib/openapi_first/builder.rb @@ -110,7 +110,11 @@ def parse_parameters(parameters) def resolve_parameters(parameters) parameters&.map do |parameter| result = parameter.resolved - result['schema'] = parameter['schema'].resolved + result['schema'] = if parameter['content'] && parameter['content']['application/json'] + parameter['content']['application/json']['schema'].resolved + else + parameter['schema'].resolved + end result end.to_a end diff --git a/spec/data/query-parameter-validation.yaml b/spec/data/query-parameter-validation.yaml index 50ad31cd..94b764c6 100644 --- a/spec/data/query-parameter-validation.yaml +++ b/spec/data/query-parameter-validation.yaml @@ -22,6 +22,19 @@ paths: schema: type: string - $ref: './components/parameters/filter.yaml' + - name: json_filter + in: query + description: Filter results + example: '{"tag": "foo"}' + content: + application/json: + schema: + type: object + properties: + tag: + type: string + other: + type: object - name: limit in: query description: How many items to return at one time (max 100) diff --git a/spec/middlewares/request_validation/query_parameter_validation_spec.rb b/spec/middlewares/request_validation/query_parameter_validation_spec.rb index 8b850f9d..951f4cc0 100644 --- a/spec/middlewares/request_validation/query_parameter_validation_spec.rb +++ b/spec/middlewares/request_validation/query_parameter_validation_spec.rb @@ -349,6 +349,14 @@ def last_params expect(last_response.status).to eq(200), last_response.body expect(last_params.dig('filter', 'id')).to eq 100 end + + it 'converts JSON encoded params' do + get '/search', params.merge(json_filter: { tag: 'dogs' }.to_json) + expect(last_response.status).to eq(200), last_response.body + + get '/search', params.merge(json_filter: { tag: true }.to_json) + expect(last_response.status).to eq(400), last_response.body + end end end end