mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-03 20:48:07 +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
		
			
				
	
	
		
			35 lines
		
	
	
		
			767 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			767 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
class Messages::StatusUpdateService
 | 
						|
  attr_reader :message, :status, :external_error
 | 
						|
 | 
						|
  def initialize(message, status, external_error = nil)
 | 
						|
    @message = message
 | 
						|
    @status = status
 | 
						|
    @external_error = external_error
 | 
						|
  end
 | 
						|
 | 
						|
  def perform
 | 
						|
    return false unless valid_status_transition?
 | 
						|
 | 
						|
    update_message_status
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def update_message_status
 | 
						|
    # Update status and set external_error only when failed
 | 
						|
    message.update!(
 | 
						|
      status: status,
 | 
						|
      external_error: (status == 'failed' ? external_error : nil)
 | 
						|
    )
 | 
						|
  end
 | 
						|
 | 
						|
  def valid_status_transition?
 | 
						|
    return false unless Message.statuses.key?(status)
 | 
						|
 | 
						|
    # Don't allow changing from 'read' to 'delivered'
 | 
						|
    return false if message.read? && status == 'delivered'
 | 
						|
 | 
						|
    true
 | 
						|
  end
 | 
						|
end
 |