fix chat header

This commit is contained in:
2025-08-31 17:00:35 +03:30
parent bdd9d03128
commit 626a1335e6
6 changed files with 336 additions and 54 deletions
@@ -0,0 +1,130 @@
package org.to.telegramfinalproject.Database;
import org.json.JSONObject;
import java.sql.*;
import java.time.OffsetDateTime;
import java.util.UUID;
public class ChatInfoDatabase {
/**
* هدر چت را بر اساس نوع آن برمی‌گرداند.
* private: name,image_url, online,last_seen
* group : name,image_url, member_count
* channel: name,image_url, member_count
*/
public static JSONObject getHeaderInfo(String type, UUID receiverId, UUID viewerId) throws SQLException {
try (Connection conn = ConnectionDb.connect()) {
switch (type.toLowerCase()) {
case "private":
return getPrivateHeader(conn, receiverId, viewerId);
case "group":
return getGroupHeader(conn, receiverId);
case "channel":
return getChannelHeader(conn, receiverId);
default:
throw new IllegalArgumentException("Unsupported receiver_type: " + type);
}
}
}
/** هدر چت خصوصی: other-user نسبت به viewerId را پیدا می‌کنیم */
private static JSONObject getPrivateHeader(Connection conn, UUID chatId, UUID viewerId) throws SQLException {
if (viewerId == null) throw new IllegalArgumentException("viewerId is required for private header.");
final String sql = """
SELECT
u.profile_name AS name,
COALESCE(u.image_url, '') AS image_url,
(u.status = 'online') AS online,
u.status AS status,
u.last_seen AS last_seen
FROM private_chat pc
JOIN users u
ON u.internal_uuid = CASE WHEN pc.user1_id = ? THEN pc.user2_id ELSE pc.user1_id END
WHERE pc.chat_id = ?
AND (pc.user1_id = ? OR pc.user2_id = ?)
LIMIT 1
""";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
int i = 1;
ps.setObject(i++, viewerId);
ps.setObject(i++, chatId);
ps.setObject(i++, viewerId);
ps.setObject(i++, viewerId);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) throw new SQLException("Private chat not found or viewer is not a participant.");
JSONObject j = new JSONObject();
j.put("type", "private");
j.put("name", rs.getString("name"));
j.put("image_url", rs.getString("image_url"));
// خواندن بولینِ online با سازگاری DB
Object onlineObj = rs.getObject("online");
boolean online = (onlineObj instanceof Boolean) ? (Boolean) onlineObj
: rs.getInt("online") == 1;
j.put("online", online);
j.put("status", rs.getString("status")); // رشته‌ی وضعیت هم می‌آید
Timestamp ts = rs.getTimestamp("last_seen");
j.put("last_seen", ts == null ? JSONObject.NULL : ts.toInstant().toString());
return j;
}
}
}
/** هدر گروه: نام، عکس و تعداد اعضا */
private static JSONObject getGroupHeader(Connection conn, UUID groupInternalId) throws SQLException {
String sql = """
SELECT
g.group_name AS name,
COALESCE(g.image_url, '') AS image_url,
(SELECT COUNT(*) FROM group_members gm WHERE gm.group_id = g.internal_uuid) AS member_count
FROM groups g
WHERE g.internal_uuid = ?
LIMIT 1
""";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, groupInternalId);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) throw new SQLException("Group not found.");
JSONObject j = new JSONObject();
j.put("type", "group");
j.put("name", rs.getString("name"));
j.put("image_url", rs.getString("image_url"));
j.put("member_count", rs.getInt("member_count"));
return j;
}
}
}
/** هدر کانال: نام، عکس و تعداد سابسکرایبر */
private static JSONObject getChannelHeader(Connection conn, UUID channelInternalId) throws SQLException {
String sql = """
SELECT
c.channel_name AS name,
COALESCE(c.image_url, '') AS image_url,
(SELECT COUNT(*) FROM channel_subscribers cs WHERE cs.channel_id = c.internal_uuid) AS member_count
FROM channels c
WHERE c.internal_uuid = ?
LIMIT 1
""";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, channelInternalId);
try (ResultSet rs = ps.executeQuery()) {
if (!rs.next()) throw new SQLException("Channel not found.");
JSONObject j = new JSONObject();
j.put("type", "channel");
j.put("name", rs.getString("name"));
j.put("image_url", rs.getString("image_url"));
j.put("member_count", rs.getInt("member_count"));
return j;
}
}
}
}
@@ -448,22 +448,19 @@ public class MessageDatabase {
public static List<Message> getUnreadMessages(UUID userId) {
return getUnreadMessages(userId, 200); // یک سقف معقول
return getUnreadMessages(userId, 200);
}
public static List<Message> getUnreadMessages(UUID userId, int limit) {
List<Message> messages = new ArrayList<>();
// توجه: نام جدول private_chats/gm/cs را با اسامی واقعی دیتابیس‌ت هماهنگ کن
String sql = """
SELECT m.*
FROM messages m
LEFT JOIN message_receipts r
ON r.message_id = m.message_id
AND r.user_id = ?
ON r.message_id = m.message_id AND r.user_id = ?
LEFT JOIN deleted_messages d
ON d.message_id = m.message_id
AND d.user_id = ?
ON d.message_id = m.message_id AND d.user_id = ?
WHERE r.message_id IS NULL
AND d.message_id IS NULL
AND m.is_deleted_globally = FALSE
@@ -474,14 +471,14 @@ public class MessageDatabase {
FROM private_chat pc
WHERE pc.chat_id = m.receiver_id
AND (pc.user1_id = ? OR pc.user2_id = ?)
)))
OR (m.receiver_type = 'group' AND EXISTS (
))
OR (m.receiver_type = 'group' AND EXISTS (
SELECT 1
FROM group_members gm
WHERE gm.group_id = m.receiver_id
AND gm.user_id = ?
))
OR (m.receiver_type = 'channel' AND EXISTS (
OR (m.receiver_type = 'channel' AND EXISTS (
SELECT 1
FROM channel_subscribers cs
WHERE cs.channel_id = m.receiver_id
@@ -499,16 +496,14 @@ public class MessageDatabase {
ps.setObject(i++, userId); // r.user_id
ps.setObject(i++, userId); // d.user_id
ps.setObject(i++, userId); // m.sender_id <> ?
ps.setObject(i++, userId); // pc.user1_id=userId
ps.setObject(i++, userId); // pc.user2_id=userId
ps.setObject(i++, userId); // pc.user1_id
ps.setObject(i++, userId); // pc.user2_id
ps.setObject(i++, userId); // gm.user_id
ps.setObject(i++, userId); // cs.user_id
ps.setInt(i++, Math.max(1, limit));
ps.setInt(i, Math.max(1, limit));
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
messages.add(mapMessage(rs)); // همان mapMessage که گفتیم
}
while (rs.next()) messages.add(mapMessage(rs));
}
} catch (SQLException e) {
e.printStackTrace();
@@ -517,6 +512,7 @@ public class MessageDatabase {
}
private static java.util.UUID readUUID(ResultSet rs, String col) throws SQLException {
Object o = rs.getObject(col);
if (o == null) return null;