fixed getContacts function
This commit is contained in:
133
server/db/db.js
133
server/db/db.js
@@ -610,71 +610,33 @@ async function insertContact(initiatorId, receiverId, contactUsername, read) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function getLatestMessage(conversation_id) {
|
async function getLatestMessage(conversation_id) {
|
||||||
const latestMessageQuery = `
|
const query = `
|
||||||
WITH LatestMessage AS (
|
SELECT DISTINCT ON (m.conversation_id)
|
||||||
SELECT
|
m.content AS last_message,
|
||||||
m.message_id as id,
|
m.sent_at AS last_message_time,
|
||||||
m.user_id,
|
a.username AS last_message_sender
|
||||||
m.content as last_message,
|
FROM Messages m
|
||||||
m.sent_at as last_message_time,
|
JOIN Accounts a ON m.user_id = a.user_id
|
||||||
a.username as last_message_sender
|
WHERE m.conversation_id = $1
|
||||||
FROM Messages m
|
ORDER BY m.conversation_id, m.sent_at DESC
|
||||||
JOIN Accounts a ON m.user_id = a.user_id
|
LIMIT 1;
|
||||||
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;
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Get latest message and details
|
const result = await client.query(query, [conversation_id]);
|
||||||
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];
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: row.id,
|
last_message: result.rows[0].last_message || null,
|
||||||
user_id: row.user_id,
|
last_message_time: result.rows[0].last_message_time || null,
|
||||||
username: row.username,
|
last_message_sender: result.rows[0].last_message_sender || null,
|
||||||
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,
|
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Failed to get latest message:", 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) {
|
async function getContacts(user_id) {
|
||||||
const contactsQuery = `
|
const contactsQuery = `
|
||||||
WITH LastMessages AS (
|
WITH DirectContacts 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 (
|
|
||||||
SELECT
|
SELECT
|
||||||
c.contact_id AS id,
|
c.contact_id AS id,
|
||||||
a.user_id AS user_id,
|
a.user_id AS user_id,
|
||||||
@@ -717,18 +669,14 @@ async function getContacts(user_id) {
|
|||||||
conv.last_active,
|
conv.last_active,
|
||||||
c.conversation_id,
|
c.conversation_id,
|
||||||
conv.conversation_type AS type,
|
conv.conversation_type AS type,
|
||||||
c.read,
|
c.read
|
||||||
lm.last_message,
|
|
||||||
lm.last_message_time,
|
|
||||||
lm.last_message_sender
|
|
||||||
FROM Contacts c
|
FROM Contacts c
|
||||||
JOIN Conversations conv ON c.conversation_id = conv.conversation_id
|
JOIN Conversations conv ON c.conversation_id = conv.conversation_id
|
||||||
JOIN Memberships m ON m.conversation_id = c.conversation_id
|
JOIN Memberships m ON m.conversation_id = c.conversation_id
|
||||||
JOIN Accounts a ON a.user_id = m.user_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
|
WHERE c.user_id = $1
|
||||||
AND conv.conversation_type = 'direct'
|
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
|
ORDER BY c.conversation_id, conv.last_active DESC
|
||||||
),
|
),
|
||||||
GroupContacts AS (
|
GroupContacts AS (
|
||||||
@@ -739,13 +687,9 @@ async function getContacts(user_id) {
|
|||||||
conv.last_active,
|
conv.last_active,
|
||||||
c.conversation_id,
|
c.conversation_id,
|
||||||
conv.conversation_type AS type,
|
conv.conversation_type AS type,
|
||||||
c.read,
|
c.read
|
||||||
lm.last_message,
|
|
||||||
lm.last_message_time,
|
|
||||||
lm.last_message_sender
|
|
||||||
FROM Contacts c
|
FROM Contacts c
|
||||||
JOIN Conversations conv ON c.conversation_id = conv.conversation_id
|
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
|
WHERE c.user_id = $1
|
||||||
AND conv.conversation_type = 'group'
|
AND conv.conversation_type = 'group'
|
||||||
ORDER BY c.conversation_id, conv.last_active DESC
|
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]);
|
const contactsResult = await client.query(contactsQuery, [user_id]);
|
||||||
console.log(contactsResult.rows); // Debugging: log the results to verify
|
console.log(contactsResult.rows); // Debugging: log the results to verify
|
||||||
|
|
||||||
// Map the results to a more friendly format
|
// Map the results to a more friendly format and fetch the latest message for each conversation
|
||||||
const contacts = contactsResult.rows.map((row) => ({
|
const contacts = await Promise.all(
|
||||||
id: row.id,
|
contactsResult.rows.map(async (row) => {
|
||||||
user_id: row.user_id,
|
const latestMessage = await getLatestMessage(row.conversation_id);
|
||||||
username: row.username,
|
return {
|
||||||
last_active: row.last_active,
|
id: row.id,
|
||||||
conversation_id: row.conversation_id,
|
user_id: row.user_id,
|
||||||
type: row.type,
|
username: row.username,
|
||||||
read: row.read,
|
last_active: row.last_active,
|
||||||
last_message: row.last_message,
|
conversation_id: row.conversation_id,
|
||||||
last_message_time: row.last_message_time,
|
type: row.type,
|
||||||
last_message_sender: row.last_message_sender,
|
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;
|
return contacts;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user