lib/lexer/identity/api.rb in lexer-identity-0.1.0 vs lib/lexer/identity/api.rb in lexer-identity-0.2.0
- old
+ new
@@ -3,41 +3,75 @@
# :nordoc:
module Lexer
# :nordoc:
module Identity
+ # Constants for attribute confidence
+ CONFIDENCE_PROVIDED = 2
+ CONFIDENCE_CALCULATED = 1
+ CONFIDENCE_INFERRED = 0
+
# The backbone of the Identity API.
# Enrich accepts links and attributes as per the
# API Documentation hosted at http://developer.lexer.io/
#
# Options:
#
+ # +id+ - A string of the Lexer Identity ID to lookup
# +links+ - A hash of links to search for and link to the identity. Default: {}.
# +attributes+ - A hash of attributes where keys are valid namespaces. Default: {}.
#
+ # An +id+ or +links+ is required for a valid request.
+ #
# Response:
#
# A hash containing the Lexer Identity ID and any attributes on the identity
#
- def self.enrich(links: {}, attributes: {})
+ def self.enrich(id: nil, links: {}, attributes: {})
+ body = {}
+
# ensure the module is configured
fail Lexer::Identity::ConfigurationError, 'Module has not been configured.' if configuration.nil?
configuration.validate
- # produce the request body
- body = {}
- body[:links] = links
- body[:attributes] = attributes unless configuration.contributor_token.nil?
+ # use the id if provided
+ if id.nil?
+ if links.keys.size == 0
+ fail Lexer::Identity::MissingLinksError, 'An ID or Link is required'
+ else
+ body[:links] = links
+ end
+ else
+ body[:id] = id
+ end
+
+ # only include attributes if contributing
+ if !configuration.contributor_token.nil? && attributes.keys.size > 0
+ self.validate_attributes attributes
+ body[:attributes] = attributes
+ end
+
body[:api_token] = configuration.api_token unless configuration.api_token.nil?
body[:contributor_token] = configuration.contributor_token unless configuration.contributor_token.nil?
body[:consumer_token] = configuration.consumer_token unless configuration.consumer_token.nil?
post_request body
end
private
+ def self.validate_attributes attributes
+ attributes.each { |k, v|
+ unless v.is_a? Hash
+ fail Lexer::Identity::AttributePayloadError, "#{k} is not a hash"
+ end
+ unless v.has_key?(:value) && v.has_key?(:confidence)
+ fail Lexer::Identity::AttributePayloadError, "#{k} has an invalid payload"
+ end
+ }
+ end
+
def self.post_request(body)
uri = URI(configuration.api_url)
header = { 'Content-Type' => 'application/json' }
request = Net::HTTP::Post.new(uri, header)
request.body = MultiJson.encode(body)
@@ -53,16 +87,16 @@
def self.parse_response(response)
case response.code.to_i
when 200..204
Lexer::Identity::EnrichedResult.from_json response.body
when 400
- fail Lexer::Identity::BadRequestError, response_body
+ fail Lexer::Identity::BadRequestError, response.body
when 401
- fail Lexer::Identity::AuthenticationError, response_body
+ fail Lexer::Identity::AuthenticationError, response.body
when 404
- fail Lexer::Identity::NotFoundError, response_body
+ fail Lexer::Identity::NotFoundError, response.body
else
- fail Lexer::Identity::HttpError, response_body
+ fail Lexer::Identity::HttpError, response.body
end
end
end
end