mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-04 04:57:51 +00:00 
			
		
		
		
	- Added an api endpoint for update message status ( available only for api inboxes ) - Moved message status management to a service. - Handles case where read status arrive before delivered fixes: #10314 , #9962
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
class Webhooks::Trigger
 | 
						|
  SUPPORTED_ERROR_HANDLE_EVENTS = %w[message_created message_updated].freeze
 | 
						|
 | 
						|
  def initialize(url, payload, webhook_type)
 | 
						|
    @url = url
 | 
						|
    @payload = payload
 | 
						|
    @webhook_type = webhook_type
 | 
						|
  end
 | 
						|
 | 
						|
  def self.execute(url, payload, webhook_type)
 | 
						|
    new(url, payload, webhook_type).execute
 | 
						|
  end
 | 
						|
 | 
						|
  def execute
 | 
						|
    perform_request
 | 
						|
  rescue StandardError => e
 | 
						|
    handle_error(e)
 | 
						|
    Rails.logger.warn "Exception: Invalid webhook URL #{@url} : #{e.message}"
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def perform_request
 | 
						|
    RestClient::Request.execute(
 | 
						|
      method: :post,
 | 
						|
      url: @url,
 | 
						|
      payload: @payload.to_json,
 | 
						|
      headers: { content_type: :json, accept: :json },
 | 
						|
      timeout: 5
 | 
						|
    )
 | 
						|
  end
 | 
						|
 | 
						|
  def handle_error(error)
 | 
						|
    return unless should_handle_error?
 | 
						|
    return unless message
 | 
						|
 | 
						|
    update_message_status(error)
 | 
						|
  end
 | 
						|
 | 
						|
  def should_handle_error?
 | 
						|
    @webhook_type == :api_inbox_webhook && SUPPORTED_ERROR_HANDLE_EVENTS.include?(@payload[:event])
 | 
						|
  end
 | 
						|
 | 
						|
  def update_message_status(error)
 | 
						|
    Messages::StatusUpdateService.new(message, 'failed', error.message).perform
 | 
						|
  end
 | 
						|
 | 
						|
  def message
 | 
						|
    return if message_id.blank?
 | 
						|
 | 
						|
    @message ||= Message.find_by(id: message_id)
 | 
						|
  end
 | 
						|
 | 
						|
  def message_id
 | 
						|
    @payload[:id]
 | 
						|
  end
 | 
						|
end
 |