Sha256: 8e39ba2f68201b45d6cc809238174dc75cd1e96040c58ed6f68be56899262766

Contents?: true

Size: 1.3 KB

Versions: 3

Compression:

Stored size: 1.3 KB

Contents

# Allows a resource to be found by a string-based alternative key
#
# For example
#
# module MyClient
#   module MyResource < Frenetic::Resource
#     extend Frenetic::Behaviors::AlternateStringIdentifier
#
#     def self.find(id)
#       super(finder_params(id, :username))
#     end
#   end
# end
#
# Given an Api Schema such as:
#
# {
#   _links: {
#     my_resource: [{
#       { href: '/api/my_resource/{id}', rel: 'id' },
#       { href: '/api/my_resource/{username}?specific_to=username', rel: 'username' },
#     }]
#   }
# }
#
# MyClient::MyResource.find will choose the alternate link relation based on
# the string-based ID passed in.
#
# MyClient::MyResource.find(1)
# # Executes /api/my_resource/1
#
# MyClient::MyResource.find('100')
# # Executes /api/my_resource/100
#
# MyClient::MyResource.find('jdoe')
# Executes /api/my_resource/jdoe?specific_to=username
#
class Frenetic
  module Behaviors
    module AlternateStringIdentifier
      def finder_params(unique_id, alternate_key)
        return unique_id if unique_id.is_a? Hash
        params = {}
        return params if unique_id.blank?
        key =
          if unique_id.to_i.to_s == unique_id.to_s
            :id
          elsif !unique_id.nil?
            alternate_key
          end
        params[key] = unique_id
        params
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
frenetic-3.0.1 lib/frenetic/behaviors/alternate_string_identifier.rb
frenetic-3.0.0 lib/frenetic/behaviors/alternate_string_identifier.rb
frenetic-2.0.0 lib/frenetic/behaviors/alternate_string_identifier.rb