Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
@@ -0,0 +1,196 @@
|
||||
class CsatTemplateManagementService
|
||||
DEFAULT_BUTTON_TEXT = 'Please rate us'.freeze
|
||||
DEFAULT_LANGUAGE = 'en'.freeze
|
||||
|
||||
def initialize(inbox)
|
||||
@inbox = inbox
|
||||
end
|
||||
|
||||
def template_status
|
||||
template = @inbox.csat_config&.dig('template')
|
||||
return { template_exists: false } unless template
|
||||
|
||||
if @inbox.twilio_whatsapp?
|
||||
get_twilio_template_status(template)
|
||||
else
|
||||
get_whatsapp_template_status(template)
|
||||
end
|
||||
rescue StandardError => e
|
||||
Rails.logger.error "Error fetching CSAT template status: #{e.message}"
|
||||
{ service_error: e.message }
|
||||
end
|
||||
|
||||
def create_template(template_params)
|
||||
validate_template_params!(template_params)
|
||||
|
||||
delete_existing_template_if_needed
|
||||
|
||||
result = create_template_via_provider(template_params)
|
||||
update_inbox_csat_config(result) if result[:success]
|
||||
|
||||
result
|
||||
rescue StandardError => e
|
||||
Rails.logger.error "Error creating CSAT template: #{e.message}"
|
||||
{ success: false, service_error: 'Template creation failed' }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def validate_template_params!(template_params)
|
||||
raise ActionController::ParameterMissing, 'message' if template_params[:message].blank?
|
||||
end
|
||||
|
||||
def create_template_via_provider(template_params)
|
||||
if @inbox.twilio_whatsapp?
|
||||
create_twilio_template(template_params)
|
||||
else
|
||||
create_whatsapp_template(template_params)
|
||||
end
|
||||
end
|
||||
|
||||
def create_twilio_template(template_params)
|
||||
template_config = build_template_config(template_params)
|
||||
template_service = Twilio::CsatTemplateService.new(@inbox.channel)
|
||||
template_service.create_template(template_config)
|
||||
end
|
||||
|
||||
def create_whatsapp_template(template_params)
|
||||
template_config = build_template_config(template_params)
|
||||
Whatsapp::CsatTemplateService.new(@inbox.channel).create_template(template_config)
|
||||
end
|
||||
|
||||
def build_template_config(template_params)
|
||||
{
|
||||
message: template_params[:message],
|
||||
button_text: template_params[:button_text] || DEFAULT_BUTTON_TEXT,
|
||||
base_url: ENV.fetch('FRONTEND_URL', 'http://localhost:3000'),
|
||||
language: template_params[:language] || DEFAULT_LANGUAGE,
|
||||
template_name: CsatTemplateNameService.csat_template_name(@inbox.id)
|
||||
}
|
||||
end
|
||||
|
||||
def update_inbox_csat_config(result)
|
||||
current_config = @inbox.csat_config || {}
|
||||
template_data = build_template_data_from_result(result)
|
||||
updated_config = current_config.merge('template' => template_data)
|
||||
@inbox.update!(csat_config: updated_config)
|
||||
end
|
||||
|
||||
def build_template_data_from_result(result)
|
||||
if @inbox.twilio_whatsapp?
|
||||
build_twilio_template_data(result)
|
||||
else
|
||||
build_whatsapp_cloud_template_data(result)
|
||||
end
|
||||
end
|
||||
|
||||
def build_twilio_template_data(result)
|
||||
{
|
||||
'friendly_name' => result[:friendly_name],
|
||||
'content_sid' => result[:content_sid],
|
||||
'approval_sid' => result[:approval_sid],
|
||||
'language' => result[:language],
|
||||
'status' => result[:whatsapp_status] || result[:status],
|
||||
'created_at' => Time.current.iso8601
|
||||
}.compact
|
||||
end
|
||||
|
||||
def build_whatsapp_cloud_template_data(result)
|
||||
{
|
||||
'name' => result[:template_name],
|
||||
'template_id' => result[:template_id],
|
||||
'language' => result[:language],
|
||||
'created_at' => Time.current.iso8601
|
||||
}
|
||||
end
|
||||
|
||||
def get_twilio_template_status(template)
|
||||
content_sid = template['content_sid']
|
||||
return { template_exists: false } unless content_sid
|
||||
|
||||
template_service = Twilio::CsatTemplateService.new(@inbox.channel)
|
||||
status_result = template_service.get_template_status(content_sid)
|
||||
|
||||
if status_result[:success]
|
||||
{
|
||||
template_exists: true,
|
||||
friendly_name: template['friendly_name'],
|
||||
content_sid: template['content_sid'],
|
||||
status: status_result[:template][:status],
|
||||
language: template['language']
|
||||
}
|
||||
else
|
||||
{
|
||||
template_exists: false,
|
||||
error: 'Template not found'
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def get_whatsapp_template_status(template)
|
||||
template_name = template['name'] || CsatTemplateNameService.csat_template_name(@inbox.id)
|
||||
status_result = Whatsapp::CsatTemplateService.new(@inbox.channel).get_template_status(template_name)
|
||||
|
||||
if status_result[:success]
|
||||
{
|
||||
template_exists: true,
|
||||
template_name: template_name,
|
||||
status: status_result[:template][:status],
|
||||
template_id: status_result[:template][:id]
|
||||
}
|
||||
else
|
||||
{
|
||||
template_exists: false,
|
||||
error: 'Template not found'
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
def delete_existing_template_if_needed
|
||||
template = @inbox.csat_config&.dig('template')
|
||||
return true if template.blank?
|
||||
|
||||
if @inbox.twilio_whatsapp?
|
||||
delete_existing_twilio_template(template)
|
||||
else
|
||||
delete_existing_whatsapp_template(template)
|
||||
end
|
||||
rescue StandardError => e
|
||||
Rails.logger.error "Error during template deletion for inbox #{@inbox.id}: #{e.message}"
|
||||
false
|
||||
end
|
||||
|
||||
def delete_existing_twilio_template(template)
|
||||
content_sid = template['content_sid']
|
||||
return true if content_sid.blank?
|
||||
|
||||
template_service = Twilio::CsatTemplateService.new(@inbox.channel)
|
||||
deletion_result = template_service.delete_template(nil, content_sid)
|
||||
|
||||
if deletion_result[:success]
|
||||
Rails.logger.info "Deleted existing Twilio CSAT template '#{content_sid}' for inbox #{@inbox.id}"
|
||||
true
|
||||
else
|
||||
Rails.logger.warn "Failed to delete existing Twilio CSAT template '#{content_sid}' for inbox #{@inbox.id}: #{deletion_result[:response_body]}"
|
||||
false
|
||||
end
|
||||
end
|
||||
|
||||
def delete_existing_whatsapp_template(template)
|
||||
template_name = template['name']
|
||||
return true if template_name.blank?
|
||||
|
||||
csat_template_service = Whatsapp::CsatTemplateService.new(@inbox.channel)
|
||||
template_status = csat_template_service.get_template_status(template_name)
|
||||
return true unless template_status[:success]
|
||||
|
||||
deletion_result = csat_template_service.delete_template(template_name)
|
||||
if deletion_result[:success]
|
||||
Rails.logger.info "Deleted existing CSAT template '#{template_name}' for inbox #{@inbox.id}"
|
||||
true
|
||||
else
|
||||
Rails.logger.warn "Failed to delete existing CSAT template '#{template_name}' for inbox #{@inbox.id}: #{deletion_result[:response_body]}"
|
||||
false
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user