@@ -665,12 +665,66 @@ def attempt_upload(attempt: int) -> Optional[str]:
665665 def create_queue_message (
666666 self , new_queue_message : "QueueMessageCreate"
667667 ) -> "QueueMessage" :
668- payload = new_queue_message .model_dump (exclude_unset = True , mode = "json" )
669- response = self .client .table ("queue" ).insert (payload ).execute ()
670- data = response .data or []
671- if not data :
672- raise ValueError ("No data returned from Supabase insert for queue message." )
673- return QueueMessage (** data [0 ])
668+ """Create a new queue message with deduplication logic to prevent 5x message multiplication."""
669+
670+ # Check for existing unprocessed messages with same content to prevent duplicates
671+ if new_queue_message .dao_id and new_queue_message .message :
672+ try :
673+ # Use Supabase query to find existing unprocessed messages
674+ query = (
675+ self .client .table ("queue" )
676+ .select ("*" )
677+ .eq ("type" , new_queue_message .type )
678+ .eq ("dao_id" , str (new_queue_message .dao_id ))
679+ .eq ("is_processed" , False )
680+ )
681+
682+ # Add wallet_id filter if present
683+ if new_queue_message .wallet_id :
684+ query = query .eq ("wallet_id" , str (new_queue_message .wallet_id ))
685+
686+ response = query .execute ()
687+ existing_data = response .data or []
688+
689+ # Check for duplicate content in existing messages
690+ new_message_str = (
691+ str (new_queue_message .message ) if new_queue_message .message else ""
692+ )
693+ for existing_row in existing_data :
694+ existing_message_str = str (existing_row .get ("message" , "" ))
695+ if existing_message_str == new_message_str :
696+ existing_message = QueueMessage (** existing_row )
697+ logger .debug (
698+ f"Duplicate queue message detected for DAO { new_queue_message .dao_id } , "
699+ f"type { new_queue_message .type } , returning existing message { existing_message .id } "
700+ )
701+ return existing_message
702+
703+ except Exception as e :
704+ # If deduplication check fails, log warning but continue with creation
705+ logger .warning (
706+ f"Deduplication check failed: { str (e )} , proceeding with message creation"
707+ )
708+
709+ # No duplicate found or deduplication skipped, create new message using Supabase
710+ try :
711+ payload = new_queue_message .model_dump (exclude_unset = True , mode = "json" )
712+ response = self .client .table ("queue" ).insert (payload ).execute ()
713+ data = response .data or []
714+ if not data :
715+ raise ValueError (
716+ "No data returned from Supabase insert for queue message."
717+ )
718+
719+ created_message = QueueMessage (** data [0 ])
720+ logger .debug (
721+ f"Created new queue message { created_message .id } for DAO { new_queue_message .dao_id } , type { new_queue_message .type } "
722+ )
723+ return created_message
724+
725+ except Exception as e :
726+ logger .error (f"Failed to create queue message in Supabase: { str (e )} " )
727+ raise
674728
675729 def get_queue_message (self , queue_message_id : UUID ) -> Optional ["QueueMessage" ]:
676730 response = (
0 commit comments