From 9a557d28a26a80148f757959f8b8fbf6334eb534 Mon Sep 17 00:00:00 2001 From: DGSoft Date: Fri, 12 Dec 2025 11:35:23 +0100 Subject: [PATCH] Fix user-status endpoint: resolve TypeError from unhashable User objects in deduplication logic --- backend/app/main.py | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index 6c6213e..e2e461c 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -89,16 +89,44 @@ def get_user_statuses(session: Session = Depends(get_session), current_user: Use dept_statement = select(User).where(User.departments.any(Department.id.in_(dept_ids))) department_users = session.exec(dept_statement).all() - # Get users with existing private chats (either as sender or receiver) - chat_partners_statement = select(User).where( - (User.id == DirectMessage.sender_id) | (User.id == DirectMessage.receiver_id) - ).where( + # Get users with existing private chats + # Find all direct messages where current user is sender or receiver + dm_statement = select(DirectMessage).where( (DirectMessage.sender_id == current_user.id) | (DirectMessage.receiver_id == current_user.id) - ).distinct() - chat_partners = session.exec(chat_partners_statement).all() + ) + direct_messages = session.exec(dm_statement).all() + + # Extract unique user IDs (excluding current user) + chat_partner_ids = set() + for dm in direct_messages: + if dm.sender_id != current_user.id: + chat_partner_ids.add(dm.sender_id) + if dm.receiver_id != current_user.id: + chat_partner_ids.add(dm.receiver_id) + + # Get chat partner users + if chat_partner_ids: + chat_partners_statement = select(User).where(User.id.in_(chat_partner_ids)) + chat_partners = session.exec(chat_partners_statement).all() + else: + chat_partners = [] + + # Combine and deduplicate users by ID + all_user_ids = set() + all_users = [] + + # Add department users + for user in department_users: + if user.id not in all_user_ids: + all_user_ids.add(user.id) + all_users.append(user) + + # Add chat partners + for user in chat_partners: + if user.id not in all_user_ids: + all_user_ids.add(user.id) + all_users.append(user) - # Combine and deduplicate users - all_users = list(set(department_users + chat_partners)) # Remove current user from the list all_users = [user for user in all_users if user.id != current_user.id]