Class: Graphiti::Rails::Railtie

Inherits:
Rails::Railtie
  • Object
show all
Defined in:
lib/graphiti/rails/railtie.rb

Overview

This Railtie exposes some configuration options:

  • config.graphiti.handled_exception_formats, defaulting to [:jsonapi]. Formats in this list will always have their exceptions handled by Graphiti.
  • config.graphiti.respond_to_formats, defaulting to [:json, :jsonapi, :xml]. When Responders is included in a controller it will respond to these mime types by default.

Constant Summary collapse

MEDIA_TYPE =

from jsonapi-rails

"application/vnd.api+json"
PARSER =
lambda do |body|
  data = JSON.parse(body)
  data[:format] = :jsonapi
  data.with_indifferent_access
end

Instance Method Summary collapse

Instance Method Details

#configure_endpoint_lookupObject



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/graphiti/rails/railtie.rb', line 115

def configure_endpoint_lookup
  Graphiti.config.context_for_endpoint = ->(path, action) {
    method = :GET
    case action
    when :show then path = "#{path}/1"
    when :create then method = :POST
    when :update
      path = "#{path}/1"
      method = :PUT
    when :destroy
      path = "#{path}/1"
      method = :DELETE
    end

    route = begin
      ::Rails.application.routes.recognize_path(path.to_s, method: method)
    rescue
      nil
    end
    "#{route[:controller]}_controller".classify.safe_constantize if route
  }
end

#establish_concurrencyObject

Only run concurrently if our environment supports it



110
111
112
113
# File 'lib/graphiti/rails/railtie.rb', line 110

def establish_concurrency
  Graphiti.config.concurrency = !::Rails.env.test? &&
    ::Rails.application.config.cache_classes
end

#register_mime_typeObject



69
70
71
# File 'lib/graphiti/rails/railtie.rb', line 69

def register_mime_type
  Mime::Type.register(MEDIA_TYPE, :jsonapi)
end

#register_parameter_parserObject



73
74
75
# File 'lib/graphiti/rails/railtie.rb', line 73

def register_parameter_parser
  ActionDispatch::Request.parameter_parsers[:jsonapi] ||= PARSER
end

#register_renderersObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/graphiti/rails/railtie.rb', line 77

def register_renderers
  ActiveSupport.on_load(:action_controller) do
    ::ActionController::Renderers.add(:jsonapi) do |proxy, options|
      self.content_type ||= Mime[:jsonapi]

      # opts = {}
      # if respond_to?(:default_jsonapi_render_options)
      #   opts = default_jsonapi_render_options
      # end

      if proxy.is_a?(Hash) # for destroy
        render(options.merge(json: proxy))
      else
        proxy.to_jsonapi(options)
      end
    end
  end

  ActiveSupport.on_load(:action_controller) do
    ActionController::Renderers.add(:jsonapi_errors) do |proxy, options|
      self.content_type ||= Mime[:jsonapi]

      validation = Graphiti::ErrorSerializers::Validation.new \
        proxy.data, proxy.payload.relationships

      render \
        json: {errors: validation.errors},
        status: :unprocessable_entity
    end
  end
end