Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
class Crm::Leadsquared::Api::ActivityClient < Crm::Leadsquared::Api::BaseClient
|
||||
# https://apidocs.leadsquared.com/post-an-activity-to-lead/#api
|
||||
def post_activity(prospect_id, activity_event, activity_note)
|
||||
raise ArgumentError, 'Prospect ID is required' if prospect_id.blank?
|
||||
raise ArgumentError, 'Activity event code is required' if activity_event.blank?
|
||||
|
||||
path = 'ProspectActivity.svc/Create'
|
||||
|
||||
body = {
|
||||
'RelatedProspectId' => prospect_id,
|
||||
'ActivityEvent' => activity_event,
|
||||
'ActivityNote' => activity_note
|
||||
}
|
||||
|
||||
response = post(path, {}, body)
|
||||
response['Message']['Id']
|
||||
end
|
||||
|
||||
def create_activity_type(name:, score:, direction: 0)
|
||||
raise ArgumentError, 'Activity name is required' if name.blank?
|
||||
|
||||
path = 'ProspectActivity.svc/CreateType'
|
||||
body = {
|
||||
'ActivityEventName' => name,
|
||||
'Score' => score.to_i,
|
||||
'Direction' => direction.to_i
|
||||
}
|
||||
|
||||
response = post(path, {}, body)
|
||||
response['Message']['Id']
|
||||
end
|
||||
|
||||
def fetch_activity_types
|
||||
get('ProspectActivity.svc/ActivityTypes.Get')
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,84 @@
|
||||
class Crm::Leadsquared::Api::BaseClient
|
||||
include HTTParty
|
||||
|
||||
class ApiError < StandardError
|
||||
attr_reader :code, :response
|
||||
|
||||
def initialize(message = nil, code = nil, response = nil)
|
||||
@code = code
|
||||
@response = response
|
||||
super(message)
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(access_key, secret_key, endpoint_url)
|
||||
@access_key = access_key
|
||||
@secret_key = secret_key
|
||||
@base_uri = endpoint_url
|
||||
end
|
||||
|
||||
def get(path, params = {})
|
||||
full_url = URI.join(@base_uri, path).to_s
|
||||
|
||||
options = {
|
||||
query: params,
|
||||
headers: headers
|
||||
}
|
||||
|
||||
response = self.class.get(full_url, options)
|
||||
handle_response(response)
|
||||
end
|
||||
|
||||
def post(path, params = {}, body = {})
|
||||
full_url = URI.join(@base_uri, path).to_s
|
||||
|
||||
options = {
|
||||
query: params,
|
||||
headers: headers
|
||||
}
|
||||
|
||||
options[:body] = body.to_json if body.present?
|
||||
|
||||
response = self.class.post(full_url, options)
|
||||
handle_response(response)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def headers
|
||||
{
|
||||
'Content-Type': 'application/json',
|
||||
'x-LSQ-AccessKey': @access_key,
|
||||
'x-LSQ-SecretKey': @secret_key
|
||||
}
|
||||
end
|
||||
|
||||
def handle_response(response)
|
||||
case response.code
|
||||
when 200..299
|
||||
handle_success(response)
|
||||
else
|
||||
error_message = "LeadSquared API error: #{response.code} - #{response.body}"
|
||||
Rails.logger.error error_message
|
||||
raise ApiError.new(error_message, response.code, response)
|
||||
end
|
||||
end
|
||||
|
||||
def handle_success(response)
|
||||
parse_response(response)
|
||||
rescue JSON::ParserError, TypeError => e
|
||||
error_message = "Failed to parse LeadSquared API response: #{e.message}"
|
||||
raise ApiError.new(error_message, response.code, response)
|
||||
end
|
||||
|
||||
def parse_response(response)
|
||||
body = response.parsed_response
|
||||
|
||||
if body.is_a?(Hash) && body['Status'] == 'Error'
|
||||
error_message = body['ExceptionMessage'] || 'Unknown API error'
|
||||
raise ApiError.new(error_message, response.code, response)
|
||||
else
|
||||
body
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,50 @@
|
||||
class Crm::Leadsquared::Api::LeadClient < Crm::Leadsquared::Api::BaseClient
|
||||
# https://apidocs.leadsquared.com/quick-search/#api
|
||||
def search_lead(key)
|
||||
raise ArgumentError, 'Search key is required' if key.blank?
|
||||
|
||||
path = 'LeadManagement.svc/Leads.GetByQuickSearch'
|
||||
params = { key: key }
|
||||
|
||||
get(path, params)
|
||||
end
|
||||
|
||||
# https://apidocs.leadsquared.com/create-or-update/#api
|
||||
# The email address and phone fields are used as the default search criteria.
|
||||
# If none of these match with an existing lead, a new lead will be created.
|
||||
# We can pass the "SearchBy" attribute in the JSON body to search by a particular parameter, however
|
||||
# we don't need this capability at the moment
|
||||
def create_or_update_lead(lead_data)
|
||||
raise ArgumentError, 'Lead data is required' if lead_data.blank?
|
||||
|
||||
path = 'LeadManagement.svc/Lead.CreateOrUpdate'
|
||||
|
||||
formatted_data = format_lead_data(lead_data)
|
||||
response = post(path, {}, formatted_data)
|
||||
|
||||
response['Message']['Id']
|
||||
end
|
||||
|
||||
def update_lead(lead_data, lead_id)
|
||||
raise ArgumentError, 'Lead ID is required' if lead_id.blank?
|
||||
raise ArgumentError, 'Lead data is required' if lead_data.blank?
|
||||
|
||||
path = "LeadManagement.svc/Lead.Update?leadId=#{lead_id}"
|
||||
formatted_data = format_lead_data(lead_data)
|
||||
|
||||
response = post(path, {}, formatted_data)
|
||||
|
||||
response['Message']['AffectedRows']
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def format_lead_data(lead_data)
|
||||
lead_data.map do |key, value|
|
||||
{
|
||||
'Attribute' => key,
|
||||
'Value' => value
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user