Merge branch 'develop' into ArchivedChats

# Conflicts:
#	src/main/java/org/to/telegramfinalproject/Client/ActionHandler.java
#	src/main/java/org/to/telegramfinalproject/Client/Session.java
#	src/main/java/org/to/telegramfinalproject/Models/ChatEntry.java
#	src/main/java/org/to/telegramfinalproject/Server/ClientHandler.java
This commit is contained in:
2025-07-25 12:41:03 +03:30
16 changed files with 2415 additions and 517 deletions
@@ -576,7 +576,7 @@ public class ChannelDatabase {
public static boolean transferOwnership(UUID channelId, UUID newOwnerUUID) {
String sql = """
String updateRoles = """
UPDATE channel_subscribers
SET role = CASE
WHEN user_id = ? THEN 'owner'
@@ -586,15 +586,64 @@ public class ChannelDatabase {
WHERE channel_id = ?
""";
String clearPermissions = """
UPDATE channel_subscribers
SET permissions = '{}'::jsonb
WHERE channel_id = ? AND user_id = ?
""";
try (Connection conn = ConnectionDb.connect()) {
conn.setAutoCommit(false);
try (PreparedStatement roleStmt = conn.prepareStatement(updateRoles);
PreparedStatement clearPermsStmt = conn.prepareStatement(clearPermissions)) {
roleStmt.setObject(1, newOwnerUUID);
roleStmt.setObject(2, channelId);
roleStmt.executeUpdate();
clearPermsStmt.setObject(1, channelId);
clearPermsStmt.setObject(2, newOwnerUUID);
clearPermsStmt.executeUpdate();
conn.commit();
return true;
} catch (SQLException e) {
conn.rollback();
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
public static List<UUID> getChannelSubscriberUUIDs(UUID channelId) {
List<UUID> subscriberIds = new ArrayList<>();
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement(sql)) {
PreparedStatement stmt = conn.prepareStatement("SELECT user_id FROM channel_subscribers WHERE channel_id = ?")) {
stmt.setObject(1, channelId);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
subscriberIds.add(UUID.fromString(rs.getString("user_id")));
}
} catch (SQLException e) {
e.printStackTrace();
}
return subscriberIds;
}
stmt.setObject(1, newOwnerUUID);
public static boolean updateAdminPermissions(UUID channelId, UUID userId, JSONObject permissions) {
String sql = "UPDATE channel_subscribers SET permissions = ?::jsonb WHERE channel_id = ? AND user_id = ? AND role = 'admin'";
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, permissions.toString());
stmt.setObject(2, channelId);
stmt.executeUpdate();
return true;
stmt.setObject(3, userId);
return stmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
@@ -34,6 +34,15 @@ public class ContactDatabase {
}
}
public static List<UUID> getContactUUIDs(UUID userId) {
List<Contact> contacts = getContacts(userId);
List<UUID> contactIds = new ArrayList<>();
for (Contact c : contacts) {
contactIds.add(c.getContact_id());
}
return contactIds;
}
public boolean removeContact(UUID user_id, UUID contact_id) {
@@ -3,6 +3,7 @@ package org.to.telegramfinalproject.Database;
import org.json.JSONArray;
import org.json.JSONObject;
import org.to.telegramfinalproject.Models.Group;
import org.to.telegramfinalproject.Models.User;
import java.sql.*;
import java.time.LocalDateTime;
@@ -377,7 +378,7 @@ public class GroupDatabase {
} catch (SQLException e) {
e.printStackTrace();
}
return "member"; // پیش‌فرض
return "member";
}
@@ -556,7 +557,7 @@ public class GroupDatabase {
public static boolean transferOwnership(UUID groupId, UUID newOwnerId) {
String demoteOldOwner = "UPDATE group_members SET role = 'admin' WHERE group_id = ? AND role = 'owner'";
String promoteNewOwner = "UPDATE group_members SET role = 'owner' WHERE group_id = ? AND user_id = ?";
String promoteNewOwner = "UPDATE group_members SET role = 'owner', permissions = '{}'::jsonb WHERE group_id = ? AND user_id = ?";
try (Connection conn = ConnectionDb.connect()) {
conn.setAutoCommit(false);
@@ -600,4 +601,82 @@ public class GroupDatabase {
}
public static List<UUID> getGroupMemberUUIDs(UUID groupId) {
List<UUID> memberIds = new ArrayList<>();
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement("SELECT user_id FROM group_members WHERE group_id = ?")) {
stmt.setObject(1, groupId);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
memberIds.add(UUID.fromString(rs.getString("user_id")));
}
} catch (SQLException e) {
e.printStackTrace();
}
return memberIds;
}
public static boolean updateAdminPermissions(UUID groupId, UUID userId, JSONObject permissions) {
String sql = "UPDATE group_members SET permissions = ?::jsonb WHERE group_id = ? AND user_id = ? AND role = 'admin'";
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, permissions.toString());
stmt.setObject(2, groupId);
stmt.setObject(3, userId);
return stmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public static boolean isMember(UUID groupId, UUID userId) {
String sql = "SELECT 1 FROM group_members WHERE group_id = ? AND user_id = ?";
try (Connection conn = ConnectionDb.connect();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setObject(1, groupId);
stmt.setObject(2, userId);
ResultSet rs = stmt.executeQuery();
return rs.next();
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
// public static List<User> searchGroupMembers(UUID groupId, String keyword) {
// List<User> result = new ArrayList<>();
// String sql = """
// SELECT u.*
// FROM users u
// JOIN group_members gm ON gm.user_id = u.internal_uuid
// WHERE gm.group_id = ?
// AND (
// LOWER(u.profile_name) LIKE ?
// OR LOWER(u.username) LIKE ?
// OR LOWER(u.user_id) LIKE ?
// )
// """;
//
// try (Connection conn = ConnectionDb.connect();
// PreparedStatement stmt = conn.prepareStatement(sql)) {
//
// stmt.setObject(1, groupId);
// String likePattern = "%" + keyword.toLowerCase() + "%";
// stmt.setString(2, likePattern);
// stmt.setString(3, likePattern);
// stmt.setString(4, likePattern);
//
// ResultSet rs = stmt.executeQuery();
// while (rs.next()) {
// User user = User.fromResultSet(rs);
// result.add(user);
// }
//
// } catch (SQLException e) {
// e.printStackTrace();
// }
// return result;
// }
}
@@ -9,13 +9,58 @@ import java.util.List;
import java.util.UUID;
public class userDatabase {
public userDatabase() {
}
private Connection getConnection() throws SQLException {
public static boolean isUserOnline(UUID userId) {
String sql = "SELECT status FROM users WHERE internal_uuid = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setObject(1, userId);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
String status = rs.getString("status");
return "online".equalsIgnoreCase(status);
}
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
private static Connection getConnection() throws SQLException {
return ConnectionDb.connect();
}
public static String getLastSeen(UUID userId) {
String sql = "SELECT last_seen FROM users WHERE internal_uuid = ?";
try (Connection conn = getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setObject(1, userId);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
Timestamp lastSeen = rs.getTimestamp("last_seen");
if (lastSeen != null) {
return lastSeen.toLocalDateTime().toString();
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return "Unknown";
}
public User findByUserId(String userId) {
String query = "SELECT * FROM users WHERE user_id = ?";