lib/hubscreen/contact.rb in hubscreen-0.0.4 vs lib/hubscreen/contact.rb in hubscreen-0.0.5

- old
+ new

@@ -4,19 +4,31 @@ # HubSpot Contacts API # # {https://developers.hubspot.com/docs/methods/contacts/contacts-overview} # # This is a convenience object for single Hubspot contact returned by the API + # + # This is a convenience object for handling or retrieving single Hubspot contact returned by the API + # These helpers may not be updated as fast as the API. Use at your own risk class Contact < Hubscreen::Response CONTACT_KEYS = [:properties, :vid, :email, :first_name, :last_name, :hubspot_owner_id] + CONTACT_ROOT = "v1/contact" + FIND_BY_VID_PATH = "#{CONTACT_ROOT}/vid" #Note full endpoint is GET /contacts/v1/contact/vid/:contact_id/profile + FIND_BY_EMAIL_PATH = "#{CONTACT_ROOT}/email" #Note full endpoint is GET /contacts/v1/contact/email/:contact_email/profile + CREATE_OR_UPDATE_PATH = '#{CONTACT_ROOT}/createOrUpdate/email' #Note full endpoint is POST /contacts/v1/contact/createOrUpdate/email/:contact_email + UPDATE_PATH = "#{CONTACT_ROOT}/vid" #Note full endpoint is POST /contacts/v1/contact/vid/:contact_id/profile + UPDATE_BATCH_PATH = "#{CONTACT_ROOT}/batch" # POST /contacts/v1/contact/batch/ + FIND_BY_EMAIL_BATCH_PATH = "#{CONTACT_ROOT}/emails/batch" # Note full endpoint is GET /contacts/v1/contact/emails/batch/:contact_emails + + attr_accessor *CONTACT_KEYS def initialize(response) @raw_hash = response.raw_hash @raw_response = response.raw_response @@ -35,9 +47,214 @@ def inspect "<Hubscreen::Contact vid:#{@vid}, email:'#{@email}', first_name:'#{@first_name}', last_name:'#{@last_name}', company:'#{@company}', hubspot_owner_id:'#{@hubspot_owner_id}', properties:<Not Shown>, raw_response:<Not Shown>, raw_hash:<Not Shown>>" end + # Convenience Methods + class << self + + # Find Contact by vid + # + # If Hubspot cannot find the contact, will return the 404 response. Always check for a 200 status code before proceeding + def find(vid) + begin + Hubscreen::Request.new.contacts(FIND_BY_VID_PATH,vid).profile.get.contact + rescue Hubscreen::RequestError => e + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return failure_response + end + end + + # Find Contact by email + # + # If Hubspot cannot find the contact, will return the 404 response. Always check for a 200 status code before proceeding + def find_by_email(email) + begin + Hubscreen::Request.new.contacts(FIND_BY_EMAIL_PATH,email).profile.get.contact + rescue Hubscreen::RequestError => e + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return failure_response + end + end + + # Create New Contact + # + # {https://developers.hubspot.com/docs/methods/contacts/create_contact} + # + # Will return a Contact object representing the new contact + def create!(email,properties={}) + begin + params = properties.stringify_keys.merge('email' => email) + post_data = {properties: Hubscreen::Utils.hash_to_properties(params)} + Hubscreen::Request.new.contacts(CONTACT_ROOT).post(body: post_data).contact + rescue Hubscreen::RequestError => e + + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return failure_response + end + end + + # Update New Contact + # + # {https://developers.hubspot.com/docs/methods/contacts/update_contact} + # + # Will return a Contact object representing the updated contact + def update!(vid,properties={}) + begin + params = properties.stringify_keys + post_data = {properties: Hubscreen::Utils.hash_to_properties(params)} + Hubscreen::Request.new.contacts(UPDATE_PATH,vid).profile.post(body: post_data).contact + rescue Hubscreen::RequestError => e + #binding.pry + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return failure_response + end + end + + # Upsert Contact (Create or Update) + # + # {https://developers.hubspot.com/docs/methods/contacts/create_or_update} + # + # Will return a Contact object representing the new contact + def upsert(email,properties={}) + begin + params = properties.stringify_keys.merge('email' => email) + post_data = {properties: Hubscreen::Utils.hash_to_properties(params)} + Hubscreen::Request.new.contacts(CREATE_OR_UPDATE_PATH,email).post(body: post_data).contact + rescue Hubscreen::RequestError => e + + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return failure_response + end + end + + # Batch Methods + + # Create or update a group of contacts + # + # {https://developers.hubspot.com/docs/methods/contacts/batch_create_or_update} + # + # POST /contacts/v1/contact/batch/ + # + # From Hubspot: + # Create a group of contacts or update them if they already exist. Particularly useful for periodic syncs from another contacts database to HubSpot. + # + # Performance is best when calls are limited to 100 or fewer contacts. + # + # When using this endpoint, please keep in mind that any errors with a single contact in your batch will prevent the entire batch from processing. If this happens, we'll return a 400 response with additional details as to the cause. + # + # This method only supports update by vid (vid is mandatory) + # To use this method, pass in a array of hashes using the following structure: + # + # [ + # { + # vid: 5464, + # firstname: "George", + # lastname: "Henry" + # }, + # { + # vid: 5464, + # firstname: "Codey", + # lastname: "Lang" + # } + # ] + def upsert_batch_by_vid(contacts = []) + begin + params = [] + contacts.each do |contact| + params << {'vid': contact[:vid],'properties': Hubscreen::Utils.hash_to_properties(contact.except(:vid).stringify_keys)} + end + post_data = params + Hubscreen::Request.new.contacts(UPDATE_BATCH_PATH).post(body: post_data) + rescue Hubscreen::RequestError => e + + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return failure_response + end + end + + # Create or update a group of contacts + # + # {https://developers.hubspot.com/docs/methods/contacts/batch_create_or_update} + # + # POST /contacts/v1/contact/batch/ + # + # From Hubspot: + # Create a group of contacts or update them if they already exist. Particularly useful for periodic syncs from another contacts database to HubSpot. + # + # Performance is best when calls are limited to 100 or fewer contacts. + # + # When using this endpoint, please keep in mind that any errors with a single contact in your batch will prevent the entire batch from processing. If this happens, we'll return a 400 response with additional details as to the cause. + # + # This method only supports update by emails (email is manatory) + # DO NOT PASS VID + # + # To use this method, pass in a array of hashes using the following structure: + # + # [ + # { + # email: "first@email.com", + # firstname: "George", + # lastname: "Henry" + # }, + # { + # email: "second@email.com", + # firstname: "Codey", + # lastname: "Lang" + # } + # ] + def upsert_batch_by_email(contacts = []) + begin + params = [] + contacts.each do |contact| + params << {'email': contact[:email],'properties': Hubscreen::Utils.hash_to_properties(contact.except(:email).stringify_keys)} + end + post_data = params + Hubscreen::Request.new.contacts(UPDATE_BATCH_PATH).post(body: post_data) + rescue Hubscreen::RequestError => e + + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return failure_response + end + end + + # Search for a batch of contacts by email address + # + # {https://developers.hubspot.com/docs/methods/contacts/get_batch_by_email} + # + # GET /contacts/v1/contact/emails/batch/:contact_emails + # + # This method will return an array of Contact objects representing the search results + # + # If there is a connection error, the status code of the first element will reflect it. Always check this. + def find_by_emails(emails = []) + + begin + params = {email: emails} # Based on Faraday code >= v0.9 + response = Hubscreen::Request.new.contacts(FIND_BY_EMAIL_BATCH_PATH).get(params: params) + results = [] + response.raw_hash.each do |key,value| + results << new(Response.new(value)) + end + return results + rescue Hubscreen::RequestError => e + failure_response = Response.new(e.response) + failure_response.status_code = e.response[:status_code] + return [failure_response] + end + + end + + + + end end end \ No newline at end of file