Files
mozo-backend/app/channels/application_cable/connection.rb
T
root 1f52448253 feat(broadcasting): add ActionCable adapter + fix model broadcast anti-pattern
- 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
2026-05-17 15:25:49 +02:00

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