diff --git a/lib/graphiti/jsonapi_serializable_ext.rb b/lib/graphiti/jsonapi_serializable_ext.rb index c3d6081..05e0697 100644 --- a/lib/graphiti/jsonapi_serializable_ext.rb +++ b/lib/graphiti/jsonapi_serializable_ext.rb @@ -8,8 +8,13 @@ module JsonapiSerializableExt module RendererOverrides def _build(object, exposures, klass) resource = object.instance_variable_get(:@__graphiti_resource) - klass = object.instance_variable_get(:@__graphiti_serializer) - klass.new(exposures.merge(object: object, resource: resource)) + + if resource.present? + klass = object.instance_variable_get(:@__graphiti_serializer) + klass.new(exposures.merge(object: object, resource: resource)) + else + super(object, exposures, klass) + end end end @@ -18,26 +23,45 @@ module RelationshipOverrides def data @_resources_block = proc do resources = yield - if resources.nil? - nil - elsif resources.respond_to?(:to_ary) - Array(resources).map do |obj| - klass = obj.instance_variable_get(:@__graphiti_serializer) - resource = obj.instance_variable_get(:@__graphiti_resource) - klass.new(@_exposures.merge(object: obj, resource: resource)) - end + + if resources.nil? || Array(resources)[0].instance_variable_get(:@__graphiti_resource) + graphiti_data(resources) else - klass = resources.instance_variable_get(:@__graphiti_serializer) - resource = resources.instance_variable_get(:@__graphiti_resource) - klass.new(@_exposures.merge(object: resources, resource: resource)) + jsonapi_data(resources) + end + end + end + + def graphiti_data(resources) + if resources.nil? + nil + elsif resources.respond_to?(:to_ary) + Array(resources).map do |obj| + klass = obj.instance_variable_get(:@__graphiti_serializer) + resource = obj.instance_variable_get(:@__graphiti_resource) + klass.new(@_exposures.merge(object: obj, resource: resource)) + end + else + klass = resources.instance_variable_get(:@__graphiti_serializer) + resource = resources.instance_variable_get(:@__graphiti_resource) + klass.new(@_exposures.merge(object: resources, resource: resource)) + end + end + + def jsonapi_data(resources) + if resources.nil? + nil + elsif resources.respond_to?(:to_ary) + Array(resources).map do |obj| + @_class[obj.class.name.to_sym].new(@_exposures.merge(object: obj)) end + else + @_class[resources.class.name.to_sym].new(@_exposures.merge(object: resources)) end end end - JSONAPI::Serializable::Relationship - .send(:prepend, RelationshipOverrides) - JSONAPI::Serializable::Renderer - .send(:prepend, RendererOverrides) + JSONAPI::Serializable::Relationship.send(:prepend, RelationshipOverrides) + JSONAPI::Serializable::Renderer.send(:prepend, RendererOverrides) end end diff --git a/lib/graphiti/railtie.rb b/lib/graphiti/railtie.rb index cd1b521..605d4ab 100644 --- a/lib/graphiti/railtie.rb +++ b/lib/graphiti/railtie.rb @@ -27,8 +27,8 @@ class Railtie < ::Rails::Railtie end end - if Mime[:jsonapi].nil? # rails 4 - Mime::Type.register('application/vnd.api+json', :jsonapi) + if Mime[:graphiti].nil? # rails 4 + Mime::Type.register('application/vnd.api+json', :graphiti) end register_parameter_parser register_renderers @@ -39,22 +39,22 @@ class Railtie < ::Rails::Railtie # from jsonapi-rails PARSER = lambda do |body| data = JSON.parse(body) - data[:format] = :jsonapi + data[:format] = :graphiti data.with_indifferent_access end def register_parameter_parser if ::Rails::VERSION::MAJOR >= 5 - ActionDispatch::Request.parameter_parsers[:jsonapi] = PARSER + ActionDispatch::Request.parameter_parsers[:graphiti] = PARSER else - ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER + ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:graphiti]] = PARSER end end def register_renderers ActiveSupport.on_load(:action_controller) do - ::ActionController::Renderers.add(:jsonapi) do |proxy, options| - self.content_type ||= Mime[:jsonapi] + ::ActionController::Renderers.add(:graphiti) do |proxy, options| + self.content_type ||= Mime[:graphiti] opts = {} if respond_to?(:default_jsonapi_render_options) @@ -70,8 +70,8 @@ def register_renderers end ActiveSupport.on_load(:action_controller) do - ::ActionController::Renderers.add(:jsonapi_errors) do |proxy, options| - self.content_type ||= Mime[:jsonapi] + ::ActionController::Renderers.add(:graphiti_errors) do |proxy, options| + self.content_type ||= Mime[:graphiti] validation = GraphitiErrors::Serializers::Validation.new \ proxy.data, proxy.payload.relationships