Module: Angus::Responses

Included in:
RequestHandler
Defined in:
lib/angus/responses.rb

Constant Summary collapse

HTTP_STATUS_CODE_OK =
200
HTTP_STATUS_CODE_FORBIDDEN =
403
HTTP_STATUS_CODE_NOT_FOUND =
404
HTTP_STATUS_CODE_CONFLICT =
409
HTTP_STATUS_CODE_UNPROCESSABLE_ENTITY =
422
HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR =
500

Instance Method Summary collapse

Instance Method Details

#build_data_response(data, attributes, messages = []) ⇒ Object

Builds a success response with the received data



127
128
129
130
131
132
133
# File 'lib/angus/responses.rb', line 127

def build_data_response(data, attributes, messages = [])
  marshalled_data = Angus::Marshalling.marshal_object(data, attributes)

  messages = build_messages(Angus::SDoc::Definitions::Message::INFO_LEVEL, messages)

  build_success_response(marshalled_data, messages)
end

#build_error_response(error) ⇒ Object

Builds a service error response



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

def build_error_response(error)
  error_messages = messages_from_error(error)
  build_response(:error, *error_messages)
end

#build_message(key, level, *params) ⇒ ResponseMessage

Builds a ResponseMessage object

Raises:

  • (NameError)

    when there’s no message for the given key and level



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/angus/responses.rb', line 93

def build_message(key, level, *params)
  message_definition = get_message_definition(key, level)

  unless message_definition
    raise NameError.new("Could not found message with key: #{key}, level: #{level}")
  end

  description = if message_definition.text
                  message_definition.text % params
                else
                  message_definition.description
                end

  Angus::SDoc::Definitions::Message

  message = Angus::SDoc::Definitions::Message.new
  message.key = key
  message.level = level
  message.description = description

  message
end

#build_messages(level, messages) ⇒ Array<ResponseMessage>

Builds a list of messages with the following level

ResponseMessage objects contained in messages param won’t be modified, this method

only creates ResponseMessage for each Symbol in messages array

Raises:

  • (NameError)

    when there’s no message for the given key and level



161
162
163
164
165
166
167
168
169
# File 'lib/angus/responses.rb', line 161

def build_messages(level, messages)
  (messages || []).map do |message|
    if message.kind_of?(Angus::SDoc::Definitions::Message)
      message
    else
      build_message(message, level)
    end
  end
end

#build_no_data_response(messages = []) ⇒ String

Builds a success response with no elements

The response would include the following:

- status
- messages


144
145
146
147
148
# File 'lib/angus/responses.rb', line 144

def build_no_data_response(messages = [])
  messages = build_messages(Angus::SDoc::Definitions::Message::INFO_LEVEL, messages)

  build_success_response({}, messages)
end

#build_success_response(elements = {}, messages = []) ⇒ String

Builds a service success response



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

def build_success_response(elements = {}, messages = [])
  elements = {
    :status => :success,
  }.merge(elements)

  unless messages.empty?
    elements[:messages] = messages
  end

  json(elements)
end

#build_warning_response(error) ⇒ Object

Builds a service success response



117
118
119
120
# File 'lib/angus/responses.rb', line 117

def build_warning_response(error)
  error_messages = messages_from_error(error, :warning)
  build_response(:success, *error_messages)
end

#get_error_definition(error) ⇒ Hash

Returns the error definition.

If the error does not responds to error_key nil will be returned, see EvolutionError.



46
47
48
49
50
# File 'lib/angus/responses.rb', line 46

def get_error_definition(error)
  error_key = error.class.name

  get_message_definition(error_key, Angus::SDoc::Definitions::Message::ERROR_LEVEL)
end

#get_error_status_code(error) ⇒ Integer

Returns a suitable HTTP status code for the given error

If error param responds to #errors, then #HTTP_STATUS_CODE_CONFLICT will be returned.

If error param responds to #error_key, then the status_code associated

with the message will be returned.


25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/angus/responses.rb', line 25

def get_error_status_code(error)
  if error.respond_to?(:errors)
    return HTTP_STATUS_CODE_CONFLICT
  end

  message = get_error_definition(error)

  if message
    message.status_code
  else
    HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR
  end
end

#get_message_definition(key, level) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/angus/responses.rb', line 52

def get_message_definition(key, level)
  message = @definitions.messages.find { |name, definition|
    name == key.to_s && definition.level.downcase == level.downcase
  }

  message.last if message
end

#json(element) ⇒ Object

Sets the content_type to json and serialize element as json



172
173
174
175
# File 'lib/angus/responses.rb', line 172

def json(element)
  #content_type :json
  JSON(element, :ascii_only => true)
end