From 6286bbe2ad03a7508c5d9ddc7ea83c7135146f18 Mon Sep 17 00:00:00 2001 From: Stampede Date: Sat, 15 Jun 2024 06:41:52 -0600 Subject: [PATCH] fix: mongo breaking due to mixed use of UUIDs and strings (#321) All UUIDs are now read and written as actual UUID objects, which was before causing errors due to a mixed use of UUID objects and string representations. --- .../husksync/database/MongoDbDatabase.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/net/william278/husksync/database/MongoDbDatabase.java b/common/src/main/java/net/william278/husksync/database/MongoDbDatabase.java index c9f87ec3..b8aea093 100644 --- a/common/src/main/java/net/william278/husksync/database/MongoDbDatabase.java +++ b/common/src/main/java/net/william278/husksync/database/MongoDbDatabase.java @@ -107,7 +107,7 @@ public class MongoDbDatabase extends Database { if (!existingUser.getUsername().equals(user.getUsername())) { // Update a user's name if it has changed in the database try { - Document filter = new Document("uuid", existingUser.getUuid().toString()); + Document filter = new Document("uuid", existingUser.getUuid()); Document doc = mongoCollectionHelper.getCollection(usersTable).find(filter).first(); if (doc == null) { throw new MongoException("User document returned null!"); @@ -123,7 +123,7 @@ public class MongoDbDatabase extends Database { () -> { // Insert new player data into the database try { - Document doc = new Document("uuid", user.getUuid().toString()).append("username", user.getUsername()); + Document doc = new Document("uuid", user.getUuid()).append("username", user.getUsername()); mongoCollectionHelper.insertDocument(usersTable, doc); } catch (MongoException e) { plugin.log(Level.SEVERE, "Failed to insert a user into the database", e); @@ -148,8 +148,7 @@ public class MongoDbDatabase extends Database { Document filter = new Document("uuid", uuid); Document doc = mongoCollectionHelper.getCollection(usersTable).find(filter).first(); if (doc != null) { - return Optional.of(new User(UUID.fromString(doc.getString("uuid")), - doc.getString("username"))); + return Optional.of(new User(uuid, doc.getString("username"))); } return Optional.empty(); } catch (MongoException e) { @@ -171,7 +170,7 @@ public class MongoDbDatabase extends Database { Document filter = new Document("username", username); Document doc = mongoCollectionHelper.getCollection(usersTable).find(filter).first(); if (doc != null) { - return Optional.of(new User(UUID.fromString(doc.getString("uuid")), + return Optional.of(new User(doc.get("uuid", UUID.class), doc.getString("username"))); } return Optional.empty(); @@ -190,13 +189,14 @@ public class MongoDbDatabase extends Database { @Blocking @Override public Optional getLatestSnapshot(@NotNull User user) { + System.out.println("Getting user latest snapshot " + user.getUsername()); try { - Document filter = new Document("player_uuid", user.getUuid().toString()); + Document filter = new Document("player_uuid", user.getUuid()); Document sort = new Document("timestamp", -1); // -1 = Descending FindIterable iterable = mongoCollectionHelper.getCollection(userDataTable).find(filter).sort(sort); Document doc = iterable.first(); if (doc != null) { - final UUID versionUuid = UUID.fromString(doc.getString("version_uuid")); + final UUID versionUuid = doc.get("version_uuid", UUID.class); final OffsetDateTime timestamp = OffsetDateTime.ofInstant(Instant.ofEpochMilli((long) doc.get("timestamp")), TimeZone.getDefault().toZoneId()); final Binary bin = doc.get("data", Binary.class); final byte[] dataByteArray = bin.getData(); @@ -221,11 +221,11 @@ public class MongoDbDatabase extends Database { public List getAllSnapshots(@NotNull User user) { try { final List retrievedData = Lists.newArrayList(); - Document filter = new Document("player_uuid", user.getUuid().toString()); + Document filter = new Document("player_uuid", user.getUuid()); Document sort = new Document("timestamp", -1); // -1 = Descending FindIterable iterable = mongoCollectionHelper.getCollection(userDataTable).find(filter).sort(sort); for (Document doc : iterable) { - final UUID versionUuid = UUID.fromString(doc.getString("version_uuid")); + final UUID versionUuid = doc.get("version_uuid", UUID.class); final OffsetDateTime timestamp = OffsetDateTime.ofInstant(Instant.ofEpochMilli((long) doc.get("timestamp")), TimeZone.getDefault().toZoneId()); final Binary bin = doc.get("data", Binary.class); final byte[] dataByteArray = bin.getData(); @@ -249,7 +249,7 @@ public class MongoDbDatabase extends Database { @Override public Optional getSnapshot(@NotNull User user, @NotNull UUID versionUuid) { try { - Document filter = new Document("player_uuid", user.getUuid().toString()).append("version_uuid", versionUuid.toString()); + Document filter = new Document("player_uuid", user.getUuid()).append("version_uuid", versionUuid); Document sort = new Document("timestamp", -1); // -1 = Descending FindIterable iterable = mongoCollectionHelper.getCollection(userDataTable).find(filter).sort(sort); Document doc = iterable.first(); @@ -281,7 +281,7 @@ public class MongoDbDatabase extends Database { final int maxSnapshots = plugin.getSettings().getSynchronization().getMaxUserDataSnapshots(); if (unpinnedUserData.size() > maxSnapshots) { - Document filter = new Document("player_uuid", user.getUuid().toString()).append("pinned", false); + Document filter = new Document("player_uuid", user.getUuid()).append("pinned", false); Document sort = new Document("timestamp", 1); // 1 = Ascending FindIterable iterable = mongoCollectionHelper.getCollection(userDataTable) .find(filter) @@ -307,7 +307,7 @@ public class MongoDbDatabase extends Database { @Override public boolean deleteSnapshot(@NotNull User user, @NotNull UUID versionUuid) { try { - Document filter = new Document("player_uuid", user.getUuid().toString()).append("version_uuid", versionUuid.toString()); + Document filter = new Document("player_uuid", user.getUuid()).append("version_uuid", versionUuid); Document doc = mongoCollectionHelper.getCollection(userDataTable).find(filter).first(); if (doc == null) { return false; @@ -332,7 +332,7 @@ public class MongoDbDatabase extends Database { @Override protected void rotateLatestSnapshot(@NotNull User user, @NotNull OffsetDateTime within) { try { - Document filter = new Document("player_uuid", user.getUuid().toString()).append("pinned", false); + Document filter = new Document("player_uuid", user.getUuid()).append("pinned", false); Document sort = new Document("timestamp", 1); // 1 = Ascending FindIterable iterable = mongoCollectionHelper.getCollection(userDataTable) .find(filter) @@ -361,9 +361,10 @@ public class MongoDbDatabase extends Database { @Blocking @Override protected void createSnapshot(@NotNull User user, @NotNull DataSnapshot.Packed data) { + System.out.println("Creating user snapshot " + user.getUsername()); try { - Document doc = new Document("player_uuid", user.getUuid().toString()) - .append("version_uuid", data.getId().toString()) + Document doc = new Document("player_uuid", user.getUuid()) + .append("version_uuid", data.getId()) .append("timestamp", data.getTimestamp().toInstant().toEpochMilli()) .append("save_cause", data.getSaveCause().name()) .append("pinned", data.isPinned()) @@ -384,7 +385,7 @@ public class MongoDbDatabase extends Database { @Override public void updateSnapshot(@NotNull User user, @NotNull DataSnapshot.Packed data) { try { - Document doc = new Document("player_uuid", user.getUuid().toString()).append("version_uuid", data.getId().toString()); + Document doc = new Document("player_uuid", user.getUuid()).append("version_uuid", data.getId()); Bson updates = Updates.combine( Updates.set("save_cause", data.getSaveCause().name()), Updates.set("pinned", data.isPinned()),