Some checks failed
Lock Threads / action (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot EE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot EE docker images / merge (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/amd64, ubuntu-latest) (push) Has been cancelled
Publish Chatwoot CE docker images / build (linux/arm64, ubuntu-22.04-arm) (push) Has been cancelled
Publish Chatwoot CE docker images / merge (push) Has been cancelled
Run Chatwoot CE spec / lint-backend (push) Has been cancelled
Run Chatwoot CE spec / lint-frontend (push) Has been cancelled
Run Chatwoot CE spec / frontend-tests (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (0, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (1, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (10, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (11, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (12, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (13, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (14, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (15, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (2, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (3, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (4, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (5, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (6, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (7, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (8, 16) (push) Has been cancelled
Run Chatwoot CE spec / backend-tests (9, 16) (push) Has been cancelled
Run Linux nightly installer / nightly (push) Has been cancelled
- Add Logistics component with progress tracking - Add OrderDetail component for order information - Support data-driven steps and actions - Add blue color scale to widget SCSS - Fix node overflow and progress bar rendering issues - Add English translations for dashboard components Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
93 lines
3.0 KiB
Ruby
93 lines
3.0 KiB
Ruby
class Crm::BaseProcessorService
|
|
def initialize(hook)
|
|
@hook = hook
|
|
@account = hook.account
|
|
end
|
|
|
|
# Class method to be overridden by subclasses
|
|
def self.crm_name
|
|
raise NotImplementedError, 'Subclasses must define self.crm_name'
|
|
end
|
|
|
|
# Instance method that calls the class method
|
|
def crm_name
|
|
self.class.crm_name
|
|
end
|
|
|
|
def process_event(event_name, event_data)
|
|
case event_name
|
|
when 'contact.created'
|
|
handle_contact_created(event_data)
|
|
when 'contact.updated'
|
|
handle_contact_updated(event_data)
|
|
when 'conversation.created'
|
|
handle_conversation_created(event_data)
|
|
when 'conversation.updated'
|
|
handle_conversation_updated(event_data)
|
|
else
|
|
{ success: false, error: "Unsupported event: #{event_name}" }
|
|
end
|
|
rescue StandardError => e
|
|
Rails.logger.error "#{crm_name} Processor Error: #{e.message}"
|
|
Rails.logger.error e.backtrace.join("\n")
|
|
{ success: false, error: e.message }
|
|
end
|
|
|
|
# Abstract methods that subclasses must implement
|
|
def handle_contact_created(contact)
|
|
raise NotImplementedError, 'Subclasses must implement #handle_contact_created'
|
|
end
|
|
|
|
def handle_contact_updated(contact)
|
|
raise NotImplementedError, 'Subclasses must implement #handle_contact_updated'
|
|
end
|
|
|
|
def handle_conversation_created(conversation)
|
|
raise NotImplementedError, 'Subclasses must implement #handle_conversation_created'
|
|
end
|
|
|
|
def handle_conversation_resolved(conversation)
|
|
raise NotImplementedError, 'Subclasses must implement #handle_conversation_resolved'
|
|
end
|
|
|
|
# Common helper methods for all CRM processors
|
|
|
|
protected
|
|
|
|
def identifiable_contact?(contact)
|
|
has_social_profile = contact.additional_attributes['social_profiles'].present?
|
|
contact.present? && (contact.email.present? || contact.phone_number.present? || has_social_profile)
|
|
end
|
|
|
|
def get_external_id(contact)
|
|
return nil if contact.additional_attributes.blank?
|
|
return nil if contact.additional_attributes['external'].blank?
|
|
|
|
contact.additional_attributes.dig('external', "#{crm_name}_id")
|
|
end
|
|
|
|
def store_external_id(contact, external_id)
|
|
# Initialize additional_attributes if it's nil
|
|
contact.additional_attributes = {} if contact.additional_attributes.nil?
|
|
|
|
# Initialize external hash if it doesn't exist
|
|
contact.additional_attributes['external'] = {} if contact.additional_attributes['external'].blank?
|
|
|
|
# Store the external ID
|
|
contact.additional_attributes['external']["#{crm_name}_id"] = external_id
|
|
contact.save!
|
|
end
|
|
|
|
def store_conversation_metadata(conversation, metadata)
|
|
# Initialize additional_attributes if it's nil
|
|
conversation.additional_attributes = {} if conversation.additional_attributes.nil?
|
|
|
|
# Initialize CRM-specific hash in additional_attributes
|
|
conversation.additional_attributes[crm_name] = {} if conversation.additional_attributes[crm_name].blank?
|
|
|
|
# Store the metadata
|
|
conversation.additional_attributes[crm_name].merge!(metadata)
|
|
conversation.save!
|
|
end
|
|
end
|