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