Class: Angus::RequestHandler

Inherits:
Object
  • Object
show all
Includes:
Responses
Defined in:
lib/angus/request_handler.rb

Direct Known Subclasses

Base

Constant Summary collapse

DEFAULT_RENDER =
:json

Constants included from StatusCodes

StatusCodes::HTTP_STATUS_CODE_CONFLICT, StatusCodes::HTTP_STATUS_CODE_FORBIDDEN, StatusCodes::HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR, StatusCodes::HTTP_STATUS_CODE_NOT_FOUND, StatusCodes::HTTP_STATUS_CODE_OK, StatusCodes::HTTP_STATUS_CODE_UNPROCESSABLE_ENTITY

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Responses

#build_data_response, #build_message, #build_messages, #build_success_response, #get_message_definition, #json

Methods included from StatusCodes

included

Constructor Details

#initializeRequestHandler

Returns a new instance of RequestHandler.



17
18
19
20
21
22
# File 'lib/angus/request_handler.rb', line 17

def initialize
  @router = Angus::Router.new
  @middleware = []

  use Middleware::ExceptionHandler
end

Instance Attribute Details

#middlewareObject (readonly)

Returns the value of attribute middleware.



15
16
17
# File 'lib/angus/request_handler.rb', line 15

def middleware
  @middleware
end

Instance Method Details

#call(env) ⇒ Object



28
29
30
# File 'lib/angus/request_handler.rb', line 28

def call(env)
  to_app.call(env)
end

#call!(env) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/angus/request_handler.rb', line 47

def call!(env)
  begin
    response = router.route(env)
  rescue NotImplementedError
    response = Response.new
    response.status = HTTP_STATUS_CODE_NOT_FOUND

    render(response, { 'status' => 'error',
                       'messages' => [{ 'level' => 'error', 'key' => 'RouteNotFound',
                                        'dsc' => 'Invalid route' }]
    }, {format: :json})
  end

  response.finish
end

#disuse(middleware) ⇒ Object



98
99
100
101
102
# File 'lib/angus/request_handler.rb', line 98

def disuse(middleware)
  index = @middleware.map(&:first).index(middleware) or raise MiddlewareNotFound.new(middleware)

  @middleware.delete_at(index)
end

#render(response, content, options = {}) ⇒ Object

TODO add more formats in the future.



64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/angus/request_handler.rb', line 64

def render(response, content, options = {})
  format = options[:format] || DEFAULT_RENDER
  case(format)
  when :html
    HtmlRender.render(response, content)
  when :json
    JsonRender.render(response, content)
  else
    raise 'Unknown render format'
  end

  response
end

#routerObject



24
25
26
# File 'lib/angus/request_handler.rb', line 24

def router
  @router
end

#to_appObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/angus/request_handler.rb', line 32

def to_app
  inner_app = lambda { |env| self.dup.call!(env) }
  @app ||= @middleware.reverse.inject(inner_app) do |app, middleware|
    klass, args, block = middleware

    # HACK to improve performance for now, in reality Middleware::ExceptionHandler should get
    # the doc from a know place or the documentation should be available to all middleware.
    if klass == Middleware::ExceptionHandler
      klass.new(app, @definitions)
    else
      klass.new(app, *args, &block)
    end
  end
end

#use(middleware, *args, &block) ⇒ Object



78
79
80
81
82
# File 'lib/angus/request_handler.rb', line 78

def use(middleware, *args, &block)
  return if @middleware.map(&:first).include?(middleware)

  @middleware << [middleware, args, block]
end

#use_after(klass, middleware, *args, &block) ⇒ Object



91
92
93
94
95
96
# File 'lib/angus/request_handler.rb', line 91

def use_after(klass, middleware, *args, &block)
  return if @middleware.map(&:first).include?(middleware)
  index = @middleware.map(&:first).index(klass) or raise MiddlewareNotFound.new(middleware)

  @middleware.insert(index + 1, [middleware, args, block])
end

#use_before(klass, middleware, *args, &block) ⇒ Object



84
85
86
87
88
89
# File 'lib/angus/request_handler.rb', line 84

def use_before(klass, middleware, *args, &block)
  return if @middleware.map(&:first).include?(middleware)
  index = @middleware.map(&:first).index(klass) or raise MiddlewareNotFound.new(middleware)

  @middleware.insert(index, [middleware, args, block])
end