Sha256: 9a8be4cc989cb7cc50ce79e3ddfdc1364a7b871a06feb9d4213d88873447f4fb

Contents?: true

Size: 1.99 KB

Versions: 45

Compression:

Stored size: 1.99 KB

Contents

module JsonapiCompliable
  module Util
    # Helper methods for traversing the 'relationships' JSONAPI payloads
    # @api private
    class RelationshipPayload
      attr_reader :resource, :payload

      def self.iterate(resource:, relationships: {}, only: [], except: [])
        instance = new(resource, relationships, only: only, except: except)
        instance.iterate do |sideload, relationship_data, sub_relationships|
          yield sideload, relationship_data, sub_relationships
        end
      end

      def initialize(resource, payload, only: [], except: [])
        @resource = resource
        @payload  = payload
        @only     = only
        @except   = except
      end

      def iterate
        payload.each_pair do |relationship_name, relationship_payload|
          if sl = resource.sideload(relationship_name.to_sym)
            if should_yield?(sl.type)
              if relationship_payload.is_a?(Array)
                relationship_payload.each do |rp|
                  yield payload_for(sl, rp)
                end
              else
                yield payload_for(sl, relationship_payload)
              end
            end
          end
        end
      end

      private

      def should_yield?(type)
        (@only.length > 0 && @only.include?(type)) ||
          (@except.length > 0 && !@except.include?(type))
      end

      def payload_for(sideload, relationship_payload)
        if sideload.polymorphic?
          type     = relationship_payload[:meta][:jsonapi_type]
          sideload = sideload.polymorphic_child_for_type(type)
        end
        relationship_payload[:meta][:method] ||= :update

        {
          sideload: sideload,
          is_polymorphic: !sideload.parent.nil?,
          primary_key: sideload.primary_key,
          foreign_key: sideload.foreign_key,
          attributes: relationship_payload[:attributes],
          meta: relationship_payload[:meta],
          relationships: relationship_payload[:relationships]
        }
      end
    end
  end
end

Version data entries

45 entries across 45 versions & 1 rubygems

Version Path
jsonapi_compliable-0.11.34 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.33 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.32 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.31 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.30 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.29 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.28 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.27 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.26 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.25 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.24 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.23 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.22 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.21 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.20 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.19 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.18 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.17 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.16 lib/jsonapi_compliable/util/relationship_payload.rb
jsonapi_compliable-0.11.15 lib/jsonapi_compliable/util/relationship_payload.rb