require "bundler/setup"
require "sinatra"
require "ostruct"
require "roar/json"
require "sinatra/multi_route"
require File.expand_path("../band_representer.rb", __FILE__)
class Band
attr_reader :name, :label
def name=(value)
@name = value.upcase
end
def label=(value)
@label = value.upcase
end
end
def consume_band
Band.new.
extend(Integration::BandRepresenter).
from_json(request.body.read)
end
get "/method" do
"get"
end
post "/method" do
"post - #{request.body.read}"
end
put "/method" do
"put - #{request.body.read}"
end
delete "/method" do
"delete"
end
patch "/method" do
"patch - #{request.body.read}"
end
get '/deliberate-error' do
raise 'this error was deliberate'
end
post "/bands" do
#if request.content_type =~ /xml/
body consume_band.to_json
status 201
end
get '/bands' do
[OpenStruct.new(:name => "Slayer", :label => "Canadian Maple"),
OpenStruct.new(:name => "Nirvana", :label => "Sub Pop")]
.extend(Integration::BandRepresenter.for_collection).to_json
end
put "/bands/strungout" do
# DISCUSS: as long as we don't agree on what to return in PUT/PATCH, let's return an updated document.
body consume_band.to_json
#status 204
end
patch '/bands/strungout' do
# DISCUSS: as long as we don't agree on what to return in PUT/PATCH, let's return an updated document.
body consume_band.to_json
#status 204
end
get "/bands/slayer" do
OpenStruct.new(:name => "Slayer", :label => "Canadian Maple").
extend(Integration::BandRepresenter).
to_json
end
delete '/bands/metallica' do
status 204
end
route :get, :delete, :patch, :post, :put, %r{/bands/nirvana/status([\d]*)_and_data} do
status params[:captures]
OpenStruct.new(:name => "Nirvana", :label => "Sub Pop").
extend(Integration::BandRepresenter).
to_json
end
route :get, :delete, :patch, :post, :put, %r{/bands/nirvana/status([\d]*)_no_data} do
status params[:captures]
end
helpers do
def protected!
return if authorized?
headers['WWW-Authenticate'] = 'Basic realm="Restricted Area"'
halt 401, "Not authorized\n"
end
def authorized?
@auth ||= Rack::Auth::Basic::Request.new(request.env)
@auth.provided? and @auth.basic? and @auth.credentials and @auth.credentials == ['admin', 'password']
end
end
route :get, :post, :put, :delete, "/protected/bands/bodyjar" do
protected!
OpenStruct.new(:name => "Bodyjar").
extend(Integration::BandRepresenter).
to_json
end
route :get, :post, :put, :delete, "/cookies" do
raise "No cookies!" unless request.env["HTTP_COOKIE"] == "Yumyum"
%{{"name": "Bodyjar"}}
end
get "/ping" do
"1"
end