class ParamsProcessor::DocConverter

Public Class Methods

new(inhert_hash = { }) click to toggle source
Calls superclass method
# File lib/params_processor/doc_converter.rb, line 7
def initialize(inhert_hash = { })
  super(inhert_hash)
  convert
end

Public Instance Methods

convert() click to toggle source

TODO: refactor

# File lib/params_processor/doc_converter.rb, line 19
def convert
  return if blank?
  self.each do |_api, api_doc|
    @api_components = api_doc[:components]
    api_doc[:paths].each do |_path, path_doc|
      path_doc.each do |_method, action_doc|
        # 将 Reference Obj 填充进来
        # body ref
        request_body = action_doc[:requestBody]
        fill_with_ref request_body, :requestBodies if request_body.present?
        request_body&.[](:content)&.each do |_media, media_doc|
          media_doc.each do |mtype, mtype_doc|
            fill_with_ref mtype_doc, :schemas if mtype == 'schema'
          end
        end

        # 将 form-data 提到 parameters,方便统一访问接口
        # 在 param ref 处理之前上提,使后续可以一并将 properties 中的 schma 进行处理
        form = action_doc[:requestBody]&.[](:content)
        form = form['multipart/form-data'] || form['application/json'] if form # TODO
        if form.present?
          required = form[:schema][:required] || [ ]
          permit = form[:schema][:permit] ? true : false
          form[:schema][:properties]&.each do |name, prop_schema|
            (action_doc[:parameters] ||= [ ]) << {
                'name' => name,
                'in' => 'form',
                'required' => required.include?(name),
                'schema' => prop_schema.reverse_merge!(permit: permit),
            }
          end
        end


        # param ref
        action_doc[:parameters]&.each do |param|
          fill_with_ref param, :parameters

          # schema ref
          # TODO: Support nested scanning
          fill_with_ref param[:schema], :schemas if param[:schema].present?
        end


        # response ref
        action_doc[:responses]&.each do |_resp, resp_doc|
          fill_with_ref resp_doc, :responses
          resp_doc&.[](:content)&.each do |_media, media_doc|
            media_doc.each do |_mtype, mtype_doc|
              fill_with_ref mtype_doc, :schemas
            end
          end
        end
      end
    end
  end
end
fill_with_ref(who, ref_to) click to toggle source
# File lib/params_processor/doc_converter.rb, line 12
def fill_with_ref(who, ref_to)
  return unless who.key? '$ref'
  ref_name = who.delete('$ref').split('/').last
  who.merge! @api_components.fetch(ref_to).fetch(ref_name)
end