diff --git a/src/web/components/card-migrate.ts b/src/web/components/card-migrate.ts index b3d9116..05ac79f 100644 --- a/src/web/components/card-migrate.ts +++ b/src/web/components/card-migrate.ts @@ -52,9 +52,14 @@ function toUtcDatetime(dateStr: string): string { } } +// Maximum cards to migrate (ATProto record size limit ~256KB) +const MAX_MIGRATE_CARDS = 1200 + // Perform migration export async function performMigration(user: OldApiUser, cards: OldApiCard[]): Promise { - const checksum = generateChecksum(user, cards) + // Limit cards to avoid exceeding ATProto record size limit + const limitedCards = cards.slice(0, MAX_MIGRATE_CARDS) + const checksum = generateChecksum(user, limitedCards) // Convert user data (only required + used fields, matching lexicon types) // Note: ATProto doesn't support float, so planet is converted to integer @@ -70,7 +75,7 @@ export async function performMigration(user: OldApiUser, cards: OldApiCard[]): P } // Convert card data (only required + used fields) - const cardData = cards.map(c => ({ + const cardData = limitedCards.map(c => ({ id: c.id, card: c.card, cp: c.cp, @@ -199,6 +204,10 @@ export function renderMigrationPage( ${Math.floor(oldApiUser.planet).toLocaleString()} Planet +
+ ${(oldApiUser.coin ?? 0).toLocaleString()} + Coin +
@@ -229,7 +238,9 @@ export function setupMigrationButton( return } - if (!confirm(`Migrate ${oldApiCards.length} cards to ATProto?`)) { + const migrateCount = Math.min(oldApiCards.length, MAX_MIGRATE_CARDS) + const limitMsg = oldApiCards.length > MAX_MIGRATE_CARDS ? ` (limited from ${oldApiCards.length})` : '' + if (!confirm(`Migrate ${migrateCount} cards${limitMsg} to ATProto?`)) { return }