Sha256: b61777207f0a5daaccc576324d0ea82337ed4fbf5db5ab72be2069ad796e1706

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 KB

Contents

# frozen_string_literal: true

module Dayman
  module Parsers
    class Base
      def initialize(resource:, response:)
        @resource = resource
        @raw_response = response
      end

      private

      def parsed_response
        @parsed_response ||= begin
          return if @raw_response.blank?
          JSON.parse(@raw_response).deep_symbolize_keys
        end
      end

      def resource_class_for(item)
        return if item.nil?

        item[:type].classify.safe_constantize
      end

      def response_item_to_object(item)
        return unless resource_class = resource_class_for(item)

        resource_class.new(item.slice(:id, :attributes))
      end

      def build_relationship(resource, relationship_name, relationship_content)
        return unless resource.respond_to?(relationship_name)

        if relationship_content.is_a?(Array)
          build_collection_relationship(resource, relationship_name, relationship_content)
        else
          build_member_relationship(resource, relationship_name, relationship_content)
        end
      end

      def build_collection_relationship(resource, relationship_name, relationship_content)
        relationship_content.each do |relationship_item|
          included_item = find_included_item(relationship_item)
          next unless object = response_item_to_object(included_item)

          resource.send(relationship_name) << object
        end
      end

      def build_member_relationship(resource, relationship_name, relationship_content)
        included_item = find_included_item(relationship_content)
        return unless object = response_item_to_object(included_item)

        resource.send("#{relationship_name}=", object)
      end

      def find_included_item(relationship_item)
        parsed_response[:included].find do |e|
          e.slice(:id, :type) == relationship_item[:data].slice(:id, :type)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dayman-0.1.1 lib/dayman/parsers/base.rb