From 334c14bd9e0a005e519e1cc074e20b7c0897c9d3 Mon Sep 17 00:00:00 2001 From: slawk0 Date: Sat, 4 Jan 2025 23:50:02 +0100 Subject: [PATCH] fixed getContacts function --- server/db/db.js | 133 +++++++++++++++--------------------------------- 1 file changed, 41 insertions(+), 92 deletions(-) diff --git a/server/db/db.js b/server/db/db.js index b93f5f6..bb8afff 100644 --- a/server/db/db.js +++ b/server/db/db.js @@ -610,71 +610,33 @@ async function insertContact(initiatorId, receiverId, contactUsername, read) { } async function getLatestMessage(conversation_id) { - const latestMessageQuery = ` - WITH LatestMessage AS ( - SELECT - m.message_id as id, - m.user_id, - m.content as last_message, - m.sent_at as last_message_time, - a.username as last_message_sender - FROM Messages m - JOIN Accounts a ON m.user_id = a.user_id - WHERE m.conversation_id = $1 - ORDER BY m.sent_at DESC - LIMIT 1 - ), - ConversationUsers AS ( - SELECT - m.user_id, - a.username, - c.read - FROM Memberships m - JOIN Accounts a ON m.user_id = a.user_id - LEFT JOIN Contacts c ON c.user_id = m.user_id AND c.conversation_id = $1 - WHERE m.conversation_id = $1 - LIMIT 1 - ) - SELECT - lm.*, - cu.user_id, - cu.username, - cu.read, - c.conversation_type as type, - c.last_active, - c.conversation_id - FROM Conversations c - LEFT JOIN LatestMessage lm ON TRUE - LEFT JOIN ConversationUsers cu ON TRUE - WHERE c.conversation_id = $1; + const query = ` + SELECT DISTINCT ON (m.conversation_id) + m.content AS last_message, + m.sent_at AS last_message_time, + a.username AS last_message_sender + FROM Messages m + JOIN Accounts a ON m.user_id = a.user_id + WHERE m.conversation_id = $1 + ORDER BY m.conversation_id, m.sent_at DESC + LIMIT 1; `; try { - // Get latest message and details - const result = await client.query(latestMessageQuery, [conversation_id]); - - if (result.rows.length === 0) { - console.error("No messages found in conversation:", conversation_id); - return null; - } - - const row = result.rows[0]; + const result = await client.query(query, [conversation_id]); return { - id: row.id, - user_id: row.user_id, - username: row.username, - last_active: row.last_active, - conversation_id: row.conversation_id, - type: row.type, - read: row.read, - last_message: row.last_message, - last_message_time: row.last_message_time, - last_message_sender: row.last_message_sender, + last_message: result.rows[0].last_message || null, + last_message_time: result.rows[0].last_message_time || null, + last_message_sender: result.rows[0].last_message_sender || null, }; } catch (error) { console.error("Failed to get latest message:", error); - return null; + return { + last_message: null, + last_message_time: null, + last_message_sender: null, + }; } } @@ -699,17 +661,7 @@ async function checkMembership(user_id, conversation_id) { async function getContacts(user_id) { const contactsQuery = ` - WITH LastMessages AS ( - SELECT DISTINCT ON (m.conversation_id) - m.conversation_id, - m.content AS last_message, - m.sent_at AS last_message_time, - a.username AS last_message_sender - FROM Messages m - JOIN Accounts a ON m.user_id = a.user_id - ORDER BY m.conversation_id, m.sent_at DESC - ), - DirectContacts AS ( + WITH DirectContacts AS ( SELECT c.contact_id AS id, a.user_id AS user_id, @@ -717,18 +669,14 @@ async function getContacts(user_id) { conv.last_active, c.conversation_id, conv.conversation_type AS type, - c.read, - lm.last_message, - lm.last_message_time, - lm.last_message_sender + c.read FROM Contacts c JOIN Conversations conv ON c.conversation_id = conv.conversation_id JOIN Memberships m ON m.conversation_id = c.conversation_id JOIN Accounts a ON a.user_id = m.user_id - LEFT JOIN LastMessages lm ON c.conversation_id = lm.conversation_id WHERE c.user_id = $1 AND conv.conversation_type = 'direct' - AND a.user_id != $1 + AND (a.user_id != $1 OR (SELECT COUNT(*) FROM Memberships WHERE conversation_id = c.conversation_id) = 1) ORDER BY c.conversation_id, conv.last_active DESC ), GroupContacts AS ( @@ -739,13 +687,9 @@ async function getContacts(user_id) { conv.last_active, c.conversation_id, conv.conversation_type AS type, - c.read, - lm.last_message, - lm.last_message_time, - lm.last_message_sender + c.read FROM Contacts c JOIN Conversations conv ON c.conversation_id = conv.conversation_id - LEFT JOIN LastMessages lm ON c.conversation_id = lm.conversation_id WHERE c.user_id = $1 AND conv.conversation_type = 'group' ORDER BY c.conversation_id, conv.last_active DESC @@ -761,19 +705,24 @@ async function getContacts(user_id) { const contactsResult = await client.query(contactsQuery, [user_id]); console.log(contactsResult.rows); // Debugging: log the results to verify - // Map the results to a more friendly format - const contacts = contactsResult.rows.map((row) => ({ - id: row.id, - user_id: row.user_id, - username: row.username, - last_active: row.last_active, - conversation_id: row.conversation_id, - type: row.type, - read: row.read, - last_message: row.last_message, - last_message_time: row.last_message_time, - last_message_sender: row.last_message_sender, - })); + // Map the results to a more friendly format and fetch the latest message for each conversation + const contacts = await Promise.all( + contactsResult.rows.map(async (row) => { + const latestMessage = await getLatestMessage(row.conversation_id); + return { + id: row.id, + user_id: row.user_id, + username: row.username, + last_active: row.last_active, + conversation_id: row.conversation_id, + type: row.type, + read: row.read, + last_message: latestMessage.last_message || null, + last_message_time: latestMessage.last_message_time || null, + last_message_sender: latestMessage.last_message_sender || null, + }; + }), + ); return contacts; } catch (error) {