diff --git a/enterprise/app/services/captain/hermes/auto_react_service.rb b/enterprise/app/services/captain/hermes/auto_react_service.rb index dd693d4ac..5a998682f 100644 --- a/enterprise/app/services/captain/hermes/auto_react_service.rb +++ b/enterprise/app/services/captain/hermes/auto_react_service.rb @@ -33,6 +33,7 @@ class Captain::Hermes::AutoReactService def maybe_react! return unless eligible? + return if already_reacted? emoji = decide_emoji return if emoji.blank? @@ -53,6 +54,16 @@ class Captain::Hermes::AutoReactService true end + # Evita reaction duplicada quando OutgoingJob retentar (ex: dispatch + # retornou 401/5xx e Sidekiq reenfileirou). Sem essa guarda, cada retry + # cria uma reaction nova e cliente vĂȘ N emojis seguidos. + def already_reacted? + @conversation.messages + .where(message_type: :outgoing) + .where("content_attributes ->> 'external_source' = ?", 'hermes_auto_react') + .exists?(["(content_attributes ->> 'in_reply_to')::int = ?", @message.id]) + end + def decide_emoji text = @message.content.to_s.strip