Sha256: ceebd3f6ebeb3ae8defb6174dc4b777fc39a47f673c80612885305005b604c05

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

module JsonapiCompliable
  module SerializableHash
    def to_hash(fields: nil, include: {})
      {}.tap do |hash|
        _fields = fields[jsonapi_type] if fields
        attrs = requested_attributes(_fields).each_with_object({}) do |(k, v), h|
          h[k] = instance_eval(&v)
        end
        rels = @_relationships.select { |k,v| !!include[k] }
        rels.each_with_object({}) do |(k, v), h|
          serializers = v.send(:resources)
          attrs[k] = if serializers.is_a?(Array)
              serializers.map do |rr| # use private method to avoid array casting
                rr.to_hash(fields: fields, include: include[k])
              end
            elsif serializers.nil?
              nil
            else
              serializers.to_hash(fields: fields, include: include[k])
            end
        end

        hash[:id] = jsonapi_id
        hash.merge!(attrs) if attrs.any?
      end
    end
  end
  JSONAPI::Serializable::Resource.send(:include, SerializableHash)

  class HashRenderer
    def initialize(resource)
      @resource = resource
    end

    def render(options)
      serializers = options[:data]
      opts = options.slice(:fields, :include)
      to_hash(serializers, opts).tap do |hash|
        hash.merge!(options.slice(:meta)) if !options[:meta].empty?
      end
    end

    private

    def to_hash(serializers, opts)
      {}.tap do |hash|
        if serializers.is_a?(Array)
          hash[@resource.type] = serializers.map do |s|
            s.to_hash(opts)
          end
        else
          hash[@resource.type] = serializers.to_hash(opts)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jsonapi_compliable-1.0.alpha.2 lib/jsonapi_compliable/hash_renderer.rb