feat: API Endpoints to update message status (#11387)
- 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
This commit is contained in:
34
app/services/messages/status_update_service.rb
Normal file
34
app/services/messages/status_update_service.rb
Normal file
@@ -0,0 +1,34 @@
|
||||
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
|
||||
Reference in New Issue
Block a user