Skip to content

Instantly share code, notes, and snippets.

@rpbaltazar
Created November 20, 2017 04:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rpbaltazar/806773e9c0a12e9fbd30e5c9d27a5243 to your computer and use it in GitHub Desktop.
Save rpbaltazar/806773e9c0a12e9fbd30e5c9d27a5243 to your computer and use it in GitHub Desktop.
TRB endpoint integration
class Api::V1::MyController < Api::V1::BaseController
def push_all
op_res = V1::MyOperation::PushAll.(params, current_user: current_user)
success_proc = ->(result, _representer) do
{ "data": result["response"], "status": :ok }
end
endpoint_res = OPL::Endpoint.(op_res, nil, success: { resolve: success_proc })
render json: endpoint_res[:data], status: endpoint_res[:status]
end
def index
result = V1::MyOperation::Index.(params, current_user: current_user)
endpoint_res = OPL::Endpoint.(result, V1::MyOperation::Representer::Index)
render json: endpoint_res[:data], status: endpoint_res[:status]
end
end
module OPL
class Endpoint
DEFAULT_MATCHERS = {
created: {
rule: ->(result) { result.success? && result["model.action"] == :new },
resolve: ->(result, representer) do
{
"data": representer.new(result["model"]),
"status": :created
}
end
},
success: {
rule: ->(result) { result.success? },
resolve: ->(result, representer) do
{
"data": representer.new(result["results"]),
"status": :ok
}
end
},
unauthenticated: {
rule: ->(result) { result.policy_error? },
resolve: ->(_result, _representer) do
{
"data": {},
"status": :unauthorized
}
end
},
invalid: {
# rule: ->(result) { result.failure? && result["result.contract.default"]&.failure? },
rule: ->(result) { result.failure? },
resolve: ->(_result, _representer) do
{
"data": {},
"status": :unprocessable_entity
}
end
},
not_found: {
rule: ->(result) { result.failure? && result["result.model"]&.failure? },
resolve: ->(result, _representer) do
{
"data": { errors: result["result.model.errors"] },
"status": :unprocessable_entity
}
end
}
}
# options expects a TRB Operation result
# it might have a representer, else will assume the default name
def self.call(operation_result, representer_class = nil, overrides = {})
# TODO: What to do when nothing matches?
endpoint_opts = { result: operation_result, representer: representer_class }
new.(endpoint_opts, overrides)
end
def call(options, overrides)
overrides.each do |rule_key, rule_description|
rule = rule_description[:rule] || DEFAULT_MATCHERS[rule_key][:rule]
resolve = rule_description[:resolve] || DEFAULT_MATCHERS[rule_key][:resolve]
if rule.nil? || resolve.nil?
puts "Matcher is not properly set. #{rule_key} will be ignored"
next
end
return resolve.(options[:result], options[:representer]) if rule.(options[:result])
end
matching_rules(overrides).each do |rule_key, rule_description|
if rule_description[:rule].(options[:result])
return rule_description[:resolve].(options[:result], options[:representer])
end
end
end
def matching_rules(overrides)
DEFAULT_MATCHERS.except(*overrides.keys)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment