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