require 'rubygems' require 'bundler/setup' require 'mime/types' require 'yajl' require 'rubyapp/element' require 'rubyapp/elements/exception_element' require 'rubyapp/elements/pages/exception_page' require 'rubyapp/mixins/route' require 'rubyapp/session' module RubyApp module Rack class Route extend RubyApp::Mixins::Route def call(environment) RubyApp::Session.request.logger.debug("RubyApp::Rack::Route#call(...) matching #{RubyApp::Session.request.path}") self.class.do_route(RubyApp::Session.request.request_method, RubyApp::Session.request.path) end route(RubyApp::Mixins::Route::GET, /\/elements\/([^\.]+)\.([^\.]+)/) do |method, path, element_id, format| RubyApp::Session.request.logger.debug("RubyApp::Rack::Route.get(...) method=#{method.inspect} path=#{path.inspect} element_id=#{element_id.inspect} format=#{format.to_sym.inspect}") begin [ 200, { 'content-type' => RubyApp::Rack::Route.get_content_type(format) }, [ RubyApp::Element.get_element(element_id).render(format.to_sym) ] ] rescue Exception => exception RubyApp::Session.request.logger.error("RubyApp::Rack::Route.get(...) method=#{method.inspect} path=#{path.inspect} element_id=#{element_id.inspect} format=#{format.to_sym.inspect} exception=#{exception.class.inspect} #{exception.message}") RubyApp::Session.request.logger.error("RubyApp::Rack::Route.get(...) \n#{exception.backtrace.join("\n")}") [ 200, { 'content-type' => RubyApp::Rack::Route.get_content_type(format) }, [ RubyApp::Elements::ExceptionElement.new(exception).render(format.to_sym) ] ] end end route(RubyApp::Mixins::Route::GET, /\.([^\.]+)/) do |method, path, format| RubyApp::Session.request.logger.debug("RubyApp::Rack::Route.get(...) method=#{method.inspect} path=#{path.inspect} format=#{format.to_sym.inspect}") begin [ 200, { 'content-type' => RubyApp::Rack::Route.get_content_type(format) }, [ RubyApp::Session.current.pages.last.render(format.to_sym) ] ] rescue Exception => exception RubyApp::Session.request.logger.error("RubyApp::Rack::Route.get(...) method=#{method.inspect} path=#{path.inspect} format=#{format.to_sym.inspect} exception=#{exception.class.inspect} #{exception.message}") RubyApp::Session.request.logger.error("RubyApp::Rack::Route.get(...) \n#{exception.backtrace.join("\n")}") [ 200, { 'content-type' => RubyApp::Rack::Route.get_content_type(format) }, [ RubyApp::Elements::Pages::ExceptionPage.new(exception).render(format.to_sym) ] ] end end route(RubyApp::Mixins::Route::GET, /.*/) do |method, path| RubyApp::Session.request.logger.debug("RubyApp::Rack::Route.get(...) method=#{method.inspect} path=#{path.inspect}") do_route(RubyApp::Mixins::Route::GET, '/.html') end route(RubyApp::Mixins::Route::POST, /.*/) do |method, path| RubyApp::Session.request.logger.debug("RubyApp::Rack::Route.post(...) method=#{method.inspect} path=#{path.inspect} POST=#{RubyApp::Session.request.POST.inspect}") begin event = RubyApp::Element::Event.from_hash(RubyApp::Session.request.POST) RubyApp::Session.current.process(event) [ 200, { 'content-type' => 'application/json' }, [ Yajl::Encoder.new.encode(event.to_hash) ] ] rescue Exception => exception RubyApp::Session.request.logger.error("RubyApp::Rack::Route.post(...) method=#{method.inspect} path=#{path.inspect} POST=#{RubyApp::Session.request.POST.inspect} exception=#{exception.class.inspect} #{exception.message}") RubyApp::Session.request.logger.error("RubyApp::Rack::Route.post(...) \n#{exception.backtrace.join("\n")}") [ 200, { 'content-type' => 'application/json' }, [ Yajl::Encoder.new.encode(RubyApp::Element::ExceptionEvent.new(exception).to_hash) ] ] end end def self.get_content_type(format) ( mime_type = MIME::Types.type_for(format)[0] ) ? mime_type.content_type : 'text/plain' end end end end