Sha256: b1fc8a68d2e4263db7b64e82403e76f4dcdb788291b7b1e78977e393965a9167

Contents?: true

Size: 1.87 KB

Versions: 2

Compression:

Stored size: 1.87 KB

Contents

# frozen_string_literal: true

module Fortnox
  module API
    module Mapper
      module ToJSON
        def self.included(base)
          base.send :extend, ClassMethods

          base.send :private_class_method,
                    :convert_hash_keys_to_json_format,
                    :convert_key_to_json,
                    :default_key_to_json_transform,
                    :sanitise
        end

        module ClassMethods
          def call(entity, keys_to_filter = {})
            entity_hash = entity.to_hash
            clean_entity_hash = sanitise(entity_hash, keys_to_filter)
            clean_entity_hash = convert_hash_keys_to_json_format(clean_entity_hash)
            Registry[:hash].call(clean_entity_hash)
          end

          # PRIVATE

          def convert_hash_keys_to_json_format(hash)
            hash.transform_keys do |key|
              convert_key_to_json(key)
            end
          end

          def convert_key_to_json(key)
            self::KEY_MAP.fetch(key) { default_key_to_json_transform(key) }
          end

          def default_key_to_json_transform(key)
            key.to_s.split('_').map(&:capitalize).join('')
          end

          def sanitise(hash, keys_to_filter)
            hash.reject do |key, value|
              next false if keys_to_filter.include?(key)
              value.nil?
            end
          end
        end

        def entity_to_hash(entity, keys_to_filter)
          entity_json_hash = Registry[mapper_name_for(entity)]
                             .call(entity, keys_to_filter)
          wrap_entity_json_hash(entity_json_hash)
        end

        def wrap_entity_json_hash(entity_json_hash)
          { self.class::JSON_ENTITY_WRAPPER => entity_json_hash }
        end

        private

        def mapper_name_for(value)
          value.class.name.split('::').last.downcase.to_sym
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fortnox-api-0.8.2 lib/fortnox/api/mappers/base/to_json.rb
fortnox-api-0.8.1 lib/fortnox/api/mappers/base/to_json.rb