110 lines
3.3 KiB
Ruby
110 lines
3.3 KiB
Ruby
class Crm::Leadsquared::SetupService
|
|
def initialize(hook)
|
|
@hook = hook
|
|
credentials = @hook.settings
|
|
|
|
@access_key = credentials['access_key']
|
|
@secret_key = credentials['secret_key']
|
|
|
|
@client = Crm::Leadsquared::Api::BaseClient.new(@access_key, @secret_key, 'https://api.leadsquared.com/v2/')
|
|
@activity_client = Crm::Leadsquared::Api::ActivityClient.new(@access_key, @secret_key, 'https://api.leadsquared.com/v2/')
|
|
end
|
|
|
|
def setup
|
|
setup_endpoint
|
|
setup_activity
|
|
rescue Crm::Leadsquared::Api::BaseClient::ApiError => e
|
|
ChatwootExceptionTracker.new(e, account: @hook.account).capture_exception
|
|
Rails.logger.error "LeadSquared API error in setup: #{e.message}"
|
|
rescue StandardError => e
|
|
ChatwootExceptionTracker.new(e, account: @hook.account).capture_exception
|
|
Rails.logger.error "Error during LeadSquared setup: #{e.message}"
|
|
end
|
|
|
|
def setup_endpoint
|
|
response = @client.get('Authentication.svc/UserByAccessKey.Get')
|
|
endpoint_host = response['LSQCommonServiceURLs']['api']
|
|
app_host = response['LSQCommonServiceURLs']['app']
|
|
timezone = response['TimeZone']
|
|
|
|
endpoint_url = "https://#{endpoint_host}/v2/"
|
|
app_url = "https://#{app_host}/"
|
|
|
|
update_hook_settings({ :endpoint_url => endpoint_url, :app_url => app_url, :timezone => timezone })
|
|
|
|
# replace the clients
|
|
@client = Crm::Leadsquared::Api::BaseClient.new(@access_key, @secret_key, endpoint_url)
|
|
@activity_client = Crm::Leadsquared::Api::ActivityClient.new(@access_key, @secret_key, endpoint_url)
|
|
end
|
|
|
|
private
|
|
|
|
def setup_activity
|
|
existing_types = @activity_client.fetch_activity_types
|
|
return if existing_types.blank?
|
|
|
|
activity_codes = setup_activity_types(existing_types)
|
|
return if activity_codes.blank?
|
|
|
|
update_hook_settings(activity_codes)
|
|
|
|
activity_codes
|
|
end
|
|
|
|
def setup_activity_types(existing_types)
|
|
activity_codes = {}
|
|
|
|
activity_types.each do |activity_type|
|
|
activity_id = find_or_create_activity_type(activity_type, existing_types)
|
|
|
|
if activity_id.present?
|
|
activity_codes[activity_type[:setting_key]] = activity_id.to_i
|
|
else
|
|
Rails.logger.error "Failed to find or create activity type: #{activity_type[:name]}"
|
|
end
|
|
end
|
|
|
|
activity_codes
|
|
end
|
|
|
|
def find_or_create_activity_type(activity_type, existing_types)
|
|
existing = existing_types.find { |t| t['ActivityEventName'] == activity_type[:name] }
|
|
|
|
if existing
|
|
existing['ActivityEvent'].to_i
|
|
else
|
|
@activity_client.create_activity_type(
|
|
name: activity_type[:name],
|
|
score: activity_type[:score],
|
|
direction: activity_type[:direction]
|
|
)
|
|
end
|
|
end
|
|
|
|
def update_hook_settings(params)
|
|
@hook.settings = @hook.settings.merge(params)
|
|
@hook.save!
|
|
end
|
|
|
|
def activity_types
|
|
[
|
|
{
|
|
name: "#{brand_name} Conversation Started",
|
|
score: @hook.settings['conversation_activity_score'].to_i || 0,
|
|
direction: 0,
|
|
setting_key: 'conversation_activity_code'
|
|
},
|
|
{
|
|
name: "#{brand_name} Conversation Transcript",
|
|
score: @hook.settings['transcript_activity_score'].to_i || 0,
|
|
direction: 0,
|
|
setting_key: 'transcript_activity_code'
|
|
}
|
|
].freeze
|
|
end
|
|
|
|
def brand_name
|
|
::GlobalConfig.get('BRAND_NAME')['BRAND_NAME'].presence || 'Chatwoot'
|
|
end
|
|
end
|