# 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