lib/voom/presenters/api/app.rb in voom-presenters-0.2.0 vs lib/voom/presenters/api/app.rb in voom-presenters-2.0.0
- old
+ new
@@ -1,9 +1,8 @@
require 'sinatra'
+require 'honeybadger' if ENV.fetch('HONEYBADGER_API_KEY'){false}
require 'json'
-require 'voom/presenters'
-require 'voom/presenters/api/router'
module Voom
module Presenters
module Api
# This is the Rest API for voom services/component commands
@@ -29,27 +28,48 @@
end
private
+ # analogous to Voom::Presenters::WebClient::App#render_presenter
def render_presenter(presenter)
- # puts "/presenters/api/#{params[:version]}/#{params[:presenter]}/"
- # puts "Parameters: #{params.inspect}"
- presenter = Voom::Presenters::App[presenter].call
- pom = presenter.expand(router: router, context: prepare_context)
- content_type :json
- JSON.dump(pom.to_hash)
+ begin
+ before_render = Presenters::Settings.config.presenters.before_render
+ render_instead, ctx = before_render
+ .lazy
+ .map { |p| p.call(request) }
+ .detect(&:itself)
+
+ if Presenters::App.registered?(render_instead)
+ presenter = render_instead
+ end
+
+ p = params.merge(ctx || {})
+ presenter = Voom::Presenters::App[presenter].call
+ pom = presenter.expand(router: router, context: prepare_context(p))
+ content_type :json
+ JSON.dump(pom.to_hash)
+ rescue StandardError => e
+ presenter_name = presenter.respond_to?(:name) ? presenter.name : '(unknown)'
+ Presenters::Settings.config.presenters.error_logger.call(
+ @env['rack.errors'],
+ e,
+ params,
+ presenter_name
+ )
+ raise e
+ end
end
def router
settings.router_.new(base_url: "#{request.base_url}#{env['SCRIPT_NAME']}")
end
- def prepare_context
+ def prepare_context(base_params = params)
prepare_context = Presenters::Settings.config.presenters.web_client.prepare_context.dup
prepare_context.push(method(:scrub_context))
- context = params.dup
+ context = base_params.dup
prepare_context.reduce(context) do |params, context_proc|
context_proc.call(params, session, env)
end
context
end
@@ -61,6 +81,6 @@
params
end
end
end
end
-end
\ No newline at end of file
+end