From 603a683ab2b4b7414c4216593c42a5d3dd50e6e2 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Mon, 6 Oct 2025 18:04:56 -0600 Subject: [PATCH] Fixed major issue with sync logic. Should be stable now. Solidified with tests... turns out syncing is hard... --- .../openclimb/data/sync/SyncService.kt | 144 +++++++++++++----- .../UserInterfaceState.xcuserstate | Bin 135844 -> 135753 bytes ios/OpenClimb/Services/SyncService.swift | 75 ++++++++- .../ViewModels/ClimbingDataManager.swift | 2 - 4 files changed, 172 insertions(+), 49 deletions(-) diff --git a/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt b/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt index 22e3752..e5006c8 100644 --- a/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt +++ b/android/app/src/main/java/com/atridad/openclimb/data/sync/SyncService.kt @@ -595,66 +595,94 @@ class SyncService(private val context: Context, private val repository: ClimbRep repository.resetAllData() + // Filter out deleted gyms before importing + val deletedGymIds = backup.deletedItems.filter { it.type == "gym" }.map { it.id }.toSet() backup.gyms.forEach { backupGym -> try { - val gym = backupGym.toGym() - Log.d(TAG, "Importing gym: ${gym.name} (ID: ${gym.id})") - repository.insertGymWithoutSync(gym) + if (!deletedGymIds.contains(backupGym.id)) { + val gym = backupGym.toGym() + Log.d(TAG, "Importing gym: ${gym.name} (ID: ${gym.id})") + repository.insertGymWithoutSync(gym) + } else { + Log.d(TAG, "Skipping import of deleted gym: ${backupGym.id}") + } } catch (e: Exception) { Log.e(TAG, "Failed to import gym '${backupGym.name}': ${e.message}") throw e } } + // Filter out deleted problems before importing + val deletedProblemIds = + backup.deletedItems.filter { it.type == "problem" }.map { it.id }.toSet() backup.problems.forEach { backupProblem -> try { - val updatedProblem = - if (imagePathMapping.isNotEmpty()) { - val newImagePaths = - backupProblem.imagePaths?.map { oldPath -> - val filename = oldPath.substringAfterLast('/') + if (!deletedProblemIds.contains(backupProblem.id)) { + val updatedProblem = + if (imagePathMapping.isNotEmpty()) { + val newImagePaths = + backupProblem.imagePaths?.map { oldPath -> + val filename = oldPath.substringAfterLast('/') - imagePathMapping[filename] - ?: if (ImageNamingUtils.isValidImageFilename( - filename - ) - ) { - "problem_images/$filename" - } else { - val index = - backupProblem.imagePaths.indexOf( - oldPath + imagePathMapping[filename] + ?: if (ImageNamingUtils.isValidImageFilename( + filename ) - val consistentFilename = - ImageNamingUtils.generateImageFilename( - backupProblem.id, - index - ) - "problem_images/$consistentFilename" - } - } - ?: emptyList() - backupProblem.withUpdatedImagePaths(newImagePaths) - } else { - backupProblem - } - repository.insertProblemWithoutSync(updatedProblem.toProblem()) + ) { + "problem_images/$filename" + } else { + val index = + backupProblem.imagePaths.indexOf( + oldPath + ) + val consistentFilename = + ImageNamingUtils + .generateImageFilename( + backupProblem.id, + index + ) + "problem_images/$consistentFilename" + } + } + ?: emptyList() + backupProblem.withUpdatedImagePaths(newImagePaths) + } else { + backupProblem + } + repository.insertProblemWithoutSync(updatedProblem.toProblem()) + } else { + Log.d(TAG, "Skipping import of deleted problem: ${backupProblem.id}") + } } catch (e: Exception) { Log.e(TAG, "Failed to import problem '${backupProblem.name}': ${e.message}") } } + // Filter out deleted sessions before importing + val deletedSessionIds = + backup.deletedItems.filter { it.type == "session" }.map { it.id }.toSet() backup.sessions.forEach { backupSession -> try { - repository.insertSessionWithoutSync(backupSession.toClimbSession()) + if (!deletedSessionIds.contains(backupSession.id)) { + repository.insertSessionWithoutSync(backupSession.toClimbSession()) + } else { + Log.d(TAG, "Skipping import of deleted session: ${backupSession.id}") + } } catch (e: Exception) { Log.e(TAG, "Failed to import session '${backupSession.id}': ${e.message}") } } + // Filter out deleted attempts before importing + val deletedAttemptIds = + backup.deletedItems.filter { it.type == "attempt" }.map { it.id }.toSet() backup.attempts.forEach { backupAttempt -> try { - repository.insertAttemptWithoutSync(backupAttempt.toAttempt()) + if (!deletedAttemptIds.contains(backupAttempt.id)) { + repository.insertAttemptWithoutSync(backupAttempt.toAttempt()) + } else { + Log.d(TAG, "Skipping import of deleted attempt: ${backupAttempt.id}") + } } catch (e: Exception) { Log.e(TAG, "Failed to import attempt '${backupAttempt.id}': ${e.message}") } @@ -678,6 +706,19 @@ class SyncService(private val context: Context, private val repository: ClimbRep } } + // Import deletion records to prevent future resurrections + backup.deletedItems.forEach { deletion -> + try { + val deletionJson = json.encodeToString(deletion) + val preferences = + context.getSharedPreferences("deleted_items", Context.MODE_PRIVATE) + preferences.edit { putString("deleted_${deletion.id}", deletionJson) } + Log.d(TAG, "Imported deletion record: ${deletion.type} ${deletion.id}") + } catch (e: Exception) { + Log.e(TAG, "Failed to import deletion record: ${e.message}") + } + } + dataStateManager.setLastModified(backup.exportedAt) Log.d(TAG, "Data state synchronized to imported timestamp: ${backup.exportedAt}") } @@ -694,10 +735,27 @@ class SyncService(private val context: Context, private val repository: ClimbRep val localSessions = repository.getAllSessions().first() val localAttempts = repository.getAllAttempts().first() - // Store active sessions before clearing - val activeSessions = localSessions.filter { it.status == SessionStatus.ACTIVE } + // Store active sessions before clearing (but exclude any that were deleted) + val localDeletedItems = repository.getDeletedItems() + val allDeletedSessionIds = + (serverBackup.deletedItems + localDeletedItems) + .filter { it.type == "session" } + .map { it.id } + .toSet() + val activeSessions = + localSessions.filter { + it.status == SessionStatus.ACTIVE && !allDeletedSessionIds.contains(it.id) + } val activeSessionIds = activeSessions.map { it.id }.toSet() - val activeAttempts = localAttempts.filter { activeSessionIds.contains(it.sessionId) } + val allDeletedAttemptIds = + (serverBackup.deletedItems + localDeletedItems) + .filter { it.type == "attempt" } + .map { it.id } + .toSet() + val activeAttempts = + localAttempts.filter { + activeSessionIds.contains(it.sessionId) && !allDeletedAttemptIds.contains(it.id) + } Log.d(TAG, "Merging data...") val mergedGyms = mergeGyms(localGyms, serverBackup.gyms, serverBackup.deletedItems) @@ -772,9 +830,15 @@ class SyncService(private val context: Context, private val repository: ClimbRep // Clear and update local deletions with merged list repository.clearDeletedItems() allDeletions.forEach { deletion -> - // Re-add merged deletions to local store - // Note: This is a simplified approach - in production you might want a more - // sophisticated merge + try { + val deletionJson = json.encodeToString(deletion) + val preferences = + context.getSharedPreferences("deleted_items", Context.MODE_PRIVATE) + preferences.edit { putString("deleted_${deletion.id}", deletionJson) } + Log.d(TAG, "Merged deletion record: ${deletion.type} ${deletion.id}") + } catch (e: Exception) { + Log.e(TAG, "Failed to save merged deletion: ${e.message}") + } } // Upload merged data back to server diff --git a/ios/OpenClimb.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate b/ios/OpenClimb.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate index fd78c73a7ff56bfae21d305b8ee5e841d3c5a3b3..1879d69ac55e1cb2a9802c33d5d4940214975f50 100644 GIT binary patch delta 35691 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 F_ [Attempt] {