Module: Ballast::Concerns::JSONApi::RequestHandling
- Defined in:
- lib/ballast/concerns/json_api/request_handling.rb
Overview
A concern to handle JSON API requests.
Constant Summary collapse
- CONTENT_TYPE =
The default JSON API Content-Type.
"application/vnd.api+json".freeze
Instance Method Summary collapse
-
#request_cast_attributes(target, attributes) ⇒ Hash
Casts attributes according to the target object definitions.
-
#request_extract_model(target, type_field: :type, attributes_field: :attributes, relationships_field: :relationships) ⇒ Hash
Extract a model attributes from request data.
-
#request_handle_cors ⇒ Object
Adds Cross Origin Request (CORS) headers.
-
#request_source_host ⇒ String
Returns the current source host.
-
#request_valid_content_type ⇒ String
Returns the valid Content-Type for JSON API requests.
-
#request_validate ⇒ Object
Validates a request.
Instance Method Details
#request_cast_attributes(target, attributes) ⇒ Hash
Casts attributes according to the target object definitions.
76 77 78 79 80 81 82 83 84 |
# File 'lib/ballast/concerns/json_api/request_handling.rb', line 76 def request_cast_attributes(target, attributes) types = target.class.column_types attributes.each do |k, v| request_cast_attribute(target, attributes, types, k, v) end attributes end |
#request_extract_model(target, type_field: :type, attributes_field: :attributes, relationships_field: :relationships) ⇒ Hash
Extract a model attributes from request data
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/ballast/concerns/json_api/request_handling.rb', line 54 def request_extract_model(target, type_field: :type, attributes_field: :attributes, relationships_field: :relationships) data = params[:data] request_validate_model_type(target, data, type_field) data = data[attributes_field] fail_request!(:bad_request, "Missing attributes in the \"attributes\" field.") if data.blank? # Extract attributes using strong parameters data = (validate_attributes(data, target), target, relationships_field) # Extract relationships data.merge!(validate_relationships(params[:data], target, relationships_field)) data end |
#request_handle_cors ⇒ Object
Adds Cross Origin Request (CORS) headers.
11 12 13 14 15 16 |
# File 'lib/ballast/concerns/json_api/request_handling.rb', line 11 def request_handle_cors headers["Access-Control-Allow-Origin"] = Rails.env.development? ? "http://#{request_source_host}:4200" : Rails.application.secrets.cors_source headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS" headers["Access-Control-Allow-Headers"] = "Content-Type, X-User-Email, X-User-Token" headers["Access-Control-Max-Age"] = 1.year.to_i.to_s end |
#request_source_host ⇒ String
Returns the current source host.
36 37 38 |
# File 'lib/ballast/concerns/json_api/request_handling.rb', line 36 def request_source_host @api_source ||= URI.parse(request.url).host end |
#request_valid_content_type ⇒ String
Returns the valid Content-Type for JSON API requests.
43 44 45 |
# File 'lib/ballast/concerns/json_api/request_handling.rb', line 43 def request_valid_content_type Ballast::Concerns::JSONApi::RequestHandling::CONTENT_TYPE end |
#request_validate ⇒ Object
Validates a request.
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/ballast/concerns/json_api/request_handling.rb', line 21 def request_validate content_type = request_valid_content_type request.format = :json response.content_type = content_type unless Rails.env.development? && params["json"] @cursor = PaginationCursor.new(params, :page) params[:data] ||= HashWithIndifferentAccess.new validate_data(content_type) end |