class SimpleJsonapi::Rails::ActionController::JsonapiHelper

Attributes

controller[R]
pointers[R]
request_validator[R]

Public Class Methods

new(controller) click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 11
def initialize(controller)
  @controller = controller
  @pointers = {}
  @request_validator = RequestValidator.new(request, params)
end

Public Instance Methods

deserialize(jsonapi_data) click to toggle source

def url_helpers

::Rails.application.routes.url_helpers

end

# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 61
def deserialize(jsonapi_data)
  jsonapi_hash = case jsonapi_data
  when String then JSON.parse(jsonapi_data).deep_symbolize_keys
  when Hash then jsonapi_data.deep_symbolize_keys
  else jsonapi_data
  end

  data = jsonapi_hash[:data]
  return unless data

  result = {}
  pointers = {}

  result[:type] = data[:type]
  result[:id] = data[:id]
  pointers[:type] = "/data/type"
  pointers[:id] = "/data/id"

  if data[:attributes].present?
    data[:attributes].each do |name, value|
      result[name] = value
      pointers[name] = "/data/attributes/#{name}"
    end
  end

  if data[:relationships].present?
    data[:relationships].each do |name, value|
      related_data = value[:data]

      if related_data.is_a?(Array)
        singular_name = name.to_s.singularize
        result[:"#{singular_name}_types"] = related_data.pluck(:type)
        result[:"#{singular_name}_ids"] = related_data.pluck(:id)
        pointers[:"#{singular_name}_types"] = "/data/relationships/#{name}"
        pointers[:"#{name}_ids"] = "/data/relationships/#{name}"
      elsif related_data.is_a?(Hash)
        result[:"#{name}_type"] = related_data[:type]
        result[:"#{name}_id"] = related_data[:id]
        pointers[:"#{name}_type"] = "/data/relationships/#{name}"
        pointers[:"#{name}_id"] = "/data/relationships/#{name}"
      end
    end
  end

  @pointers = pointers
  result
end
fields_params() click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 21
def fields_params
  (params[:fields] || {}).transform_values { |f| f.split(/,/) }
end
filter_param(param_name) click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 25
def filter_param(param_name)
  (params[:filter] || {})[param_name]
end
filter_param_list(param_name) click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 29
def filter_param_list(param_name)
  param_value = filter_param(param_name)
  return nil unless param_value

  param_value.split(/,/)
end
include_params() click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 17
def include_params
  params[:include].to_s.split(/,/).presence
end
render_bad_request(message) click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 50
def render_bad_request(message)
  error = SimpleJsonapi::Errors::BadRequest.new(detail: message)
  render jsonapi_errors: [error], status: :bad_request
end
render_model_errors(model) click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 45
def render_model_errors(model)
  errors = SimpleJsonapi::Errors::ActiveModelError.from_errors(model.errors, pointers)
  render jsonapi_errors: errors, status: :unprocessable_entity
end
render_record_not_found(error) click to toggle source

@param error [ActiveRecord::RecordNotFound]

# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 41
def render_record_not_found(error)
  render jsonapi_errors: error, status: :not_found
end
validate_jsonapi_request_body() click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 114
def validate_jsonapi_request_body
  unless request_validator.valid_request_body?
    raise InvalidJsonStructureError, "Not a valid jsonapi request body"
  end
end
validate_jsonapi_request_headers() click to toggle source
# File lib/simple_jsonapi/rails/action_controller/jsonapi_helper.rb, line 109
def validate_jsonapi_request_headers
  return head :unsupported_media_type unless request_validator.valid_content_type_header?
  head :not_acceptable unless request_validator.valid_accept_header?
end