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



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/graphiti/rails/railtie.rb', line 125

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



120
121
122
123
# File 'lib/graphiti/rails/railtie.rb', line 120

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

#register_mime_typeObject



79
80
81
# File 'lib/graphiti/rails/railtie.rb', line 79

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

#register_parameter_parserObject



83
84
85
# File 'lib/graphiti/rails/railtie.rb', line 83

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

#register_renderersObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/graphiti/rails/railtie.rb', line 87

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