Work on delete chat

This commit is contained in:
2025-08-01 20:59:59 +03:30
parent c6616863a1
commit 3cdbb7e24b
5 changed files with 242 additions and 12 deletions
@@ -65,6 +65,54 @@ public class MessageDatabase {
}
}
public static void markGloballyDeleted(UUID chatId) {
String sql = "UPDATE messages SET deleted_globally = true WHERE receiver_id = ? AND receiver_type = 'private'";
try (Connection conn = ConnectionDb.connect(); PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, chatId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void logDeletedMessagesFor(UUID chatId, UUID userId) {
List<Message> messages = MessageDatabase.privateChatHistory(chatId);
for (Message message : messages) {
if (!isMessageDeleted(message.getMessage_id(), userId)) {
String sql = """
INSERT INTO deleted_messages (message_id, user_id)
VALUES (?, ?)
ON CONFLICT (message_id, user_id) DO NOTHING
""";
try (Connection conn = ConnectionDb.connect();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, message.getMessage_id());
ps.setObject(2, userId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
public static boolean isMessageDeleted(UUID messageId, UUID userId) {
String sql = "SELECT 1 FROM deleted_messages WHERE message_id = ? AND user_id = ?";
try (Connection conn = ConnectionDb.connect();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, messageId);
ps.setObject(2, userId);
ResultSet rs = ps.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public void markMessageAsRead(UUID messageId, UUID userId) {
String sql = "INSERT INTO message_receipts (message_id, user_id) VALUES (?, ?) ON CONFLICT DO NOTHING";
try (Connection conn = ConnectionDb.connect();
@@ -2,10 +2,7 @@ package org.to.telegramfinalproject.Database;
import org.to.telegramfinalproject.Models.PrivateChat;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
@@ -133,4 +130,129 @@ public class PrivateChatDatabase {
return null;
}
private static PrivateChat extractPrivateChat(ResultSet rs) throws SQLException {
UUID chatId = UUID.fromString(rs.getString("chat_id"));
UUID user1 = rs.getObject("user1_id", UUID.class);
UUID user2 = rs.getObject("user2_id", UUID.class);
boolean user1Deleted = rs.getBoolean("user1_deleted");
boolean user2Deleted = rs.getBoolean("user2_deleted");
LocalDateTime createdAt = rs.getTimestamp("created_at").toLocalDateTime();
return new PrivateChat(chatId, user1, user2, user1Deleted, user2Deleted, createdAt);
}
public static void markChatDeleted(UUID userId, UUID chatId) {
String sql = """
UPDATE private_chat
SET user1_deleted = CASE WHEN user1_id = ? THEN true ELSE user1_deleted END,
user2_deleted = CASE WHEN user2_id = ? THEN true ELSE user2_deleted END
WHERE chat_id = ?
""";
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setObject(1, userId);
stmt.setObject(2, userId);
stmt.setObject(3, chatId);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void unmarkChatDeleted(UUID userId, UUID chatId) {
String sql = """
UPDATE private_chat
SET user1_deleted = CASE WHEN user1_id = ? THEN false ELSE user1_deleted END,
user2_deleted = CASE WHEN user2_id = ? THEN false ELSE user2_deleted END
WHERE chat_id = ?
""";
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setObject(1, userId);
stmt.setObject(2, userId);
stmt.setObject(3, chatId);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void markUser1Deleted(UUID chatId) {
updateBoolField(chatId, "user1_deleted", true);
}
public static void markUser2Deleted(UUID chatId) {
updateBoolField(chatId, "user2_deleted", true);
}
public static void markBothDeleted(UUID chatId) {
String sql = "UPDATE private_chat SET user1_deleted = true, user2_deleted = true WHERE chat_id = ?";
try (Connection conn = ConnectionDb.connect(); PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, chatId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
private static void updateBoolField(UUID chatId, String field, boolean value) {
String sql = "UPDATE private_chat SET " + field + " = ? WHERE chat_id = ?";
try (Connection conn = ConnectionDb.connect(); PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setBoolean(1, value);
ps.setObject(2, chatId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static PrivateChat findById(UUID chatId) {
String sql = "SELECT * FROM private_chat WHERE chat_id = ?";
try (Connection conn = ConnectionDb.connect(); PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, chatId);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
UUID user1_id = (UUID) rs.getObject("user1_id");
UUID user2_id = (UUID) rs.getObject("user2_id");
boolean user1_deleted = rs.getBoolean("user1_deleted");
boolean user2_deleted = rs.getBoolean("user2_deleted");
LocalDateTime created_at = rs.getTimestamp("created_at").toLocalDateTime();
return new PrivateChat(chatId, user1_id, user2_id, user1_deleted, user2_deleted, created_at);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void clearDeletedFlag(UUID senderId, UUID receiverId) {
String sql = """
UPDATE private_chat
SET user1_deleted = CASE WHEN user1_id = ? THEN false ELSE user1_deleted END,
user2_deleted = CASE WHEN user2_id = ? THEN false ELSE user2_deleted END
WHERE (user1_id = ? AND user2_id = ?) OR (user1_id = ? AND user2_id = ?)
""";
try (Connection conn = ConnectionDb.connect(); PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setObject(1, senderId);
ps.setObject(2, senderId);
ps.setObject(3, senderId);
ps.setObject(4, receiverId);
ps.setObject(5, receiverId);
ps.setObject(6, senderId);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
}