AIDA / scripts /fix_all_corrupted.py
destinyebuka's picture
fyp
6687173
#!/usr/bin/env python3
"""
Script to delete ALL corrupted conversations where participants is a string
"""
import asyncio
import sys
from pathlib import Path
# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent.parent))
from app.database import connect_db, disconnect_db, get_db
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def fix_all_corrupted_conversations():
"""Delete ALL conversations where participants is stored as a string"""
try:
await connect_db()
db = await get_db()
# Method 1: Find by type (string instead of array)
corrupted = await db.conversations.find({
"participants": {"$type": "string"}
}).to_list(length=None)
logger.info(f"Found {len(corrupted)} corrupted by type check")
# Method 2: Delete directly by the known problematic user ID
known_corrupted = await db.conversations.find({
"participants": "6901d49e03321114aa21e246" # String, not in array
}).to_list(length=None)
logger.info(f"Found {len(known_corrupted)} with known corrupted participant")
# Combine and dedupe
all_ids = set()
for conv in corrupted + known_corrupted:
all_ids.add(conv["_id"])
logger.info(f"Total unique corrupted: {len(all_ids)}")
# Delete them
deleted = 0
for conv_id in all_ids:
# Delete messages first
await db.messages.delete_many({"conversation_id": str(conv_id)})
# Delete conversation
result = await db.conversations.delete_one({"_id": conv_id})
if result.deleted_count > 0:
deleted += 1
logger.info(f" βœ… Deleted corrupted conversation: {conv_id}")
# Also check if there are any AIDA_BOT conversations with wrong structure
aida_convs = await db.conversations.find({
"$or": [
{"participants": "AIDA_BOT"},
{"participants": {"$elemMatch": {"$eq": "AIDA_BOT"}}}
]
}).to_list(length=None)
logger.info(f"Found {len(aida_convs)} AIDA conversations to verify")
for conv in aida_convs:
participants = conv.get("participants")
# Check if it's not properly an array of 2 strings
if not isinstance(participants, list) or len(participants) != 2:
await db.messages.delete_many({"conversation_id": str(conv["_id"])})
await db.conversations.delete_one({"_id": conv["_id"]})
deleted += 1
logger.info(f" βœ… Deleted malformed AIDA conversation: {conv['_id']}")
logger.info(f"\n{'='*60}")
logger.info(f"βœ… Cleanup Complete!")
logger.info(f"Deleted {deleted} corrupted conversations")
logger.info(f"{'='*60}\n")
except Exception as e:
logger.error(f"Cleanup failed: {e}")
raise
finally:
await disconnect_db()
if __name__ == "__main__":
logger.info("Fixing ALL corrupted conversations...")
asyncio.run(fix_all_corrupted_conversations())