Created
May 24, 2016 02:35
-
-
Save mrbongiolo/33370a007df3165339a5ef8ae1ad4202 to your computer and use it in GitHub Desktop.
Super basic example of Roda + Trailblazer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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