class Getto::Roda::EntryPoint

:nocov:

Attributes

account[R]
app[R]
config[R]
error[R]
exception_notifier[R]
logger[R]
params[R]
request[R]
time[R]

Public Class Methods

new( error:, time_zone:, app:, request:, config:, params:, request_logger:, exception_notifier:) click to toggle source
# File lib/getto/roda/entry_point.rb, line 9
def initialize(
  error:, time_zone:,
  app:, request:,
  config:, params:,
  request_logger:, exception_notifier:)

  @error = error
  @time = Getto::Roda::Time.new(now: ::Time.now, time_zone: time_zone)

  @app = app
  @request = request
  @config = config
  @params = params

  @request_logger = check_signature(:request_logger, request_logger, [
    :debug,
    :info,
    :warn,
    :error,
    :fatal,
  ])
  @exception_notifier = check_signature(:exception_notifier, exception_notifier, [
    :notify_exception,
  ])

  @logger = Getto::Roda::Logger.new
end

Public Instance Methods

handle(controller) click to toggle source
# File lib/getto/roda/entry_point.rb, line 53
def handle(controller)
  params.merge! parse_params.to_h
  @account = detect_account

  init_controller(controller).action
rescue error => e
  error! e

  if e.status >= 500
    exception_notifier.notify(e, data: request_data)
  end

  app.response.status = e.status

  {message: e.message.split(":").first}
rescue Exception => e
  error! e
  exception_notifier.notify_exception(e, data: request_data)
  raise e
ensure
  if @error_data
    @request_logger.error(name: :handle){ request_data }
  else
    @request_logger.info(name: :handle){ request_data }
  end
end

Private Instance Methods

check_signature(name,obj,methods) click to toggle source
# File lib/getto/roda/entry_point.rb, line 37
        def check_signature(name,obj,methods)
  obj.tap{
    methods.each do |method|
      unless obj.respond_to?(method)
        raise ArgumentError, "argument type error: #{name} is not respond_to #{method}"
      end
    end
  }
end
detect_account() click to toggle source
# File lib/getto/roda/entry_point.rb, line 82
def detect_account
  error.not_implemented!
end
error!(e) click to toggle source
# File lib/getto/roda/entry_point.rb, line 110
def error!(e)
  @error_data = {
    error:   e.class.to_s,
    message: e.message,
  }
end
init_controller(controller) click to toggle source
# File lib/getto/roda/entry_point.rb, line 86
def init_controller(controller)
  error.not_implemented!
end
parse_params() click to toggle source
# File lib/getto/roda/entry_point.rb, line 91
def parse_params
  if app.env["REQUEST_METHOD"].upcase == "GET"
    parse_query_string!
  else
    parse_request_body!
  end
end
parse_query_string!() click to toggle source
# File lib/getto/roda/entry_point.rb, line 104
def parse_query_string!
  Getto::Roda::Decode::Get.new(app.env["QUERY_STRING"])
    .to_h or error.invalid_params!
end
parse_request_body!() click to toggle source
# File lib/getto/roda/entry_point.rb, line 99
def parse_request_body!
  Getto::Roda::Decode::Post.new(app.env["CONTENT_TYPE"], request.body.read)
    .to_h or error.invalid_params!
end
request_data() click to toggle source
# File lib/getto/roda/entry_point.rb, line 117
def request_data
  {
    start:   time.now.iso8601,
    remote:  app.env['HTTP_X_FORWARDED_FOR'] || app.env["REMOTE_ADDR"] || "-",
    account: account,
    method:  app.env["REQUEST_METHOD"],
    uri:  "#{app.env["PATH_INFO"]}#{app.env["QUERY_STRING"].tap{|s| break s.empty? ? s : "?#{s}" }}",
    elapsed: "%.3f" % (::Time.now.to_f - time.now.to_f),
    app:     @logger.data,
  }.tap{|data|
    if @error_data
      data[:error] = @error_data
    else
      data[:result] = :ok
    end
  }
end