From 5afe3662d4ed877d6a17d1f7368af96895b45499 Mon Sep 17 00:00:00 2001 From: Partow Roshani Date: Thu, 12 Jun 2025 20:53:44 +0330 Subject: [PATCH] Fixed join channel and group bugs --- .../Client/ActionHandler.java | 10 ++++--- .../Database/ChannelDatabase.java | 27 ++++++++++++++++++ .../Database/GroupDatabase.java | 28 +++++++++++++++++++ .../telegramfinalproject/Models/JsonUtil.java | 21 +++++++++++--- .../Server/ClientHandler.java | 22 +++++++++++---- 5 files changed, 94 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/to/telegramfinalproject/Client/ActionHandler.java b/src/main/java/org/to/telegramfinalproject/Client/ActionHandler.java index e2db742..25b639b 100644 --- a/src/main/java/org/to/telegramfinalproject/Client/ActionHandler.java +++ b/src/main/java/org/to/telegramfinalproject/Client/ActionHandler.java @@ -85,15 +85,16 @@ public class ActionHandler { } - private void joinGroupOrChannel(String type, String id) { + private void joinGroupOrChannel(String type, String uuid) { JSONObject req = new JSONObject(); req.put("action", "join_" + type); - req.put("user_id", Session.currentUser.getString("user_id")); - req.put("id", id); + req.put("user_id", Session.currentUser.getString("internalUUID")); // ✅ internal_uuid لازم است + req.put("id", uuid); // ✅ این هم internal_uuid است send(req); } + private ChatEntry fetchChatInfo(String receiverId, String receiverType) { JSONObject req = new JSONObject(); req.put("action", "get_chat_info"); @@ -312,12 +313,13 @@ public class ActionHandler { } else { joinGroupOrChannel(type, uuid); - ChatEntry newChat = fetchChatInfo(uuid, type); + ChatEntry newChat = fetchChatInfo(id, type); refreshChatList(); openChat(newChat); } } + case "message" -> { String receiverId = selected.getString("receiver_id"); String receiverType = selected.getString("receiver_type"); diff --git a/src/main/java/org/to/telegramfinalproject/Database/ChannelDatabase.java b/src/main/java/org/to/telegramfinalproject/Database/ChannelDatabase.java index e6ca149..3e9783b 100644 --- a/src/main/java/org/to/telegramfinalproject/Database/ChannelDatabase.java +++ b/src/main/java/org/to/telegramfinalproject/Database/ChannelDatabase.java @@ -252,4 +252,31 @@ public class ChannelDatabase { } } + + public static Channel findByInternalUUID(UUID internalUUID) { + String sql = "SELECT * FROM channels WHERE internal_uuid = ?"; + try (Connection conn = ConnectionDb.connect(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setObject(1, internalUUID); + ResultSet rs = stmt.executeQuery(); + + if (rs.next()) { + Channel channel = new Channel(); + channel.setInternal_uuid(UUID.fromString(rs.getString("internal_uuid"))); + channel.setChannel_id(rs.getString("channel_id")); + channel.setChannel_name(rs.getString("channel_name")); + channel.setImage_url(rs.getString("image_url")); + channel.setCreator_id(UUID.fromString(rs.getString("creator_id"))); + channel.setDescription(rs.getString("description")); + channel.setCreated_at(rs.getTimestamp("created_at").toLocalDateTime()); + return channel; + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + } diff --git a/src/main/java/org/to/telegramfinalproject/Database/GroupDatabase.java b/src/main/java/org/to/telegramfinalproject/Database/GroupDatabase.java index 88fcae7..1cbc98d 100644 --- a/src/main/java/org/to/telegramfinalproject/Database/GroupDatabase.java +++ b/src/main/java/org/to/telegramfinalproject/Database/GroupDatabase.java @@ -256,4 +256,32 @@ public class GroupDatabase { } } + + + public static Group findByInternalUUID(UUID internalUUID) { + String sql = "SELECT * FROM groups WHERE internal_uuid = ?"; + try (Connection conn = ConnectionDb.connect(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setObject(1, internalUUID); + ResultSet rs = stmt.executeQuery(); + + if (rs.next()) { + Group group = new Group(); + group.setInternal_uuid(UUID.fromString(rs.getString("internal_uuid"))); + group.setGroup_id(rs.getString("group_id")); + group.setGroup_name(rs.getString("group_name")); + group.setImage_url(rs.getString("image_url")); + group.setCreator_id(UUID.fromString(rs.getString("creator_id"))); + group.setDescription(rs.getString("description")); + group.setCreated_at(rs.getTimestamp("created_at").toLocalDateTime()); + return group; + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + } \ No newline at end of file diff --git a/src/main/java/org/to/telegramfinalproject/Models/JsonUtil.java b/src/main/java/org/to/telegramfinalproject/Models/JsonUtil.java index f56159a..eba775f 100644 --- a/src/main/java/org/to/telegramfinalproject/Models/JsonUtil.java +++ b/src/main/java/org/to/telegramfinalproject/Models/JsonUtil.java @@ -109,9 +109,13 @@ public class JsonUtil { - public static JSONArray groupMemberListToJson(List members) { JSONArray array = new JSONArray(); + + if (members == null) { + return array; + } + for (GroupMember m : members) { JSONObject obj = new JSONObject(); obj.put("group_id", m.getGroup_id().toString()); @@ -120,22 +124,31 @@ public class JsonUtil { obj.put("role", m.getRole()); array.put(obj); } + return array; } - public static JSONArray channelSubscribeToJson(List subscribes){ + + public static JSONArray channelSubscribeToJson(List subscribes) { JSONArray array = new JSONArray(); - for(ChannelSubscribe s :subscribes ){ + + if (subscribes == null) { + return array; + } + + for (ChannelSubscribe s : subscribes) { JSONObject obj = new JSONObject(); - obj.put("channel_id",s.getChannel_id().toString()); + obj.put("channel_id", s.getChannel_id().toString()); obj.put("user_id", s.getUser_id().toString()); obj.put("Subscribed_at", s.getJoin_at().toString()); + array.put(obj); } return array; } + public static JSONArray chatListToJson(List chatList) { JSONArray jsonArray = new JSONArray(); diff --git a/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java b/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java index a6347ce..8fe3943 100644 --- a/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java +++ b/src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java @@ -228,10 +228,15 @@ public class ClientHandler implements Runnable { } case "join_group": { - UUID userUUID = new userDatabase().findByUserId(requestJson.getString("user_id")).getInternal_uuid(); - UUID groupUUID = GroupDatabase.findInternalUUIDByGroupId(requestJson.getString("id")); + UUID userUUID = UUID.fromString(requestJson.getString("user_id")); // مستقیم internalUUID دریافت می‌کنیم + Group group = GroupDatabase.findByInternalUUID(UUID.fromString(requestJson.getString("id"))); + if (group == null) { + response = new ResponseModel("error", "Group not found."); + break; + } - boolean joined = GroupDatabase.addMemberToGroup(userUUID, groupUUID); + + boolean joined = GroupDatabase.addMemberToGroup(userUUID, group.getInternal_uuid()); response = joined ? new ResponseModel("success", "Joined group.") : new ResponseModel("error", "Failed to join group."); @@ -239,10 +244,15 @@ public class ClientHandler implements Runnable { } case "join_channel": { - UUID userUUID = new userDatabase().findByUserId(requestJson.getString("user_id")).getInternal_uuid(); - UUID channelUUID = ChannelDatabase.findInternalUUIDByChannelId(requestJson.getString("id")); + UUID userUUID = UUID.fromString(requestJson.getString("user_id")); // مستقیم internalUUID دریافت می‌کنیم + Channel channel = ChannelDatabase.findByInternalUUID(UUID.fromString(requestJson.getString("id"))); + if (channel == null) { + response = new ResponseModel("error", "Channel not found."); + break; + } - boolean joined = ChannelDatabase.addSubscriberToChannel(userUUID, channelUUID); + + boolean joined = ChannelDatabase.addSubscriberToChannel(userUUID, channel.getInternal_uuid()); response = joined ? new ResponseModel("success", "Joined channel.") : new ResponseModel("error", "Failed to join channel.");