class WebFetch::Router

Dispatches requests to correct resource

Public Class Methods

new() click to toggle source
# File lib/web_fetch/router.rb, line 11
def initialize
  @router = setup
end

Public Instance Methods

route(url, options = {}) click to toggle source
# File lib/web_fetch/router.rb, line 15
def route(url, options = {})
  @server = options.delete(:server)
  options = { query_string: nil, method: 'GET' }.merge(options)

  Logger.info("#{url}: #{options}")

  json_params = build_params(options)
  return { status: 400, payload: I18n.t(:bad_json) } if json_params.nil?

  resource = @router.recognize(
    url, method: normalize_http_method(options[:method])
  )
  resource.call(resource.params.merge(json_params))
end

Private Instance Methods

build_params(options) click to toggle source

rubocop:enable Metrics/MethodLength, Metrics/AbcSize

# File lib/web_fetch/router.rb, line 58
def build_params(options)
  params = Rack::Utils.parse_nested_query(options[:query_string])
  merge_json!(params)
  params = symbolize(params)
  params.merge!(options[:post_data] || {})
  params
rescue JSON::ParserError
  nil
end
merge_json(params) click to toggle source
# File lib/web_fetch/router.rb, line 68
def merge_json(params)
  params.merge(
    JSON.parse(params.delete('json') || '{}',
               symbolize_names: true)
  )
end
merge_json!(params) click to toggle source
# File lib/web_fetch/router.rb, line 75
def merge_json!(params)
  params.merge!(merge_json(params))
end
normalize_http_method(method) click to toggle source
# File lib/web_fetch/router.rb, line 79
def normalize_http_method(method)
  method.downcase.to_sym
end
setup() click to toggle source

rubocop:disable Metrics/MethodLength, Metrics/AbcSize

# File lib/web_fetch/router.rb, line 33
def setup
  resource_finder = lambda do |name, env|
    Resources.public_send(name, @server, env)
  end

  Hanami::Router.new do
    get '/', to: lambda { |params|
      resource_finder.call(:root, params)
    }

    post '/gather', to: lambda { |params|
      resource_finder.call(:gather, params)
    }

    get '/retrieve/:uid', to: lambda { |params|
      resource_finder.call(:retrieve, params)
    }

    get '/find/:uid', to: lambda { |params|
      resource_finder.call(:find, params)
    }
  end
end