Files
clientsflow/research/chatwoot/app/services/sms/delivery_status_service.rb

53 lines
1.1 KiB
Ruby

class Sms::DeliveryStatusService
pattr_initialize [:inbox!, :params!]
def perform
return unless supported_status?
process_status if message.present?
end
private
def process_status
@message.status = status
@message.external_error = external_error if error_occurred?
@message.save!
end
def supported_status?
%w[message-delivered message-failed].include?(params[:type])
end
# Relevant documentation:
# https://dev.bandwidth.com/docs/mfa/webhooks/international/message-delivered
# https://dev.bandwidth.com/docs/mfa/webhooks/international/message-failed
def status
type_mapping = {
'message-delivered' => 'delivered',
'message-failed' => 'failed'
}
type_mapping[params[:type]]
end
def external_error
return nil unless error_occurred?
error_message = params[:description]
error_code = params[:errorCode]
"#{error_code} - #{error_message}"
end
def error_occurred?
params[:errorCode] && params[:type] == 'message-failed'
end
def message
return unless params[:message][:id]
@message ||= inbox.messages.find_by(source_id: params[:message][:id])
end
end