Skip to content

Instantly share code, notes, and snippets.

@mrbongiolo
Created May 24, 2016 02:35
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 mrbongiolo/33370a007df3165339a5ef8ae1ad4202 to your computer and use it in GitHub Desktop.
Save mrbongiolo/33370a007df3165339a5ef8ae1ad4202 to your computer and use it in GitHub Desktop.
Super basic example of Roda + Trailblazer
# This app is an API only, that's why we set :json as response and as params.
# This is the Roda Router.
# This app used roda + hanami model + TRB;
# Those methods `present Ami::V1::Customer::Collection` are calls to the app Operations
# #present and #run are helper methods added to handle the response of an Operation.
# Basically when I `run` and operation and it is successful I'll just call Operation#decorated hash and transform it into JSON;
# If the operation failed then I'll create a json response with status: :unprocessable_entity and call the Operation#error.messages and add it to the json response.
module Ami
module V1
class Routes < Roda
plugin MyApp::RodaHelper
route do |r|
uuid_matcher = /(\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/.freeze
r.on 'customers' do
puts 'customers'
r.is do
# GET /customers
r.get do
puts 'index'
present Ami::V1::Customer::Collection
end
# POST /customers
r.post do
puts 'create'
run Ami::V1::Customer::Create
end
end
r.on uuid_matcher do |customer_id|
puts customer_id
params.merge!(id: customer_id)
r.is do
# GET /customers/:id
r.get do
puts 'show'
present Ami::V1::Customer::Resource
end
# PUT /customers/:id
r.put do
puts 'update'
run Ami::V1::Customer::Update
end
# DELETE /customers/:id
r.delete do
puts 'destroy'
run Ami::V1::Customer::Destroy
end
end
# Customer Addresses
r.on 'addresses' do
puts 'addresses'
params.delete(:id)
params.merge!(customer_id: customer_id)
r.is do
# GET /professsionals/:customer_id/addresses
r.get do
puts 'index'
present Ami::V1::Customer::Address::Collection
end
# POST /customers/:customer_id/addresses
r.post do
puts 'create'
run Ami::V1::Customer::Address::Create
end
end
r.on uuid_matcher do |address_id|
puts address_id
params.merge!(id: address_id)
r.is do
# GET /customers/:customer_id/addresses/:id
r.get do
puts 'show'
present Ami::V1::Customer::Address::Resource
end
# PUT /customers/:customer_id/addresses/:id
r.put do
puts 'update'
run Ami::V1::Customer::Address::Update
end
# DELETE /customers/:profesional_id/addresses/:id
r.delete do
puts 'delete'
run Ami::V1::Customer::Address::Destroy
end
end
end
end
end
end
r.on 'professionals' do
puts 'professionals'
r.is do
# GET /professionals
r.get do
puts 'index'
present Ami::V1::Professional::Collection
end
# POST /professionals
r.post do
puts 'create'
run Ami::V1::Professional::Create
end
end
r.on uuid_matcher do |professional_id|
puts professional_id
params.merge!(id: professional_id)
r.is do
# GET /professionals/:id
r.get do
puts 'show'
present Ami::V1::Professional::Resource
end
# PUT /professionals/:id
r.put do
puts 'update'
run Ami::V1::Professional::Update
end
# DELETE /professionals/:id
r.delete do
puts 'destroy'
run Ami::V1::Professional::Destroy
end
end
# Professional BankAccounts
r.on 'bank_accounts' do
puts 'bank_accounts'
params.delete(:id)
params.merge!(professional_id: professional_id)
r.is do
# GET /professsionals/:professional_id/bank_accounts
r.get do
puts 'index'
present Ami::V1::Professional::BankAccount::Collection
end
# POST /professionals/:professional_id/bank_accounts
r.post do
puts 'create'
run Ami::V1::Professional::BankAccount::Create
end
end
r.on :id do |bank_account_id|
puts bank_account_id
params.merge!(id: bank_account_id)
r.is do
# GET /professionals/:professional_id/bank_accounts/:id
r.get do
puts 'show'
present Ami::V1::Professional::BankAccount::Resource
end
# PUT /professionals/:professional_id/bank_accounts/:id
r.put do
puts 'update'
run Ami::V1::Professional::BankAccount::Update
end
# DELETE /professionals/:profesional_id/bank_accounts/:id
r.delete do
puts 'delete'
run Ami::V1::Professional::BankAccount::Destroy
end
end
end
end
# Professional Addresses
r.on 'addresses' do
puts 'addresses'
params.delete(:id)
params.merge!(professional_id: professional_id)
r.is do
# GET /professsionals/:professional_id/addresses
r.get do
puts 'index'
present Ami::V1::Professional::Address::Collection
end
# POST /professionals/:professional_id/addresses
r.post do
puts 'create'
run Ami::V1::Professional::Address::Create
end
end
r.on uuid_matcher do |address_id|
puts address_id
params.merge!(id: address_id)
r.is do
# GET /professionals/:professional_id/addresses/:id
r.get do
puts 'show'
present Ami::V1::Professional::Address::Resource
end
# PUT /professionals/:professional_id/addresses/:id
r.put do
puts 'update'
run Ami::V1::Professional::Address::Update
end
# DELETE /professionals/:profesional_id/addresses/:id
r.delete do
puts 'delete'
run Ami::V1::Professional::Address::Destroy
end
end
end
end
end
end
end
end
end
end
module MyApp
module RodaHelper
def self.load_dependencies(app)
app.plugin :all_verbs
app.plugin :symbolized_params
app.plugin :json_parser,
parser: proc { |o| MultiJson.load(o) },
error_handler: MYApp::JsonParserErrorHandler
app.plugin :json,
serializer: proc { |o| MultiJson.dump(o, pretty: true) }
end
module InstanceMethods
private
def run(operation_class)
op = operation_class.run(params) do |op|
return valid_operation_response(op)
end
invalid_operation_response(op)
end
def present(operation_class)
operation_class.present(params).decorated.to_hash
end
def valid_operation_response(operation)
if operation.decorated
operation.decorated.to_hash
else
response.status = 204
end
end
def invalid_operation_response(operation)
response.status = 422
{
code: 422,
message: 'Validation Failed',
description: 'Check the errors field for detail information.',
errors: operation.errors
}
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment