block/unblock fixed

This commit is contained in:
2025-08-01 15:58:35 +03:30
parent a2816972d1
commit c6616863a1
3 changed files with 49 additions and 58 deletions
@@ -1140,6 +1140,21 @@ public class ActionHandler {
return false;
}
JSONObject reqTarget = new JSONObject();
reqTarget.put("action", "get_private_chat_target");
reqTarget.put("chat_id", chat.getId());
JSONObject resTarget = sendWithResponse(reqTarget);
if (resTarget == null || !resTarget.getString("status").equals("success")) {
System.out.println("❌ Failed to fetch target user for private chat.");
return false;
}
String otherUserId = resTarget.getJSONObject("data").getString("target_id");
chat.setOtherUserId(UUID.fromString(otherUserId));
JSONObject req = new JSONObject();
req.put("action", "view_profile");
req.put("target_id", chat.getOtherUserId()); // internal UUID
@@ -1173,7 +1188,7 @@ public class ActionHandler {
String input = scanner.nextLine();
switch (input) {
case "1" -> sendMessage(chat.getId(), "private");
case "2" -> toggleBlock(chat.getId());
case "2" -> toggleBlock(chat.getOtherUserId());
case "3" -> {
deleteChat(chat.getId(), false);
return false;
@@ -2013,6 +2028,8 @@ public class ActionHandler {
private void toggleBlock(UUID userId) {
JSONObject req = new JSONObject();
req.put("action", "toggle_block");
req.put("user_id", Session.getUserUUID());
@@ -3142,7 +3159,7 @@ public class ActionHandler {
public void sendMessage(UUID receiverId, String receiverType) {
public void sendMessage(UUID chatId, String receiverType) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your message: ");
@@ -3163,11 +3180,11 @@ public class ActionHandler {
System.out.print("File URL: ");
String fileUrl = scanner.nextLine();
System.out.print("File Type (IMAGE / VIDEO / FILE): ");
String fileType = scanner.nextLine();
String fileType = scanner.nextLine().toUpperCase();
JSONObject fileJson = new JSONObject();
fileJson.put("file_url", fileUrl);
fileJson.put("file_type", fileType.toUpperCase());
fileJson.put("file_type", fileType);
attachmentsArray.put(fileJson);
System.out.print("Add another file? (yes/no): ");
@@ -3175,27 +3192,11 @@ public class ActionHandler {
}
}
// ------------------------ GET receiver_id if private ------------------------
UUID actualReceiverId = receiverId;
if (receiverType.equals("private")) {
JSONObject req = new JSONObject();
req.put("action", "get_or_create_private_chat");
req.put("user1", Session.currentPrivateChatUserId.toString());
req.put("user2", receiverId.toString());
JSONObject chatResponse = sendWithResponse(req);
if (chatResponse == null || !chatResponse.getString("status").equals("success")) {
System.out.println("❌ Failed to fetch private chat ID.");
return;
}
actualReceiverId = UUID.fromString(chatResponse.getJSONObject("data").getString("chat_id"));
}
// ------------------------ SEND MESSAGE ------------------------
// 🔹 فقط ارسال پیام با chat_id و receiver_type
JSONObject messageJson = new JSONObject();
messageJson.put("action", "send_message");
messageJson.put("receiver_type", receiverType);
messageJson.put("receiver_id", actualReceiverId.toString());
messageJson.put("receiver_id", chatId.toString());
messageJson.put("content", content);
messageJson.put("message_type", messageType);
@@ -3216,6 +3217,7 @@ public class ActionHandler {
}
@@ -258,25 +258,18 @@ public class MessageDatabase {
return result;
}
public static List<Message> privateChatHistory(UUID user1, UUID user2) {
public static List<Message> privateChatHistory(UUID chatId) {
List<Message> result = new ArrayList<>();
String sql = """
SELECT * FROM messages
WHERE receiver_type = 'private'
AND (
(sender_id = ? AND receiver_id = ?)
OR (sender_id = ? AND receiver_id = ?)
)
AND receiver_id = ?
ORDER BY send_at
""";
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setObject(1, user1);
stmt.setObject(2, user2);
stmt.setObject(3, user2);
stmt.setObject(4, user1);
stmt.setObject(1, chatId);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
result.add(extractMessage(rs));
@@ -289,6 +282,7 @@ public class MessageDatabase {
public static List<Message> groupChatHistory(UUID groupId) {
List<Message> result = new ArrayList<>();
String sql = """
@@ -164,13 +164,12 @@ public class ClientHandler implements Runnable {
User otherUser = userDatabase.findByInternalUUID(otherId);
if (otherUser == null) continue;
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTimeBetween(
currentUser.getInternal_uuid(), otherId, "private"
);
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTime(chat.getChat_id(), "private");
ChatEntry entry = new ChatEntry(
chat.getChat_id(), // 🔹 real private chat_id
otherUser.getUser_id(), // نمایش عمومی طرف مقابل
chat.getChat_id(),
otherUser.getUser_id(),
otherUser.getProfile_name(),
otherUser.getImage_url(),
"private",
@@ -690,13 +689,12 @@ public class ClientHandler implements Runnable {
User otherUser = userDatabase.findByInternalUUID(otherId);
if (otherUser == null) continue;
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTimeBetween(
currentUser.getInternal_uuid(), otherId, "private"
);
LocalDateTime lastMessageTime = MessageDatabase.getLastMessageTime(chat.getChat_id(), "private");
ChatEntry entry = new ChatEntry(
chat.getChat_id(), // 🔹 real private chat_id
otherUser.getUser_id(), // نمایش عمومی طرف مقابل
chat.getChat_id(),
otherUser.getUser_id(),
otherUser.getProfile_name(),
otherUser.getImage_url(),
"private",
@@ -1260,16 +1258,17 @@ public class ClientHandler implements Runnable {
switch (receiverType) {
case "private" -> {
List<UUID> members = PrivateChatDatabase.getMembers(UUID.fromString(receiverId));
if (members.size() != 2) {
response = new ResponseModel("error", "Invalid private chat.");
UUID chatId = UUID.fromString(receiverId);
List<UUID> members = PrivateChatDatabase.getMembers(chatId);
if (!members.contains(currentUser.getInternal_uuid())) {
response = new ResponseModel("error", "You're not a member of this private chat.");
break;
}
UUID otherUserId = members.get(0).equals(currentUser.getInternal_uuid()) ? members.get(1) : members.get(0);
messages = MessageDatabase.privateChatHistory(currentUser.getInternal_uuid(), otherUserId);
messages = MessageDatabase.privateChatHistory(chatId);
}
case "group" -> {
Group group = GroupDatabase.findByInternalUUID(UUID.fromString(receiverId));
if (group == null) {
@@ -2083,6 +2082,8 @@ public class ClientHandler implements Runnable {
}
private ResponseModel handleSendMessage(JSONObject json) {
try {
if (currentUser == null)
@@ -2093,12 +2094,8 @@ public class ClientHandler implements Runnable {
String receiverType = json.getString("receiver_type");
UUID receiverId;
if (receiverType.equals("private")) {
UUID receiverUserId = UUID.fromString(json.getString("receiver_user_id"));
receiverId = PrivateChatDatabase.getOrCreateChat(senderId, receiverUserId);
} else {
receiverId = UUID.fromString(json.getString("receiver_id")); // group یا channel
}
receiverId = UUID.fromString(json.getString("receiver_id"));
String content = json.optString("content", "");
String messageType = json.optString("message_type", "TEXT");
@@ -2123,15 +2120,13 @@ public class ClientHandler implements Runnable {
return new ResponseModel("error", "Message inserted but failed to attach files.");
}
// Send real-time message
Message msg = new Message(messageId, senderId, receiverId, receiverType, content, messageType, LocalDateTime.now());
List<UUID> receivers = getReceiversForChat(receiverId, receiverType);
receivers.remove(senderId);
RealTimeEventDispatcher.sendNewMessage(msg, receivers);
// Update chat list (last_message_time)
JSONObject chatUpdate = new JSONObject();
chatUpdate.put("chat_id", receiverId.toString());
chatUpdate.put("chat_type", receiverType);
@@ -2145,7 +2140,6 @@ public class ClientHandler implements Runnable {
RealTimeEventDispatcher.sendToUser(receiver, chatPayload);
}
JSONObject data = new JSONObject();
data.put("message_id", messageId.toString());
return new ResponseModel("success", "Message sent successfully.", data);
@@ -2156,6 +2150,7 @@ public class ClientHandler implements Runnable {
}
}
private List<UUID> getReceiversForChat(UUID receiverId, String receiverType) {
switch (receiverType) {
case "private":