1f52448253
- Add Mozo::Broadcaster::ActionCable as drop-in Faye replacement - Fix model_broadcast.rb: delegate to Mozo directly instead of ApplicationController.new (memory-unsafe anti-pattern) - Add Broadcastable concern for clean model-side broadcasting - ActionCable config: async adapter, cable.yml, WebSocket endpoint - MozoChannel with per-entity authorization (user/supplier/employee) - Connection auth via auth_token (matches existing auth pattern) - Mount /cable WebSocket in routes - Add broadcasting-migration.md with Faye→ActionCable guide
37 lines
1.2 KiB
Ruby
37 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module ApplicationCable
|
|
class Connection < ActionCable::Connection::Base
|
|
# Authenticate via auth_token (same mechanism used in ApplicationController#authenticate_employee!)
|
|
# Clients should pass ?auth_token=TOKEN when connecting to the WebSocket.
|
|
identified_by :current_user, :current_entity_type
|
|
|
|
def connect
|
|
token = request.params[:auth_token].presence
|
|
reject_unauthorized_connection unless token
|
|
|
|
if (employee = Employee.find_by_authentication_token(token))
|
|
self.current_user = employee
|
|
self.current_entity_type = :employee
|
|
elsif (user = User.find_by_authentication_token(token))
|
|
self.current_user = user
|
|
self.current_entity_type = :user
|
|
elsif (supplier = Supplier.find_by_authentication_token(token))
|
|
self.current_user = supplier
|
|
self.current_entity_type = :supplier
|
|
else
|
|
reject_unauthorized_connection
|
|
end
|
|
end
|
|
|
|
# Allow subscribing to the entity's own channel
|
|
def subscribe_to_self
|
|
case current_entity_type
|
|
when :user then "user_#{current_user.id}"
|
|
when :supplier then "supplier_#{current_user.id}"
|
|
when :employee then "employee_#{current_user.id}"
|
|
end
|
|
end
|
|
end
|
|
end
|