Files
MySMSAPio/app/channels/gateway_channel.rb
2025-10-22 17:22:17 +08:00

100 lines
2.4 KiB
Ruby

class GatewayChannel < ApplicationCable::Channel
def subscribed
# Gateway is already authenticated at the connection level
# current_gateway is set by ApplicationCable::Connection
@gateway = current_gateway
unless @gateway
reject
return
end
# Subscribe to gateway-specific channel
stream_for @gateway
# Update gateway status
@gateway.heartbeat!
Rails.logger.info("Gateway #{@gateway.device_id} subscribed to GatewayChannel")
end
def unsubscribed
# Update gateway status when disconnected
if @gateway
@gateway.mark_offline!
Rails.logger.info("Gateway #{@gateway.device_id} disconnected from WebSocket")
end
end
def receive(data)
return unless @gateway
# Handle incoming messages from gateway
case data["action"]
when "heartbeat"
handle_heartbeat(data)
when "delivery_report"
handle_delivery_report(data)
when "message_received"
handle_message_received(data)
else
Rails.logger.warn("Unknown action received: #{data['action']}")
end
rescue StandardError => e
Rails.logger.error("Error processing gateway message: #{e.message}")
end
private
def handle_heartbeat(data)
@gateway.heartbeat!
# Update metadata if provided
metadata = {
battery_level: data["battery_level"],
signal_strength: data["signal_strength"],
messages_in_queue: data["messages_in_queue"]
}.compact
@gateway.update(metadata: metadata) if metadata.any?
end
def handle_delivery_report(data)
message_id = data["message_id"]
status = data["status"]
error_message = data["error_message"]
sms = SmsMessage.find_by(message_id: message_id)
return unless sms
case status
when "delivered"
sms.mark_delivered!
when "failed"
sms.mark_failed!(error_message)
RetryFailedSmsJob.perform_later(sms.id) if sms.can_retry?
end
end
def handle_message_received(data)
sender = data["sender"]
message = data["message"]
timestamp = data["timestamp"] || Time.current
# Create inbound SMS
sms = SmsMessage.create!(
gateway: @gateway,
direction: "inbound",
phone_number: sender,
message_body: message,
status: "delivered",
delivered_at: timestamp
)
@gateway.increment_received_count!
# Process inbound message
ProcessInboundSmsJob.perform_later(sms.id)
end
end