From a19ff8ef664959346a597c3e926a360933c6682c Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Mon, 6 Oct 2025 17:38:19 -0600 Subject: [PATCH] [iOS & Android] iOS 1.2.5 & Android 1.7.4 [Sync] Sync 1.1.0 --- android/app/build.gradle.kts | 4 +- .../openclimb/data/format/BackupFormat.kt | 10 +- .../data/repository/ClimbRepository.kt | 46 +++- .../openclimb/data/sync/SyncService.kt | 258 ++++++++++++++++-- ios/OpenClimb.xcodeproj/project.pbxproj | 16 +- .../UserInterfaceState.xcuserstate | Bin 133094 -> 135844 bytes ios/OpenClimb/ContentView.swift | 4 +- ios/OpenClimb/Models/BackupFormat.swift | 19 +- ios/OpenClimb/Services/SyncService.swift | 258 +++++++++++++++--- .../ViewModels/ClimbingDataManager.swift | 41 ++- sync/main.go | 8 + sync/version.md | 2 +- 12 files changed, 583 insertions(+), 83 deletions(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 4e36638..ccb7b66 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -16,8 +16,8 @@ android { applicationId = "com.atridad.openclimb" minSdk = 31 targetSdk = 36 - versionCode = 32 - versionName = "1.7.3" + versionCode = 33 + versionName = "1.7.4" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/android/app/src/main/java/com/atridad/openclimb/data/format/BackupFormat.kt b/android/app/src/main/java/com/atridad/openclimb/data/format/BackupFormat.kt index a7a0b19..fc3299c 100644 --- a/android/app/src/main/java/com/atridad/openclimb/data/format/BackupFormat.kt +++ b/android/app/src/main/java/com/atridad/openclimb/data/format/BackupFormat.kt @@ -12,7 +12,15 @@ data class ClimbDataBackup( val gyms: List, val problems: List, val sessions: List, - val attempts: List + val attempts: List, + val deletedItems: List = emptyList() +) + +@Serializable +data class DeletedItem( + val id: String, + val type: String, // "gym", "problem", "session", "attempt" + val deletedAt: String ) // Platform-neutral gym representation for backup/restore diff --git a/android/app/src/main/java/com/atridad/openclimb/data/repository/ClimbRepository.kt b/android/app/src/main/java/com/atridad/openclimb/data/repository/ClimbRepository.kt index 0dc748b..a83318c 100644 --- a/android/app/src/main/java/com/atridad/openclimb/data/repository/ClimbRepository.kt +++ b/android/app/src/main/java/com/atridad/openclimb/data/repository/ClimbRepository.kt @@ -1,12 +1,15 @@ package com.atridad.openclimb.data.repository import android.content.Context +import android.content.SharedPreferences +import androidx.core.content.edit import com.atridad.openclimb.data.database.OpenClimbDatabase import com.atridad.openclimb.data.format.BackupAttempt import com.atridad.openclimb.data.format.BackupClimbSession import com.atridad.openclimb.data.format.BackupGym import com.atridad.openclimb.data.format.BackupProblem import com.atridad.openclimb.data.format.ClimbDataBackup +import com.atridad.openclimb.data.format.DeletedItem import com.atridad.openclimb.data.model.* import com.atridad.openclimb.data.state.DataStateManager import com.atridad.openclimb.utils.DateFormatUtils @@ -14,6 +17,8 @@ import com.atridad.openclimb.utils.ZipExportImportUtils import java.io.File import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json class ClimbRepository(database: OpenClimbDatabase, private val context: Context) { @@ -22,6 +27,8 @@ class ClimbRepository(database: OpenClimbDatabase, private val context: Context) private val sessionDao = database.climbSessionDao() private val attemptDao = database.attemptDao() private val dataStateManager = DataStateManager(context) + private val deletionPreferences: SharedPreferences = + context.getSharedPreferences("deleted_items", Context.MODE_PRIVATE) private var autoSyncCallback: (() -> Unit)? = null @@ -45,6 +52,7 @@ class ClimbRepository(database: OpenClimbDatabase, private val context: Context) } suspend fun deleteGym(gym: Gym) { gymDao.deleteGym(gym) + trackDeletion(gym.id, "gym") dataStateManager.updateDataState() triggerAutoSync() } @@ -56,17 +64,15 @@ class ClimbRepository(database: OpenClimbDatabase, private val context: Context) suspend fun insertProblem(problem: Problem) { problemDao.insertProblem(problem) dataStateManager.updateDataState() - triggerAutoSync() } suspend fun updateProblem(problem: Problem) { problemDao.updateProblem(problem) dataStateManager.updateDataState() - triggerAutoSync() } suspend fun deleteProblem(problem: Problem) { problemDao.deleteProblem(problem) + trackDeletion(problem.id, "problem") dataStateManager.updateDataState() - triggerAutoSync() } // Session operations @@ -94,6 +100,7 @@ class ClimbRepository(database: OpenClimbDatabase, private val context: Context) } suspend fun deleteSession(session: ClimbSession) { sessionDao.deleteSession(session) + trackDeletion(session.id, "session") dataStateManager.updateDataState() triggerAutoSync() } @@ -122,6 +129,7 @@ class ClimbRepository(database: OpenClimbDatabase, private val context: Context) } suspend fun deleteAttempt(attempt: Attempt) { attemptDao.deleteAttempt(attempt) + trackDeletion(attempt.id, "attempt") dataStateManager.updateDataState() } @@ -261,6 +269,38 @@ class ClimbRepository(database: OpenClimbDatabase, private val context: Context) autoSyncCallback?.invoke() } + private fun trackDeletion(itemId: String, itemType: String) { + val currentDeletions = getDeletedItems().toMutableList() + val newDeletion = + DeletedItem(id = itemId, type = itemType, deletedAt = DateFormatUtils.nowISO8601()) + currentDeletions.add(newDeletion) + + val json = json.encodeToString(newDeletion) + deletionPreferences.edit { putString("deleted_${itemId}", json) } + } + + fun getDeletedItems(): List { + val deletions = mutableListOf() + val allPrefs = deletionPreferences.all + + for ((key, value) in allPrefs) { + if (key.startsWith("deleted_") && value is String) { + try { + val deletion = json.decodeFromString(value) + deletions.add(deletion) + } catch (e: Exception) { + // Invalid deletion record, ignore + } + } + } + + return deletions + } + + fun clearDeletedItems() { + deletionPreferences.edit { clear() } + } + private fun validateDataIntegrity( gyms: List, problems: List, 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 f3856c5..22e3752 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 @@ -9,7 +9,12 @@ import com.atridad.openclimb.data.format.BackupClimbSession import com.atridad.openclimb.data.format.BackupGym import com.atridad.openclimb.data.format.BackupProblem import com.atridad.openclimb.data.format.ClimbDataBackup +import com.atridad.openclimb.data.format.DeletedItem import com.atridad.openclimb.data.migration.ImageMigrationService +import com.atridad.openclimb.data.model.Attempt +import com.atridad.openclimb.data.model.ClimbSession +import com.atridad.openclimb.data.model.Gym +import com.atridad.openclimb.data.model.Problem import com.atridad.openclimb.data.model.SessionStatus import com.atridad.openclimb.data.repository.ClimbRepository import com.atridad.openclimb.data.state.DataStateManager @@ -382,27 +387,9 @@ class SyncService(private val context: Context, private val repository: ClimbRep Log.d(TAG, "Initial upload completed") } hasLocalData && hasServerData -> { - val localTimestamp = parseISO8601ToMillis(localBackup.exportedAt) - val serverTimestamp = parseISO8601ToMillis(serverBackup.exportedAt) - - Log.d( - TAG, - "Comparing timestamps: local=$localTimestamp, server=$serverTimestamp" - ) - - if (localTimestamp > serverTimestamp) { - Log.d(TAG, "Local data is newer, replacing server content") - uploadData(localBackup) - syncImagesForBackup(localBackup) - Log.d(TAG, "Server replaced with local data") - } else if (serverTimestamp > localTimestamp) { - Log.d(TAG, "Server data is newer, replacing local content") - val imagePathMapping = syncImagesFromServer(serverBackup) - importBackupToRepository(serverBackup, imagePathMapping) - Log.d(TAG, "Local data replaced with server data") - } else { - Log.d(TAG, "Data is in sync (timestamps equal), no action needed") - } + Log.d(TAG, "Both local and server data exist, merging safely") + mergeDataSafely(localBackup, serverBackup) + Log.d(TAG, "Safe merge completed") } else -> { Log.d(TAG, "No data to sync") @@ -583,7 +570,8 @@ class SyncService(private val context: Context, private val repository: ClimbRep gyms = allGyms.map { BackupGym.fromGym(it) }, problems = allProblems.map { BackupProblem.fromProblem(it) }, sessions = completedSessions.map { BackupClimbSession.fromClimbSession(it) }, - attempts = completedAttempts.map { BackupAttempt.fromAttempt(it) } + attempts = completedAttempts.map { BackupAttempt.fromAttempt(it) }, + deletedItems = repository.getDeletedItems() ) } @@ -694,6 +682,232 @@ class SyncService(private val context: Context, private val repository: ClimbRep Log.d(TAG, "Data state synchronized to imported timestamp: ${backup.exportedAt}") } + private suspend fun mergeDataSafely( + localBackup: ClimbDataBackup, + serverBackup: ClimbDataBackup + ) { + val imagePathMapping = syncImagesFromServer(serverBackup) + + // Get all local data + val localGyms = repository.getAllGyms().first() + val localProblems = repository.getAllProblems().first() + val localSessions = repository.getAllSessions().first() + val localAttempts = repository.getAllAttempts().first() + + // Store active sessions before clearing + val activeSessions = localSessions.filter { it.status == SessionStatus.ACTIVE } + val activeSessionIds = activeSessions.map { it.id }.toSet() + val activeAttempts = localAttempts.filter { activeSessionIds.contains(it.sessionId) } + + Log.d(TAG, "Merging data...") + val mergedGyms = mergeGyms(localGyms, serverBackup.gyms, serverBackup.deletedItems) + val mergedProblems = + mergeProblems( + localProblems, + serverBackup.problems, + imagePathMapping, + serverBackup.deletedItems + ) + val mergedSessions = + mergeSessions(localSessions, serverBackup.sessions, serverBackup.deletedItems) + val mergedAttempts = + mergeAttempts(localAttempts, serverBackup.attempts, serverBackup.deletedItems) + + // Clear and repopulate with merged data + repository.resetAllData() + + mergedGyms.forEach { gym -> + try { + repository.insertGymWithoutSync(gym) + } catch (e: Exception) { + Log.e(TAG, "Failed to insert merged gym: ${e.message}") + } + } + + mergedProblems.forEach { problem -> + try { + repository.insertProblemWithoutSync(problem) + } catch (e: Exception) { + Log.e(TAG, "Failed to insert merged problem: ${e.message}") + } + } + + mergedSessions.forEach { session -> + try { + repository.insertSessionWithoutSync(session) + } catch (e: Exception) { + Log.e(TAG, "Failed to insert merged session: ${e.message}") + } + } + + mergedAttempts.forEach { attempt -> + try { + repository.insertAttemptWithoutSync(attempt) + } catch (e: Exception) { + Log.e(TAG, "Failed to insert merged attempt: ${e.message}") + } + } + + // Restore active sessions + activeSessions.forEach { session -> + try { + repository.insertSessionWithoutSync(session) + } catch (e: Exception) { + Log.e(TAG, "Failed to restore active session: ${e.message}") + } + } + + activeAttempts.forEach { attempt -> + try { + repository.insertAttemptWithoutSync(attempt) + } catch (e: Exception) { + Log.e(TAG, "Failed to restore active attempt: ${e.message}") + } + } + + // Merge deletion lists + val localDeletions = repository.getDeletedItems() + val allDeletions = (localDeletions + serverBackup.deletedItems).distinctBy { it.id } + + // 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 + } + + // Upload merged data back to server + val mergedBackup = createBackupFromRepository() + uploadData(mergedBackup) + syncImagesForBackup(mergedBackup) + + dataStateManager.updateDataState() + } + + private fun mergeGyms( + local: List, + server: List, + deletedItems: List + ): List { + val merged = local.toMutableList() + val localIds = local.map { it.id }.toSet() + val deletedGymIds = deletedItems.filter { it.type == "gym" }.map { it.id }.toSet() + + // Remove items that were deleted on other devices + merged.removeAll { deletedGymIds.contains(it.id) } + + // Add new items from server (excluding deleted ones) + server.forEach { serverGym -> + if (!localIds.contains(serverGym.id) && !deletedGymIds.contains(serverGym.id)) { + try { + merged.add(serverGym.toGym()) + } catch (e: Exception) { + Log.e(TAG, "Failed to convert server gym: ${e.message}") + } + } + } + + return merged + } + + private fun mergeProblems( + local: List, + server: List, + imagePathMapping: Map, + deletedItems: List + ): List { + val merged = local.toMutableList() + val localIds = local.map { it.id }.toSet() + val deletedProblemIds = deletedItems.filter { it.type == "problem" }.map { it.id }.toSet() + + // Remove items that were deleted on other devices + merged.removeAll { deletedProblemIds.contains(it.id) } + + // Add new items from server (excluding deleted ones) + server.forEach { serverProblem -> + if (!localIds.contains(serverProblem.id) && + !deletedProblemIds.contains(serverProblem.id) + ) { + try { + val problemToAdd = + if (imagePathMapping.isNotEmpty()) { + val newImagePaths = + serverProblem.imagePaths?.map { oldPath -> + val filename = oldPath.substringAfterLast('/') + imagePathMapping[filename] ?: oldPath + } + ?: emptyList() + serverProblem.withUpdatedImagePaths(newImagePaths) + } else { + serverProblem + } + merged.add(problemToAdd.toProblem()) + } catch (e: Exception) { + Log.e(TAG, "Failed to convert server problem: ${e.message}") + } + } + } + + return merged + } + + private fun mergeSessions( + local: List, + server: List, + deletedItems: List + ): List { + val merged = local.toMutableList() + val localIds = local.map { it.id }.toSet() + val deletedSessionIds = deletedItems.filter { it.type == "session" }.map { it.id }.toSet() + + // Remove items that were deleted on other devices (but never remove active sessions) + merged.removeAll { deletedSessionIds.contains(it.id) && it.status != SessionStatus.ACTIVE } + + // Add new items from server (excluding deleted ones) + server.forEach { serverSession -> + if (!localIds.contains(serverSession.id) && + !deletedSessionIds.contains(serverSession.id) + ) { + try { + merged.add(serverSession.toClimbSession()) + } catch (e: Exception) { + Log.e(TAG, "Failed to convert server session: ${e.message}") + } + } + } + + return merged + } + + private fun mergeAttempts( + local: List, + server: List, + deletedItems: List + ): List { + val merged = local.toMutableList() + val localIds = local.map { it.id }.toSet() + val deletedAttemptIds = deletedItems.filter { it.type == "attempt" }.map { it.id }.toSet() + + // Remove items that were deleted on other devices (but be conservative with attempts) + merged.removeAll { deletedAttemptIds.contains(it.id) } + + // Add new items from server (excluding deleted ones) + server.forEach { serverAttempt -> + if (!localIds.contains(serverAttempt.id) && + !deletedAttemptIds.contains(serverAttempt.id) + ) { + try { + merged.add(serverAttempt.toAttempt()) + } catch (e: Exception) { + Log.e(TAG, "Failed to convert server attempt: ${e.message}") + } + } + } + + return merged + } + /** Parses ISO8601 timestamp to milliseconds for comparison */ private fun parseISO8601ToMillis(timestamp: String): Long { return try { diff --git a/ios/OpenClimb.xcodeproj/project.pbxproj b/ios/OpenClimb.xcodeproj/project.pbxproj index 93a7176..30fa4de 100644 --- a/ios/OpenClimb.xcodeproj/project.pbxproj +++ b/ios/OpenClimb.xcodeproj/project.pbxproj @@ -465,7 +465,7 @@ CODE_SIGN_ENTITLEMENTS = OpenClimb/OpenClimb.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 16; DEVELOPMENT_TEAM = 4BC9Y2LL4B; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -485,7 +485,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.4; + MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.OpenClimb; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -508,7 +508,7 @@ CODE_SIGN_ENTITLEMENTS = OpenClimb/OpenClimb.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 16; DEVELOPMENT_TEAM = 4BC9Y2LL4B; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; @@ -528,7 +528,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.2.4; + MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.OpenClimb; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -592,7 +592,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 16; DEVELOPMENT_TEAM = 4BC9Y2LL4B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SessionStatusLive/Info.plist; @@ -603,7 +603,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.4; + MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.OpenClimb.SessionStatusLive; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -622,7 +622,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 15; + CURRENT_PROJECT_VERSION = 16; DEVELOPMENT_TEAM = 4BC9Y2LL4B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SessionStatusLive/Info.plist; @@ -633,7 +633,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.2.4; + MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.OpenClimb.SessionStatusLive; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; 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 a1aaa33b7af7f9b023644289d1572f46fdf85542..fd78c73a7ff56bfae21d305b8ee5e841d3c5a3b3 100644 GIT binary patch literal 135844 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

bSJQW(;?nTWzJ4&j^NSZ_uH@vZna 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
(f8AG9?A`!c*} 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

\(localTimestamp)") - print(" Server exportedAt: '\(serverBackup.exportedAt)' -> \(serverTimestamp)") - print( - " DataStateManager last modified: '\(DataStateManager.shared.getLastModified())'" - ) - print(" Comparison result: local=\(localTimestamp), server=\(serverTimestamp)") - - if localTimestamp > serverTimestamp { - // Local is newer - replace server with local data - print("iOS SYNC: Case 3a - Local data is newer, replacing server content") - let currentBackup = createBackupFromDataManager(dataManager) - _ = try await uploadData(currentBackup) - try await syncImagesToServer(dataManager: dataManager) - print("Server replaced with local data") - } else if serverTimestamp > localTimestamp { - // Server is newer - replace local with server data - print("iOS SYNC: Case 3b - Server data is newer, replacing local content") - let imagePathMapping = try await syncImagesFromServer( - backup: serverBackup, dataManager: dataManager) - try importBackupToDataManager( - serverBackup, dataManager: dataManager, imagePathMapping: imagePathMapping) - print("Local data replaced with server data") - } else { - // Timestamps are equal - no sync needed - print( - "iOS SYNC: Case 3c - Data is in sync (timestamps equal), no action needed" - ) - } + // Case 3: Both have data - use safe merge strategy + print("iOS SYNC: Case 3 - Merging local and server data safely") + try await mergeDataSafely( + localBackup: localBackup, + serverBackup: serverBackup, + dataManager: dataManager) + print("Safe merge completed") } else { print("No data to sync") } @@ -413,16 +387,84 @@ class SyncService: ObservableObject { gyms: dataManager.gyms.map { BackupGym(from: $0) }, problems: dataManager.problems.map { BackupProblem(from: $0) }, sessions: completedSessions.map { BackupClimbSession(from: $0) }, - attempts: completedAttempts.map { BackupAttempt(from: $0) } + attempts: completedAttempts.map { BackupAttempt(from: $0) }, + deletedItems: dataManager.getDeletedItems() ) } + private func mergeDataSafely( + localBackup: ClimbDataBackup, + serverBackup: ClimbDataBackup, + dataManager: ClimbingDataManager + ) async throws { + // Download server images first + let imagePathMapping = try await syncImagesFromServer( + backup: serverBackup, dataManager: dataManager) + + // Merge data additively - never remove existing local data + print("Merging gyms...") + let mergedGyms = mergeGyms( + local: dataManager.gyms, + server: serverBackup.gyms, + deletedItems: serverBackup.deletedItems) + + print("Merging problems...") + let mergedProblems = try mergeProblems( + local: dataManager.problems, + server: serverBackup.problems, + imagePathMapping: imagePathMapping, + deletedItems: serverBackup.deletedItems) + + print("Merging sessions...") + let mergedSessions = try mergeSessions( + local: dataManager.sessions, + server: serverBackup.sessions, + deletedItems: serverBackup.deletedItems) + + print("Merging attempts...") + let mergedAttempts = try mergeAttempts( + local: dataManager.attempts, + server: serverBackup.attempts, + deletedItems: serverBackup.deletedItems) + + // Update data manager with merged data + dataManager.gyms = mergedGyms + dataManager.problems = mergedProblems + dataManager.sessions = mergedSessions + dataManager.attempts = mergedAttempts + + // Save all data + dataManager.saveGyms() + dataManager.saveProblems() + dataManager.saveSessions() + dataManager.saveAttempts() + dataManager.saveActiveSession() + + // Merge deletion lists + let localDeletions = dataManager.getDeletedItems() + let allDeletions = localDeletions + serverBackup.deletedItems + let uniqueDeletions = Array(Set(allDeletions)) + + // Update local deletions with merged list + dataManager.clearDeletedItems() + if let data = try? JSONEncoder().encode(uniqueDeletions) { + UserDefaults.standard.set(data, forKey: "openclimb_deleted_items") + } + + // Upload merged data back to server + let mergedBackup = createBackupFromDataManager(dataManager) + _ = try await uploadData(mergedBackup) + try await syncImagesToServer(dataManager: dataManager) + + // Update timestamp + DataStateManager.shared.updateDataState() + } + private func importBackupToDataManager( _ backup: ClimbDataBackup, dataManager: ClimbingDataManager, imagePathMapping: [String: String] = [:] ) throws { do { - // Store active sessions and their attempts before import let activeSessions = dataManager.sessions.filter { $0.status == .active } let activeSessionIds = Set(activeSessions.map { $0.id }) @@ -501,7 +543,6 @@ class SyncService: ObservableObject { print("Data state synchronized to imported timestamp: \(backup.exportedAt)") } catch { - throw SyncError.importFailed(error) } } @@ -817,6 +858,151 @@ class SyncService: ObservableObject { userDefaults.removeObject(forKey: Keys.isConnected) userDefaults.removeObject(forKey: Keys.autoSyncEnabled) } + + // MARK: - Safe Merge Functions + + private func mergeGyms(local: [Gym], server: [BackupGym], deletedItems: [DeletedItem]) -> [Gym] + { + var merged = local + let deletedGymIds = Set(deletedItems.filter { $0.type == "gym" }.map { $0.id }) + + // Remove items that were deleted on other devices + merged.removeAll { deletedGymIds.contains($0.id.uuidString) } + + // Add new items from server (excluding deleted ones) + for serverGym in server { + if let serverGymConverted = try? serverGym.toGym() { + let localHasGym = local.contains(where: { $0.id.uuidString == serverGym.id }) + let isDeleted = deletedGymIds.contains(serverGym.id) + + if !localHasGym && !isDeleted { + merged.append(serverGymConverted) + } + } + } + + return merged + } + + private func mergeProblems( + local: [Problem], + server: [BackupProblem], + imagePathMapping: [String: String], + deletedItems: [DeletedItem] + ) throws -> [Problem] { + var merged = local + let deletedProblemIds = Set(deletedItems.filter { $0.type == "problem" }.map { $0.id }) + + // Remove items that were deleted on other devices + merged.removeAll { deletedProblemIds.contains($0.id.uuidString) } + + // Add new items from server (excluding deleted ones) + for serverProblem in server { + var problemToAdd = serverProblem + + // Update image paths if needed + if !imagePathMapping.isEmpty { + let updatedImagePaths = serverProblem.imagePaths?.compactMap { oldPath in + imagePathMapping[oldPath] ?? oldPath + } + problemToAdd = BackupProblem( + id: serverProblem.id, + gymId: serverProblem.gymId, + name: serverProblem.name, + description: serverProblem.description, + climbType: serverProblem.climbType, + difficulty: serverProblem.difficulty, + tags: serverProblem.tags, + location: serverProblem.location, + imagePaths: updatedImagePaths, + isActive: serverProblem.isActive, + dateSet: serverProblem.dateSet, + notes: serverProblem.notes, + createdAt: serverProblem.createdAt, + updatedAt: serverProblem.updatedAt + ) + } + + if let serverProblemConverted = try? problemToAdd.toProblem() { + let localHasProblem = local.contains(where: { $0.id.uuidString == problemToAdd.id }) + let isDeleted = deletedProblemIds.contains(problemToAdd.id) + + if !localHasProblem && !isDeleted { + merged.append(serverProblemConverted) + } + } + } + + return merged + } + + private func mergeSessions( + local: [ClimbSession], server: [BackupClimbSession], deletedItems: [DeletedItem] + ) throws + -> [ClimbSession] + { + var merged = local + let deletedSessionIds = Set(deletedItems.filter { $0.type == "session" }.map { $0.id }) + + // Remove items that were deleted on other devices (but never remove active sessions) + merged.removeAll { session in + deletedSessionIds.contains(session.id.uuidString) && session.status != .active + } + + // Add new items from server (excluding deleted ones) + for serverSession in server { + if let serverSessionConverted = try? serverSession.toClimbSession() { + let localHasSession = local.contains(where: { $0.id.uuidString == serverSession.id } + ) + let isDeleted = deletedSessionIds.contains(serverSession.id) + + if !localHasSession && !isDeleted { + merged.append(serverSessionConverted) + } + } + } + + return merged + } + + private func mergeAttempts( + local: [Attempt], server: [BackupAttempt], deletedItems: [DeletedItem] + ) throws -> [Attempt] { + var merged = local + let deletedAttemptIds = Set(deletedItems.filter { $0.type == "attempt" }.map { $0.id }) + + // Get active session IDs to protect their attempts + let activeSessionIds = Set( + local.compactMap { attempt in + // This is a simplified check - in a real implementation you'd want to cross-reference with sessions + return attempt.sessionId + }.filter { sessionId in + // Check if this session ID belongs to an active session + // For now, we'll be conservative and not delete attempts during merge + return true + }) + + // Remove items that were deleted on other devices (but be conservative with attempts) + merged.removeAll { attempt in + deletedAttemptIds.contains(attempt.id.uuidString) + && !activeSessionIds.contains(attempt.sessionId) + } + + // Add new items from server (excluding deleted ones) + for serverAttempt in server { + if let serverAttemptConverted = try? serverAttempt.toAttempt() { + let localHasAttempt = local.contains(where: { $0.id.uuidString == serverAttempt.id } + ) + let isDeleted = deletedAttemptIds.contains(serverAttempt.id) + + if !localHasAttempt && !isDeleted { + merged.append(serverAttemptConverted) + } + } + } + + return merged + } } enum SyncError: LocalizedError { diff --git a/ios/OpenClimb/ViewModels/ClimbingDataManager.swift b/ios/OpenClimb/ViewModels/ClimbingDataManager.swift index b35b34f..68f42f6 100644 --- a/ios/OpenClimb/ViewModels/ClimbingDataManager.swift +++ b/ios/OpenClimb/ViewModels/ClimbingDataManager.swift @@ -41,6 +41,7 @@ class ClimbingDataManager: ObservableObject { static let sessions = "openclimb_sessions" static let attempts = "openclimb_attempts" static let activeSession = "openclimb_active_session" + static let deletedItems = "openclimb_deleted_items" } // Widget data models @@ -137,7 +138,7 @@ class ClimbingDataManager: ObservableObject { } } - private func saveGyms() { + internal func saveGyms() { if let data = try? encoder.encode(gyms) { userDefaults.set(data, forKey: Keys.gyms) // Share with widget - convert to widget format @@ -150,7 +151,7 @@ class ClimbingDataManager: ObservableObject { } } - private func saveProblems() { + internal func saveProblems() { if let data = try? encoder.encode(problems) { userDefaults.set(data, forKey: Keys.problems) // Share with widget @@ -246,6 +247,7 @@ class ClimbingDataManager: ObservableObject { // Delete the gym gyms.removeAll { $0.id == gym.id } + trackDeletion(itemId: gym.id.uuidString, itemType: "gym") saveGyms() DataStateManager.shared.updateDataState() successMessage = "Gym deleted successfully" @@ -293,6 +295,7 @@ class ClimbingDataManager: ObservableObject { // Delete the problem problems.removeAll { $0.id == problem.id } + trackDeletion(itemId: problem.id.uuidString, itemType: "problem") saveProblems() DataStateManager.shared.updateDataState() @@ -396,6 +399,7 @@ class ClimbingDataManager: ObservableObject { // Delete the session sessions.removeAll { $0.id == session.id } + trackDeletion(itemId: session.id.uuidString, itemType: "session") saveSessions() DataStateManager.shared.updateDataState() @@ -442,17 +446,50 @@ class ClimbingDataManager: ObservableObject { func deleteAttempt(_ attempt: Attempt) { attempts.removeAll { $0.id == attempt.id } + trackDeletion(itemId: attempt.id.uuidString, itemType: "attempt") saveAttempts() DataStateManager.shared.updateDataState() // Update Live Activity when attempt is deleted updateLiveActivityForActiveSession() + + // Note: Attempts for active sessions are not synced until session is completed } func attempts(forSession sessionId: UUID) -> [Attempt] { return attempts.filter { $0.sessionId == sessionId }.sorted { $0.timestamp < $1.timestamp } } + // MARK: - Deletion Tracking + + private func trackDeletion(itemId: String, itemType: String) { + let deletion = DeletedItem( + id: itemId, + type: itemType, + deletedAt: ISO8601DateFormatter().string(from: Date()) + ) + + var currentDeletions = getDeletedItems() + currentDeletions.append(deletion) + + if let data = try? encoder.encode(currentDeletions) { + userDefaults.set(data, forKey: Keys.deletedItems) + } + } + + func getDeletedItems() -> [DeletedItem] { + guard let data = userDefaults.data(forKey: Keys.deletedItems), + let deletions = try? decoder.decode([DeletedItem].self, from: data) + else { + return [] + } + return deletions + } + + func clearDeletedItems() { + userDefaults.removeObject(forKey: Keys.deletedItems) + } + func attempts(forProblem problemId: UUID) -> [Attempt] { return attempts.filter { $0.problemId == problemId }.sorted { $0.timestamp > $1.timestamp } } diff --git a/sync/main.go b/sync/main.go index 7034a3f..4fe0ca3 100644 --- a/sync/main.go +++ b/sync/main.go @@ -20,6 +20,12 @@ func min(a, b int) int { return b } +type DeletedItem struct { + ID string `json:"id"` + Type string `json:"type"` + DeletedAt string `json:"deletedAt"` +} + type ClimbDataBackup struct { ExportedAt string `json:"exportedAt"` Version string `json:"version"` @@ -28,6 +34,7 @@ type ClimbDataBackup struct { Problems []BackupProblem `json:"problems"` Sessions []BackupClimbSession `json:"sessions"` Attempts []BackupAttempt `json:"attempts"` + DeletedItems []DeletedItem `json:"deletedItems"` } type BackupGym struct { @@ -120,6 +127,7 @@ func (s *SyncServer) loadData() (*ClimbDataBackup, error) { Problems: []BackupProblem{}, Sessions: []BackupClimbSession{}, Attempts: []BackupAttempt{}, + DeletedItems: []DeletedItem{}, }, nil } diff --git a/sync/version.md b/sync/version.md index 3eefcb9..9084fa2 100644 --- a/sync/version.md +++ b/sync/version.md @@ -1 +1 @@ -1.0.0 +1.1.0