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