diff --git a/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb b/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb index 409eac7..6446ba2 100644 --- a/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb +++ b/packages/zammad-addon-bridge/src/app/controllers/channels_cdr_signal_controller.rb @@ -374,6 +374,24 @@ class ChannelsCdrSignalController < ApplicationController return end + # Idempotency check: if chat_id is already a group ID, don't overwrite it + # This prevents race conditions where multiple group_created webhooks arrive + # (e.g., due to retries after API timeouts during group creation) + existing_chat_id = ticket.preferences&.dig(:cdr_signal, :chat_id) || + ticket.preferences&.dig('cdr_signal', 'chat_id') + if existing_chat_id&.start_with?('group.') + Rails.logger.info "Signal group update: Ticket #{ticket.id} already has group #{existing_chat_id}, ignoring new group #{params[:group_id]}" + render json: { + success: true, + skipped: true, + reason: 'Ticket already has a group assigned', + existing_group_id: existing_chat_id, + ticket_id: ticket.id, + ticket_number: ticket.number + }, status: :ok + return + end + # Update ticket preferences with the group information ticket.preferences ||= {} ticket.preferences[:cdr_signal] ||= {}