From 55a1626159651a087e0187bfc7aa10d6e80d2e93 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 31 Mar 2026 02:50:15 +0000 Subject: [PATCH] fix: merge old bookmarks into existing new bookmarks during migration Instead of replacing the new bookmark list, the migration now checks for an existing kind 10003 event and merges old bookmarks into it, skipping duplicates that already exist. https://claude.ai/code/session_01U9sjQHQMVVHxYiesoXjqop --- .../vitorpamplona/amethyst/model/Account.kt | 40 +++++++++++++++---- .../amethyst/model/LocalCache.kt | 1 - 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 19030c9a9..a92fa6138 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -1822,17 +1822,41 @@ class Account( if (!isWriteable()) return val oldList = oldBookmarkState.getBookmarkList() ?: return - val publicBookmarks = oldList.publicBookmarks() - val privateBookmarks = oldList.privateBookmarks(signer) ?: emptyList() + val oldPublic = oldList.publicBookmarks() + val oldPrivate = oldList.privateBookmarks(signer) ?: emptyList() - if (publicBookmarks.isEmpty() && privateBookmarks.isEmpty()) return + if (oldPublic.isEmpty() && oldPrivate.isEmpty()) return + + val existingNewList = bookmarkState.getBookmarkList() val newEvent = - BookmarkListEvent.create( - publicBookmarks = publicBookmarks, - privateBookmarks = privateBookmarks, - signer = signer, - ) + if (existingNewList != null) { + val existingPublic = existingNewList.publicBookmarks() + val existingPrivate = existingNewList.privateBookmarks(signer) ?: emptyList() + + val existingPublicIds = existingPublic.map { it.toTagIdOnly().toList() }.toSet() + val existingPrivateIds = existingPrivate.map { it.toTagIdOnly().toList() }.toSet() + + val newPublic = oldPublic.filter { it.toTagIdOnly().toList() !in existingPublicIds } + val newPrivate = oldPrivate.filter { it.toTagIdOnly().toList() !in existingPrivateIds } + + if (newPublic.isEmpty() && newPrivate.isEmpty()) return + + val mergedPublic = existingPublic + newPublic + val mergedPrivate = existingPrivate + newPrivate + + BookmarkListEvent.create( + publicBookmarks = mergedPublic, + privateBookmarks = mergedPrivate, + signer = signer, + ) + } else { + BookmarkListEvent.create( + publicBookmarks = oldPublic, + privateBookmarks = oldPrivate, + signer = signer, + ) + } sendMyPublicAndPrivateOutbox(newEvent) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index fa616af96..b948f67cb 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -581,7 +581,6 @@ object LocalCache : ILocalCache, ICacheProvider { return false } - fun consumeRegularEvent( event: Event, relay: NormalizedRelayUrl?,