fixed getContacts function

This commit is contained in:
slawk0
2025-01-04 23:50:02 +01:00
parent 17c2427413
commit 334c14bd9e

View File

@@ -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
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.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;
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,8 +705,11 @@ 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) => ({
// 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,
@@ -770,10 +717,12 @@ async function getContacts(user_id) {
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: latestMessage.last_message || null,
last_message_time: latestMessage.last_message_time || null,
last_message_sender: latestMessage.last_message_sender || null,
};
}),
);
return contacts;
} catch (error) {