Files
MySMSAPio/app/jobs/send_sms_job.rb
2025-10-22 17:22:17 +08:00

42 lines
1.2 KiB
Ruby

class SendSmsJob < ApplicationJob
queue_as :default
retry_on StandardError, wait: :exponentially_longer, attempts: 3
def perform(sms_message_id)
sms = SmsMessage.find(sms_message_id)
# Skip if already sent or not outbound
return unless sms.outbound? && sms.status == "queued"
# Find available gateway
gateway = Gateway.available_for_sending
unless gateway
Rails.logger.warn("No available gateway for message #{sms.message_id}")
sms.update!(status: "pending")
# Retry later
SendSmsJob.set(wait: 1.minute).perform_later(sms_message_id)
return
end
# Update message status
sms.mark_sent!(gateway)
# Broadcast message to gateway via WebSocket
GatewayChannel.broadcast_to(gateway, {
action: "send_sms",
message_id: sms.message_id,
recipient: sms.phone_number,
message: sms.message_body
})
Rails.logger.info("Sent SMS #{sms.message_id} to gateway #{gateway.device_id}")
rescue ActiveRecord::RecordNotFound => e
Rails.logger.error("SMS message not found: #{e.message}")
rescue StandardError => e
Rails.logger.error("Failed to send SMS #{sms_message_id}: #{e.message}")
sms&.increment_retry!
raise
end
end