From f4f496843104c4defa2813111b09fb80d338f9fd Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Fri, 9 Jan 2026 22:48:20 -0700 Subject: [PATCH] Sync bug fixes across the board! --- android/app/build.gradle.kts | 4 +- .../ascently/data/format/BackupFormat.kt | 77 +- .../data/repository/ClimbRepository.kt | 30 +- .../data/sync/AscentlySyncProvider.kt | 966 ++++++++---------- .../ascently/data/sync/DeltaSyncModels.kt | 4 +- .../ascently/data/sync/SyncException.kt | 2 + .../atridad/ascently/data/sync/SyncService.kt | 3 +- ios/Ascently.xcodeproj/project.pbxproj | 8 +- .../UserInterfaceState.xcuserstate | Bin 310210 -> 315715 bytes ios/Ascently/Models/BackupFormat.swift | 2 +- ios/Ascently/Models/DeltaSyncFormat.swift | 1 + .../Services/Sync/ServerSyncProvider.swift | 38 +- ios/Ascently/Services/Sync/SyncMerger.swift | 179 ---- .../ViewModels/ClimbingDataManager.swift | 29 + sync/go.mod | 2 + sync/go.sum | 2 + sync/main.go | 124 ++- sync/sync_test.go | 501 --------- 18 files changed, 703 insertions(+), 1269 deletions(-) delete mode 100644 ios/Ascently/Services/Sync/SyncMerger.swift create mode 100644 sync/go.sum delete mode 100644 sync/sync_test.go diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index be65167..b400b93 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -18,8 +18,8 @@ android { applicationId = "com.atridad.ascently" minSdk = 31 targetSdk = 36 - versionCode = 50 - versionName = "2.5.0" + versionCode = 51 + versionName = "2.5.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/android/app/src/main/java/com/atridad/ascently/data/format/BackupFormat.kt b/android/app/src/main/java/com/atridad/ascently/data/format/BackupFormat.kt index 988d1cc..83bf34a 100644 --- a/android/app/src/main/java/com/atridad/ascently/data/format/BackupFormat.kt +++ b/android/app/src/main/java/com/atridad/ascently/data/format/BackupFormat.kt @@ -13,7 +13,6 @@ data class ClimbDataBackup( val problems: List, val sessions: List, val attempts: List, - val deletedItems: List = emptyList(), ) @Serializable @@ -34,6 +33,7 @@ data class BackupGym( @kotlinx.serialization.SerialName("customDifficultyGrades") val customDifficultyGrades: List? = null, val notes: String? = null, + val isDeleted: Boolean = false, val createdAt: String, val updatedAt: String, ) { @@ -47,10 +47,26 @@ data class BackupGym( difficultySystems = gym.difficultySystems, customDifficultyGrades = gym.customDifficultyGrades.ifEmpty { null }, notes = gym.notes, + isDeleted = false, createdAt = gym.createdAt, updatedAt = gym.updatedAt, ) } + + fun createTombstone(id: String, deletedAt: String): BackupGym { + return BackupGym( + id = id, + name = "DELETED", + location = null, + supportedClimbTypes = emptyList(), + difficultySystems = emptyList(), + customDifficultyGrades = null, + notes = null, + isDeleted = true, + createdAt = deletedAt, + updatedAt = deletedAt, + ) + } } fun toGym(): Gym { @@ -83,6 +99,7 @@ data class BackupProblem( val isActive: Boolean = true, val dateSet: String? = null, val notes: String? = null, + val isDeleted: Boolean = false, val createdAt: String, val updatedAt: String, ) { @@ -106,10 +123,31 @@ data class BackupProblem( isActive = problem.isActive, dateSet = problem.dateSet, notes = problem.notes, + isDeleted = false, createdAt = problem.createdAt, updatedAt = problem.updatedAt, ) } + + fun createTombstone(id: String, deletedAt: String): BackupProblem { + return BackupProblem( + id = id, + gymId = "00000000-0000-0000-0000-000000000000", + name = "DELETED", + description = null, + climbType = ClimbType.values().first(), + difficulty = DifficultyGrade(DifficultySystem.values().first(), "0"), + tags = null, + location = null, + imagePaths = null, + isActive = false, + dateSet = null, + notes = null, + isDeleted = true, + createdAt = deletedAt, + updatedAt = deletedAt, + ) + } } fun toProblem(): Problem { @@ -147,6 +185,7 @@ data class BackupClimbSession( val duration: Long? = null, val status: SessionStatus, val notes: String? = null, + val isDeleted: Boolean = false, val createdAt: String, val updatedAt: String, ) { @@ -161,10 +200,27 @@ data class BackupClimbSession( duration = session.duration, status = session.status, notes = session.notes, + isDeleted = false, createdAt = session.createdAt, updatedAt = session.updatedAt, ) } + + fun createTombstone(id: String, deletedAt: String): BackupClimbSession { + return BackupClimbSession( + id = id, + gymId = "00000000-0000-0000-0000-000000000000", + date = deletedAt, + startTime = null, + endTime = null, + duration = null, + status = SessionStatus.values().first(), + notes = null, + isDeleted = true, + createdAt = deletedAt, + updatedAt = deletedAt, + ) + } } fun toClimbSession(): ClimbSession { @@ -195,6 +251,7 @@ data class BackupAttempt( val duration: Long? = null, val restTime: Long? = null, val timestamp: String, + val isDeleted: Boolean = false, val createdAt: String, val updatedAt: String? = null, ) { @@ -210,10 +267,28 @@ data class BackupAttempt( duration = attempt.duration, restTime = attempt.restTime, timestamp = attempt.timestamp, + isDeleted = false, createdAt = attempt.createdAt, updatedAt = attempt.updatedAt, ) } + + fun createTombstone(id: String, deletedAt: String): BackupAttempt { + return BackupAttempt( + id = id, + sessionId = "00000000-0000-0000-0000-000000000000", + problemId = "00000000-0000-0000-0000-000000000000", + result = AttemptResult.values().first(), + highestHold = null, + notes = null, + duration = null, + restTime = null, + timestamp = deletedAt, + isDeleted = true, + createdAt = deletedAt, + updatedAt = deletedAt, + ) + } } fun toAttempt(): Attempt { diff --git a/android/app/src/main/java/com/atridad/ascently/data/repository/ClimbRepository.kt b/android/app/src/main/java/com/atridad/ascently/data/repository/ClimbRepository.kt index f80a158..0fc21c1 100644 --- a/android/app/src/main/java/com/atridad/ascently/data/repository/ClimbRepository.kt +++ b/android/app/src/main/java/com/atridad/ascently/data/repository/ClimbRepository.kt @@ -19,6 +19,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.serialization.json.Json import java.io.File +import java.time.Instant class ClimbRepository(database: AscentlyDatabase, private val context: Context) { private val gymDao = database.gymDao() @@ -38,6 +39,7 @@ class ClimbRepository(database: AscentlyDatabase, private val context: Context) // Gym operations fun getAllGyms(): Flow> = gymDao.getAllGyms() + suspend fun getAllGymsSync(): List = gymDao.getAllGyms().first() suspend fun getGymById(id: String): Gym? = gymDao.getGymById(id) suspend fun insertGym(gym: Gym) { gymDao.insertGym(gym) @@ -60,6 +62,7 @@ class ClimbRepository(database: AscentlyDatabase, private val context: Context) // Problem operations fun getAllProblems(): Flow> = problemDao.getAllProblems() + suspend fun getAllProblemsSync(): List = problemDao.getAllProblems().first() suspend fun getProblemById(id: String): Problem? = problemDao.getProblemById(id) fun getProblemsByGym(gymId: String): Flow> = problemDao.getProblemsByGym(gymId) suspend fun insertProblem(problem: Problem) { @@ -80,6 +83,7 @@ class ClimbRepository(database: AscentlyDatabase, private val context: Context) // Session operations fun getAllSessions(): Flow> = sessionDao.getAllSessions() + suspend fun getAllSessionsSync(): List = sessionDao.getAllSessions().first() suspend fun getSessionById(id: String): ClimbSession? = sessionDao.getSessionById(id) fun getSessionsByGym(gymId: String): Flow> = sessionDao.getSessionsByGym(gymId) @@ -122,6 +126,8 @@ class ClimbRepository(database: AscentlyDatabase, private val context: Context) // Attempt operations fun getAllAttempts(): Flow> = attemptDao.getAllAttempts() + suspend fun getAllAttemptsSync(): List = attemptDao.getAllAttempts().first() + suspend fun getAttemptById(id: String): Attempt? = attemptDao.getAttemptById(id) fun getAttemptsBySession(sessionId: String): Flow> = attemptDao.getAttemptsBySession(sessionId) @@ -273,10 +279,9 @@ class ClimbRepository(database: AscentlyDatabase, private val context: Context) } fun trackDeletion(itemId: String, itemType: String) { - val currentDeletions = getDeletedItems().toMutableList() + cleanupOldDeletions() val newDeletion = DeletedItem(id = itemId, type = itemType, deletedAt = DateFormatUtils.nowISO8601()) - currentDeletions.add(newDeletion) val json = json.encodeToString(newDeletion) deletionPreferences.edit { putString("deleted_$itemId", json) } @@ -304,6 +309,27 @@ class ClimbRepository(database: AscentlyDatabase, private val context: Context) deletionPreferences.edit { clear() } } + private fun cleanupOldDeletions() { + val allPrefs = deletionPreferences.all + val cutoff = Instant.now().minusSeconds(90L * 24 * 60 * 60) + + deletionPreferences.edit { + for ((key, value) in allPrefs) { + if (key.startsWith("deleted_") && value is String) { + try { + val deletion = json.decodeFromString(value) + val deletedAt = Instant.parse(deletion.deletedAt) + if (deletedAt.isBefore(cutoff)) { + remove(key) + } + } catch (_: Exception) { + // Ignore + } + } + } + } + } + private fun validateDataIntegrity( gyms: List, problems: List, diff --git a/android/app/src/main/java/com/atridad/ascently/data/sync/AscentlySyncProvider.kt b/android/app/src/main/java/com/atridad/ascently/data/sync/AscentlySyncProvider.kt index e241c7d..ab9435a 100644 --- a/android/app/src/main/java/com/atridad/ascently/data/sync/AscentlySyncProvider.kt +++ b/android/app/src/main/java/com/atridad/ascently/data/sync/AscentlySyncProvider.kt @@ -4,8 +4,7 @@ import android.content.Context import android.content.SharedPreferences import android.net.ConnectivityManager import android.net.NetworkCapabilities -import androidx.annotation.RequiresPermission -import androidx.core.content.edit +import android.util.Log import com.atridad.ascently.data.format.BackupAttempt import com.atridad.ascently.data.format.BackupClimbSession import com.atridad.ascently.data.format.BackupGym @@ -15,41 +14,36 @@ import com.atridad.ascently.data.repository.ClimbRepository import com.atridad.ascently.data.state.DataStateManager import com.atridad.ascently.utils.AppLogger import com.atridad.ascently.utils.DateFormatUtils -import com.atridad.ascently.utils.ImageNamingUtils -import com.atridad.ascently.utils.ImageUtils -import kotlinx.coroutines.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.first import kotlinx.coroutines.withContext +import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody +import java.io.File import java.io.IOException -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale +import java.time.Instant import java.util.concurrent.TimeUnit class AscentlySyncProvider( private val context: Context, private val repository: ClimbRepository, + private val dataStateManager: DataStateManager ) : SyncProvider { - override val type: SyncProviderType = SyncProviderType.SERVER - - private val dataStateManager = DataStateManager(context) + override val type = SyncProviderType.SERVER companion object { private const val TAG = "AscentlySyncProvider" } private val sharedPreferences: SharedPreferences = - context.getSharedPreferences("sync_preferences", Context.MODE_PRIVATE) + context.getSharedPreferences("ascently_prefs", Context.MODE_PRIVATE) private val httpClient = OkHttpClient.Builder() @@ -61,8 +55,8 @@ class AscentlySyncProvider( private val json = Json { prettyPrint = true ignoreUnknownKeys = true - explicitNulls = false - coerceInputValues = true + encodeDefaults = true + isLenient = true } private val _isConnected = MutableStateFlow(false) @@ -71,11 +65,13 @@ class AscentlySyncProvider( private val _isConfigured = MutableStateFlow(false) override val isConfigured: StateFlow = _isConfigured.asStateFlow() - private var isOfflineMode = false + var isOfflineMode: Boolean + get() = sharedPreferences.getBoolean(Keys.OFFLINE_MODE, false) + set(value) = sharedPreferences.edit().putBoolean(Keys.OFFLINE_MODE, value).apply() - private object Keys { - const val SERVER_URL = "server_url" - const val AUTH_TOKEN = "auth_token" + object Keys { + const val SERVER_URL = "sync_server_url" + const val AUTH_TOKEN = "sync_auth_token" const val IS_CONNECTED = "is_connected" const val LAST_SYNC_TIME = "last_sync_time" const val OFFLINE_MODE = "offline_mode" @@ -83,661 +79,571 @@ class AscentlySyncProvider( init { loadInitialState() - updateConfiguredState() } private fun loadInitialState() { _isConnected.value = sharedPreferences.getBoolean(Keys.IS_CONNECTED, false) - isOfflineMode = sharedPreferences.getBoolean(Keys.OFFLINE_MODE, false) + updateConfiguredState() } private fun updateConfiguredState() { - _isConfigured.value = serverUrl.isNotBlank() && authToken.isNotBlank() + val url = serverUrl + val token = authToken + _isConfigured.value = url.isNotBlank() && token.isNotBlank() } var serverUrl: String get() = sharedPreferences.getString(Keys.SERVER_URL, "") ?: "" set(value) { - sharedPreferences.edit { putString(Keys.SERVER_URL, value) } + sharedPreferences.edit().putString(Keys.SERVER_URL, value).apply() updateConfiguredState() - _isConnected.value = false - sharedPreferences.edit { putBoolean(Keys.IS_CONNECTED, false) } } var authToken: String get() = sharedPreferences.getString(Keys.AUTH_TOKEN, "") ?: "" set(value) { - sharedPreferences.edit { putString(Keys.AUTH_TOKEN, value) } + sharedPreferences.edit().putString(Keys.AUTH_TOKEN, value).apply() updateConfiguredState() - _isConnected.value = false - sharedPreferences.edit { putBoolean(Keys.IS_CONNECTED, false) } } - @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) private fun isNetworkAvailable(): Boolean { val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val network = connectivityManager.activeNetwork ?: return false val activeNetwork = connectivityManager.getNetworkCapabilities(network) ?: return false + return when { activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true + activeNetwork.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true else -> false } } - @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) - override suspend fun sync() { + override suspend fun sync() = withContext(Dispatchers.IO) { if (isOfflineMode) { - AppLogger.d(TAG) { "Sync skipped: Offline mode is enabled." } - return + AppLogger.i(TAG) { "Sync skipped: Offline mode is enabled." } + return@withContext } - if (!isNetworkAvailable()) { - AppLogger.d(TAG) { "Sync skipped: No internet connection." } - throw SyncException.NetworkError("No internet connection.") - } - if (!_isConfigured.value) { + + if (!isConfigured.value) { throw SyncException.NotConfigured } - if (!_isConnected.value) { + + if (!isNetworkAvailable()) { throw SyncException.NotConnected } - val localBackup = createBackupFromRepository() - val serverBackup = downloadData() - - val hasLocalData = - localBackup.gyms.isNotEmpty() || - localBackup.problems.isNotEmpty() || - localBackup.sessions.isNotEmpty() || - localBackup.attempts.isNotEmpty() - - val hasServerData = - serverBackup.gyms.isNotEmpty() || - serverBackup.problems.isNotEmpty() || - serverBackup.sessions.isNotEmpty() || - serverBackup.attempts.isNotEmpty() - val lastSyncTimeStr = sharedPreferences.getString(Keys.LAST_SYNC_TIME, null) - if (hasLocalData && hasServerData && lastSyncTimeStr != null) { - AppLogger.d(TAG) { "Using delta sync for incremental updates" } - performDeltaSync(lastSyncTimeStr) - } else { - when { - !hasLocalData && hasServerData -> { - AppLogger.d(TAG) { "No local data found, performing full restore from server" } - val imagePathMapping = syncImagesFromServer(serverBackup) - importBackupToRepository(serverBackup, imagePathMapping) - AppLogger.d(TAG) { "Full restore completed" } - } - hasLocalData && !hasServerData -> { - AppLogger.d(TAG) { "No server data found, uploading local data to server" } - uploadData(localBackup) - syncImagesForBackup(localBackup) - AppLogger.d(TAG) { "Initial upload completed" } - } - - hasLocalData && hasServerData -> { - AppLogger.d(TAG) { "Both local and server data exist, merging (server wins)" } - mergeDataSafely(serverBackup) - AppLogger.d(TAG) { "Merge completed" } - } - - else -> { - AppLogger.d(TAG) { "No data to sync" } - } + if (lastSyncTimeStr != null) { + AppLogger.i(TAG) { "Last sync time found ($lastSyncTimeStr), attempting delta sync" } + try { + performDeltaSync() + sharedPreferences.edit() + .putString(Keys.LAST_SYNC_TIME, DateFormatUtils.nowISO8601()) + .apply() + return@withContext + } catch (e: Exception) { + AppLogger.e(TAG, e) { "Delta sync failed, falling back to full sync check: ${e.message}" } } } - val now = DateFormatUtils.nowISO8601() - sharedPreferences.edit { putString(Keys.LAST_SYNC_TIME, now) } + val localBackup = createBackupFromRepository() + val serverBackup = try { + downloadData() + } catch (e: Exception) { + AppLogger.e(TAG, e) { "Failed to download data: ${e.message}" } + throw e + } + + val hasLocalData = localBackup.gyms.isNotEmpty() || + localBackup.problems.isNotEmpty() || + localBackup.sessions.isNotEmpty() || + localBackup.attempts.isNotEmpty() + + val hasServerData = serverBackup.gyms.isNotEmpty() || + serverBackup.problems.isNotEmpty() || + serverBackup.sessions.isNotEmpty() || + serverBackup.attempts.isNotEmpty() + + if (!hasLocalData && hasServerData) { + AppLogger.i(TAG) { "Performing full restore from server" } + AppLogger.i(TAG) { "Syncing images from server first..." } + val imagePathMapping = syncImagesFromServer(serverBackup) + + AppLogger.i(TAG) { "Importing data after images..." } + importBackupToRepository(serverBackup, imagePathMapping) + AppLogger.i(TAG) { "Full restore completed" } + } else if (hasLocalData && !hasServerData) { + AppLogger.i(TAG) { "Uploading local data to server" } + uploadData(localBackup) + AppLogger.i(TAG) { "Uploading local images to server..." } + syncImagesToServer() + AppLogger.i(TAG) { "Initial upload completed" } + } else if (hasLocalData && hasServerData) { + AppLogger.i(TAG) { "Merging local and server data" } + mergeDataSafely(localBackup, serverBackup) + AppLogger.i(TAG) { "Safe merge completed" } + } else { + AppLogger.i(TAG) { "No data to sync" } + } + + sharedPreferences.edit() + .putString(Keys.LAST_SYNC_TIME, DateFormatUtils.nowISO8601()) + .apply() } override fun disconnect() { - serverUrl = "" - authToken = "" _isConnected.value = false - sharedPreferences.edit { - remove(Keys.LAST_SYNC_TIME) - putBoolean(Keys.IS_CONNECTED, false) - } - updateConfiguredState() + sharedPreferences.edit() + .remove(Keys.LAST_SYNC_TIME) + .putBoolean(Keys.IS_CONNECTED, false) + .apply() } - private suspend fun performDeltaSync(lastSyncTimeStr: String) { - AppLogger.d(TAG) { "Starting delta sync with lastSyncTime=$lastSyncTimeStr" } + private suspend fun performDeltaSync() { + val lastSyncTimeStr = sharedPreferences.getString(Keys.LAST_SYNC_TIME, null) + ?: throw SyncException.General("No last sync time for delta sync") - val lastSyncDate = parseISO8601(lastSyncTimeStr) ?: Date(0) + val lastSyncDate = parseISO8601(lastSyncTimeStr) ?: Instant.EPOCH - val allGyms = repository.getAllGyms().first() - val modifiedGyms = - allGyms - .filter { gym -> parseISO8601(gym.updatedAt)?.after(lastSyncDate) == true } - .map { BackupGym.fromGym(it) } + val allGyms = repository.getAllGymsSync() + val modifiedGyms = allGyms.filter { + (parseISO8601(it.updatedAt) ?: Instant.MIN).isAfter(lastSyncDate) + }.map { BackupGym.fromGym(it) }.toMutableList() - val allProblems = repository.getAllProblems().first() - val modifiedProblems = - allProblems - .filter { problem -> - parseISO8601(problem.updatedAt)?.after(lastSyncDate) == true + val allProblems = repository.getAllProblemsSync() + val modifiedProblems = allProblems.filter { + (parseISO8601(it.updatedAt) ?: Instant.MIN).isAfter(lastSyncDate) + }.map { problem -> + val backupProblem = BackupProblem.fromProblem(problem) + if (!problem.imagePaths.isEmpty()) { + val normalizedPaths = problem.imagePaths.mapIndexed { index, _ -> + "${problem.id}_${index}.jpg" } - .map { problem -> - val backupProblem = BackupProblem.fromProblem(problem) - val normalizedImagePaths = - problem.imagePaths.mapIndexed { index, _ -> - ImageNamingUtils.generateImageFilename(problem.id, index) - } - if (normalizedImagePaths.isNotEmpty()) { - backupProblem.copy(imagePaths = normalizedImagePaths) - } else { - backupProblem - } - } - - val allSessions = repository.getAllSessions().first() - val modifiedSessions = - allSessions - .filter { session -> - parseISO8601(session.updatedAt)?.after(lastSyncDate) == true - } - .map { BackupClimbSession.fromClimbSession(it) } - - val allAttempts = repository.getAllAttempts().first() - val modifiedAttempts = - allAttempts - .filter { attempt -> - parseISO8601(attempt.createdAt)?.after(lastSyncDate) == true - } - .map { BackupAttempt.fromAttempt(it) } - - val allDeletions = repository.getDeletedItems() - val modifiedDeletions = - allDeletions.filter { item -> - parseISO8601(item.deletedAt)?.after(lastSyncDate) == true + backupProblem.withUpdatedImagePaths(normalizedPaths) + } else { + backupProblem } + }.toMutableList() - AppLogger.d(TAG) { - "Delta sync sending: gyms=${modifiedGyms.size}, problems=${modifiedProblems.size}, sessions=${modifiedSessions.size}, attempts=${modifiedAttempts.size}, deletions=${modifiedDeletions.size}" + val allSessions = repository.getAllSessionsSync() + val modifiedSessions = allSessions.filter { + (parseISO8601(it.updatedAt) ?: Instant.MIN).isAfter(lastSyncDate) + }.map { BackupClimbSession.fromClimbSession(it) }.toMutableList() + + val allAttempts = repository.getAllAttemptsSync() + val modifiedAttempts = allAttempts.filter { + val updated = it.updatedAt + (parseISO8601(updated) ?: Instant.MIN).isAfter(lastSyncDate) + }.map { BackupAttempt.fromAttempt(it) }.toMutableList() + + val deletedItems = repository.getDeletedItems().filter { + val deletedAt = parseISO8601(it.deletedAt) ?: Instant.MIN + deletedAt.isAfter(lastSyncDate) } - val deltaRequest = - DeltaSyncRequest( - lastSyncTime = lastSyncTimeStr, - gyms = modifiedGyms, - problems = modifiedProblems, - sessions = modifiedSessions, - attempts = modifiedAttempts, - deletedItems = modifiedDeletions, - ) - - val requestBody = - json.encodeToString(DeltaSyncRequest.serializer(), deltaRequest) - .toRequestBody("application/json".toMediaType()) - - val request = - Request.Builder() - .url("$serverUrl/sync/delta") - .header("Authorization", "Bearer $authToken") - .post(requestBody) - .build() - - val deltaResponse = - withContext(Dispatchers.IO) { - try { - httpClient.newCall(request).execute().use { response -> - if (response.isSuccessful) { - val body = response.body?.string() - if (!body.isNullOrEmpty()) { - json.decodeFromString(DeltaSyncResponse.serializer(), body) - } else { - throw SyncException.InvalidResponse("Empty response body") - } - } else { - handleHttpError(response.code) - } - } - } catch (e: IOException) { - throw SyncException.NetworkError(e.message ?: "Network error") - } + for (item in deletedItems) { + when (item.type) { + "gym" -> modifiedGyms.add(BackupGym.createTombstone(item.id, item.deletedAt)) + "problem" -> modifiedProblems.add(BackupProblem.createTombstone(item.id, item.deletedAt)) + "session" -> modifiedSessions.add(BackupClimbSession.createTombstone(item.id, item.deletedAt)) + "attempt" -> modifiedAttempts.add(BackupAttempt.createTombstone(item.id, item.deletedAt)) } - - AppLogger.d(TAG) { - "Delta sync received: gyms=${deltaResponse.gyms.size}, " + - "problems=${deltaResponse.problems.size}, sessions=${deltaResponse.sessions.size}, " + - "attempts=${deltaResponse.attempts.size}, deletions=${deltaResponse.deletedItems.size}" } - applyDeltaResponse(deltaResponse) + AppLogger.i(TAG) { "Delta Sync: Sending gyms=${modifiedGyms.size}, problems=${modifiedProblems.size}, sessions=${modifiedSessions.size}, attempts=${modifiedAttempts.size}" } + + val deltaRequest = DeltaSyncRequest( + lastSyncTime = lastSyncTimeStr, + gyms = modifiedGyms, + problems = modifiedProblems, + sessions = modifiedSessions, + attempts = modifiedAttempts + ) + + val requestBody = json.encodeToString(DeltaSyncRequest.serializer(), deltaRequest) + .toRequestBody("application/json".toMediaType()) + + val request = Request.Builder() + .url("$serverUrl/sync/delta") + .header("Authorization", "Bearer $authToken") + .post(requestBody) + .build() + + val response = withContext(Dispatchers.IO) { + httpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) { + if (response.code == 401) throw SyncException.Unauthorized + throw SyncException.ServerError(response.code) + } + val body = response.body?.string() ?: throw SyncException.InvalidResponse("Empty response") + json.decodeFromString(body) + } + } + + if (response.requestFullSync) { + throw SyncException.General("Server requested full sync") + } + + AppLogger.i(TAG) { "Delta Sync: Received gyms=${response.gyms.size}, problems=${response.problems.size}, sessions=${response.sessions.size}, attempts=${response.attempts.size}" } + + applyDeltaResponse(response) syncModifiedImages(modifiedProblems) + + repository.clearDeletedItems() + + sharedPreferences.edit() + .putString(Keys.LAST_SYNC_TIME, response.serverTime) + .apply() } - private fun parseISO8601(dateString: String): Date? { + private fun parseISO8601(dateStr: String?): Instant? { + if (dateStr == null) return null return try { - val format = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.US) - format.parse(dateString) - } catch (_: Exception) { + Instant.parse(dateStr) + } catch (e: Exception) { null } } private suspend fun applyDeltaResponse(response: DeltaSyncResponse) { - // SyncService handles the "isSyncing" state to prevent recursive sync triggers - // when the repository is modified during a sync operation. + val imagePathMapping = mutableMapOf() + for (problem in response.problems) { + if (problem.isDeleted) continue - try { - // Merge and apply deletions first to prevent resurrection - val allDeletions = repository.getDeletedItems() + response.deletedItems - val uniqueDeletions = allDeletions.distinctBy { "${it.type}:${it.id}" } - - AppLogger.d(TAG) { "Applying ${uniqueDeletions.size} deletion records before merging data" } - applyDeletions(uniqueDeletions) - - // Build deleted item lookup set - val deletedItemSet = uniqueDeletions.map { "${it.type}:${it.id}" }.toSet() - - // Download images for new/modified problems from server - val imagePathMapping = mutableMapOf() - for (problem in response.problems) { - if (deletedItemSet.contains("problem:${problem.id}")) { - continue - } - problem.imagePaths?.forEach { imagePath -> - val serverFilename = imagePath.substringAfterLast('/') - try { - val localImagePath = downloadImage(serverFilename) - if (localImagePath != null) { - imagePathMapping[imagePath] = localImagePath - } - } catch (e: Exception) { - AppLogger.w(TAG) { "Failed to download image $imagePath: ${e.message}" } - } + val paths = problem.imagePaths ?: continue + for ((index, path) in paths.withIndex()) { + val serverFilename = path.substringAfterLast('/') + try { + val imageData = downloadImage(serverFilename) + val localFilename = "${problem.id}_${index}.jpg" + saveImageLocally(localFilename, imageData) + imagePathMapping[serverFilename] = localFilename + } catch (e: Exception) { + AppLogger.e(TAG, e) { "Failed to download image $serverFilename: ${e.message}" } } } - - // Merge gyms - val existingGyms = repository.getAllGyms().first() - for (backupGym in response.gyms) { - if (deletedItemSet.contains("gym:${backupGym.id}")) { - continue - } - val existing = existingGyms.find { it.id == backupGym.id } - if (existing == null || backupGym.updatedAt >= existing.updatedAt) { - val gym = backupGym.toGym() - if (existing != null) { - repository.updateGym(gym) - } else { - repository.insertGym(gym) - } - } - } - - // Merge problems - val existingProblems = repository.getAllProblems().first() - for (backupProblem in response.problems) { - if (deletedItemSet.contains("problem:${backupProblem.id}")) { - continue - } - val updatedImagePaths = - backupProblem.imagePaths?.map { oldPath -> - imagePathMapping[oldPath] ?: oldPath - } - val problemToMerge = backupProblem.copy(imagePaths = updatedImagePaths) - val problem = problemToMerge.toProblem() - - val existing = existingProblems.find { it.id == backupProblem.id } - if (existing == null || backupProblem.updatedAt >= existing.updatedAt) { - if (existing != null) { - repository.updateProblem(problem) - } else { - repository.insertProblem(problem) - } - } - } - - // Merge sessions - val existingSessions = repository.getAllSessions().first() - for (backupSession in response.sessions) { - if (deletedItemSet.contains("session:${backupSession.id}")) { - continue - } - val session = backupSession.toClimbSession() - val existing = existingSessions.find { it.id == backupSession.id } - if (existing == null || backupSession.updatedAt >= existing.updatedAt) { - if (existing != null) { - repository.updateSession(session) - } else { - repository.insertSession(session) - } - } - } - - // Merge attempts - val existingAttempts = repository.getAllAttempts().first() - for (backupAttempt in response.attempts) { - if (deletedItemSet.contains("attempt:${backupAttempt.id}")) { - continue - } - val attempt = backupAttempt.toAttempt() - val existing = existingAttempts.find { it.id == backupAttempt.id } - if (existing == null || backupAttempt.createdAt >= existing.createdAt) { - if (existing != null) { - repository.updateAttempt(attempt) - } else { - repository.insertAttempt(attempt) - } - } - } - - // Apply deletions again for safety - applyDeletions(uniqueDeletions) - - // Update deletion records - repository.clearDeletedItems() - uniqueDeletions.forEach { repository.trackDeletion(it.id, it.type) } - } catch (e: Exception) { - AppLogger.e(TAG, e) { "Error applying delta response" } - throw e } - } - private suspend fun applyDeletions( - deletions: List, - ) { - val existingGyms = repository.getAllGyms().first() - val existingProblems = repository.getAllProblems().first() - val existingSessions = repository.getAllSessions().first() - val existingAttempts = repository.getAllAttempts().first() - - for (item in deletions) { - when (item.type) { - "gym" -> { - existingGyms.find { it.id == item.id }?.let { repository.deleteGym(it) } + for (gym in response.gyms) { + if (gym.isDeleted) { + val serverUpdate = parseISO8601(gym.updatedAt) ?: Instant.MAX + val existing = repository.getGymById(gym.id) + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate) || serverUpdate == localUpdate) { + repository.deleteGym(existing) + } } + continue + } - "problem" -> { - existingProblems.find { it.id == item.id }?.let { repository.deleteProblem(it) } + val existing = repository.getGymById(gym.id) + val serverUpdate = parseISO8601(gym.updatedAt) ?: Instant.MIN + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate)) { + repository.updateGym(gym.toGym()) } + } else { + repository.insertGym(gym.toGym()) + } + } - "session" -> { - existingSessions.find { it.id == item.id }?.let { repository.deleteSession(it) } + for (problem in response.problems) { + if (problem.isDeleted) { + val serverUpdate = parseISO8601(problem.updatedAt) ?: Instant.MAX + val existing = repository.getProblemById(problem.id) + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate) || serverUpdate == localUpdate) { + repository.deleteProblem(existing) + } } + continue + } - "attempt" -> { - existingAttempts.find { it.id == item.id }?.let { repository.deleteAttempt(it) } + var problemToMerge = problem + if (imagePathMapping.isNotEmpty() && !problem.imagePaths.isNullOrEmpty()) { + val updatedPaths = problem.imagePaths.map { imagePathMapping[it.substringAfterLast('/')] ?: it } + problemToMerge = problem.withUpdatedImagePaths(updatedPaths) + } + + val existing = repository.getProblemById(problem.id) + val serverUpdate = parseISO8601(problem.updatedAt) ?: Instant.MIN + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate)) { + repository.updateProblem(problemToMerge.toProblem()) } + } else { + repository.insertProblem(problemToMerge.toProblem()) + } + } + + for (session in response.sessions) { + if (session.isDeleted) { + val serverUpdate = parseISO8601(session.updatedAt) ?: Instant.MAX + val existing = repository.getSessionById(session.id) + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate) || serverUpdate == localUpdate) { + repository.deleteSession(existing) + } + } + continue + } + + val existing = repository.getSessionById(session.id) + val serverUpdate = parseISO8601(session.updatedAt) ?: Instant.MIN + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate)) { + repository.updateSession(session.toClimbSession()) + } + } else { + repository.insertSession(session.toClimbSession()) + } + } + + for (attempt in response.attempts) { + if (attempt.isDeleted) { + val serverUpdate = parseISO8601(attempt.updatedAt ?: attempt.createdAt) ?: Instant.MAX + val existing = repository.getAttemptById(attempt.id) + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate) || serverUpdate == localUpdate) { + repository.deleteAttempt(existing) + } + } + continue + } + + val existing = repository.getAttemptById(attempt.id) + val serverUpdate = parseISO8601(attempt.updatedAt ?: attempt.createdAt) ?: Instant.MIN + if (existing != null) { + val localUpdate = parseISO8601(existing.updatedAt) ?: Instant.MIN + if (serverUpdate.isAfter(localUpdate)) { + repository.updateAttempt(attempt.toAttempt()) + } + } else { + repository.insertAttempt(attempt.toAttempt()) } } } private suspend fun syncModifiedImages(modifiedProblems: List) { - if (modifiedProblems.isEmpty()) return + for (problem in modifiedProblems) { + if (problem.isDeleted) continue + val paths = problem.imagePaths ?: continue + for (path in paths) { + val localFile = getLocalImageFile(path) + if (localFile != null && localFile.exists()) { + try { + uploadImage(path, localFile.readBytes()) + } catch (e: Exception) { + AppLogger.e(TAG, e) { "Failed to upload image $path: ${e.message}" } + } + } + } + } + } - AppLogger.d(TAG) { "Syncing images for ${modifiedProblems.size} modified problems" } + private fun getLocalImageFile(filename: String): File? { + val dir = context.getExternalFilesDir("images") ?: return null + return File(dir, filename) + } - for (backupProblem in modifiedProblems) { - backupProblem.imagePaths?.forEach { imagePath -> - val filename = imagePath.substringAfterLast('/') - uploadImage(imagePath, filename) - } - } + private fun saveImageLocally(filename: String, data: ByteArray) { + val dir = context.getExternalFilesDir("images") ?: return + if (!dir.exists()) dir.mkdirs() + File(dir, filename).writeBytes(data) } private suspend fun downloadData(): ClimbDataBackup { - val request = - Request.Builder() - .url("$serverUrl/sync") - .header("Authorization", "Bearer $authToken") - .get() - .build() + val request = Request.Builder() + .url("$serverUrl/sync") + .header("Authorization", "Bearer $authToken") + .get() + .build() return withContext(Dispatchers.IO) { - try { - httpClient.newCall(request).execute().use { response -> - if (response.isSuccessful) { - val body = response.body?.string() - if (!body.isNullOrEmpty()) { - json.decodeFromString(body) - } else { - ClimbDataBackup( - exportedAt = DateFormatUtils.nowISO8601(), - gyms = emptyList(), - problems = emptyList(), - sessions = emptyList(), - attempts = emptyList(), - ) - } - } else { - handleHttpError(response.code) - } + httpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) { + if (response.code == 401) throw SyncException.Unauthorized + throw SyncException.ServerError(response.code) } - } catch (e: IOException) { - throw SyncException.NetworkError(e.message ?: "Network error") + val body = response.body?.string() ?: throw SyncException.InvalidResponse("Empty body") + json.decodeFromString(body) } } } private suspend fun uploadData(backup: ClimbDataBackup) { - val requestBody = - json.encodeToString(backup).toRequestBody("application/json".toMediaType()) - - val request = - Request.Builder() - .url("$serverUrl/sync") - .header("Authorization", "Bearer $authToken") - .put(requestBody) - .build() + val requestBody = json.encodeToString(backup).toRequestBody("application/json".toMediaType()) + val request = Request.Builder() + .url("$serverUrl/sync") + .header("Authorization", "Bearer $authToken") + .put(requestBody) + .build() withContext(Dispatchers.IO) { - try { - httpClient.newCall(request).execute().use { response -> - if (!response.isSuccessful) { - handleHttpError(response.code) - } + httpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) { + if (response.code == 401) throw SyncException.Unauthorized + throw SyncException.ServerError(response.code) } - } catch (e: IOException) { - throw SyncException.NetworkError(e.message ?: "Network error") } } } private suspend fun syncImagesFromServer(backup: ClimbDataBackup): Map { - val imagePathMapping = mutableMapOf() - val totalImages = backup.problems.sumOf { it.imagePaths?.size ?: 0 } - AppLogger.d(TAG) { "Starting image download from server for $totalImages images" } - - withContext(Dispatchers.IO) { - backup.problems.forEach { problem -> - problem.imagePaths?.forEach { imagePath -> - val serverFilename = imagePath.substringAfterLast('/') - try { - val localImagePath = downloadImage(serverFilename) - if (localImagePath != null) { - imagePathMapping[imagePath] = localImagePath - } - } catch (_: SyncException.ImageNotFound) { - AppLogger.w(TAG) { "Image not found on server: $imagePath" } - } catch (e: CancellationException) { - throw e - } catch (e: Exception) { - AppLogger.w(TAG) { "Failed to download image $imagePath: ${e.message}" } - } + val mapping = mutableMapOf() + for (problem in backup.problems) { + if (problem.isDeleted) continue + val paths = problem.imagePaths ?: continue + for ((index, path) in paths.withIndex()) { + val serverFilename = path.substringAfterLast('/') + try { + val imageData = downloadImage(serverFilename) + val localFilename = "${problem.id}_${index}.jpg" + saveImageLocally(localFilename, imageData) + mapping[serverFilename] = localFilename + } catch (e: Exception) { + Log.e(TAG, "Failed to sync image $serverFilename", e) } } } - return imagePathMapping + return mapping } - private suspend fun downloadImage(serverFilename: String): String? { - val request = - Request.Builder() - .url("$serverUrl/images/download?filename=$serverFilename") - .header("Authorization", "Bearer $authToken") - .build() + private suspend fun syncImagesToServer() { + val problems = repository.getAllProblemsSync() + for (problem in problems) { + for (path in problem.imagePaths) { + val file = getLocalImageFile(path) + if (file != null && file.exists()) { + try { + uploadImage(path, file.readBytes()) + } catch (e: Exception) { + Log.e(TAG, "Failed to upload image $path", e) + } + } + } + } + } + + private suspend fun downloadImage(filename: String): ByteArray { + val request = Request.Builder() + .url("$serverUrl/images/download?filename=$filename") + .header("Authorization", "Bearer $authToken") + .build() return withContext(Dispatchers.IO) { - try { - httpClient.newCall(request).execute().use { response -> - if (response.isSuccessful) { - response.body?.bytes()?.let { - ImageUtils.saveImageFromBytesWithFilename(context, it, serverFilename) - } - } else { - if (response.code == 404) throw SyncException.ImageNotFound - null - } + httpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) { + if (response.code == 404) throw SyncException.ImageNotFound + throw SyncException.ServerError(response.code) } - } catch (e: IOException) { - AppLogger.e(TAG, e) { "Network error downloading image $serverFilename" } - null + response.body?.bytes() ?: throw SyncException.InvalidResponse("Empty image body") } } } - private suspend fun syncImagesForBackup(backup: ClimbDataBackup) { - AppLogger.d(TAG) { "Starting image sync for backup with ${backup.problems.size} problems" } - withContext(Dispatchers.IO) { - backup.problems.forEach { problem -> - problem.imagePaths?.forEach { localPath -> - val filename = localPath.substringAfterLast('/') - uploadImage(localPath, filename) - } - } - } - } - - private suspend fun uploadImage(localPath: String, filename: String) { - val file = ImageUtils.getImageFile(context, localPath) - if (!file.exists()) { - AppLogger.w(TAG) { "Local image file not found, cannot upload: $localPath" } - return - } - - val requestBody = file.readBytes().toRequestBody("application/octet-stream".toMediaType()) - - val request = - Request.Builder() - .url("$serverUrl/images/upload?filename=$filename") - .header("Authorization", "Bearer $authToken") - .post(requestBody) - .build() + private suspend fun uploadImage(filename: String, data: ByteArray) { + val requestBody = data.toRequestBody("application/octet-stream".toMediaType()) + val request = Request.Builder() + .url("$serverUrl/images/upload?filename=$filename") + .header("Authorization", "Bearer $authToken") + .post(requestBody) + .build() withContext(Dispatchers.IO) { - try { - httpClient.newCall(request).execute().use { response -> - if (response.isSuccessful) { - AppLogger.d(TAG) { "Successfully uploaded image: $filename" } - } else { - AppLogger.w(TAG) { - "Failed to upload image $filename. Server responded with ${response.code}" - } - } + httpClient.newCall(request).execute().use { response -> + if (!response.isSuccessful) { + throw SyncException.ServerError(response.code) } - } catch (e: IOException) { - AppLogger.e(TAG, e) { "Network error uploading image $filename" } } } } private suspend fun createBackupFromRepository(): ClimbDataBackup { - return withContext(Dispatchers.Default) { - ClimbDataBackup( - exportedAt = dataStateManager.getLastModified(), - gyms = repository.getAllGyms().first().map { BackupGym.fromGym(it) }, - problems = - repository.getAllProblems().first().map { problem -> - val backupProblem = BackupProblem.fromProblem(problem) - val normalizedImagePaths = - problem.imagePaths.mapIndexed { index, _ -> - ImageNamingUtils.generateImageFilename( - problem.id, - index, - ) - } - if (normalizedImagePaths.isNotEmpty()) { - backupProblem.copy(imagePaths = normalizedImagePaths) - } else { - backupProblem - } - }, - sessions = - repository.getAllSessions().first().map { - BackupClimbSession.fromClimbSession(it) - }, - attempts = - repository.getAllAttempts().first().map { - BackupAttempt.fromAttempt(it) - }, - deletedItems = repository.getDeletedItems(), - ) - } + val gyms = repository.getAllGymsSync().map { BackupGym.fromGym(it) } + val problems = repository.getAllProblemsSync().map { BackupProblem.fromProblem(it) } + val sessions = repository.getAllSessionsSync().map { BackupClimbSession.fromClimbSession(it) } + val attempts = repository.getAllAttemptsSync().map { BackupAttempt.fromAttempt(it) } + + return ClimbDataBackup( + exportedAt = DateFormatUtils.nowISO8601(), + gyms = gyms, + problems = problems, + sessions = sessions, + attempts = attempts + ) } - private suspend fun importBackupToRepository( - backup: ClimbDataBackup, - imagePathMapping: Map, - ) { - val gyms = backup.gyms.map { it.toGym() } - val problems = - backup.problems.map { backupProblem -> - val imagePaths = backupProblem.imagePaths - val updatedImagePaths = - imagePaths?.map { oldPath -> imagePathMapping[oldPath] ?: oldPath } - backupProblem.copy(imagePaths = updatedImagePaths).toProblem() + private suspend fun importBackupToRepository(backup: ClimbDataBackup, imagePathMapping: Map) { + for (gym in backup.gyms) { + if (!gym.isDeleted) repository.insertGym(gym.toGym()) + } + + for (problem in backup.problems) { + if (!problem.isDeleted) { + var p = problem + if (imagePathMapping.isNotEmpty() && !problem.imagePaths.isNullOrEmpty()) { + val updatedPaths = problem.imagePaths.map { imagePathMapping[it.substringAfterLast('/')] ?: it } + p = problem.withUpdatedImagePaths(updatedPaths) + } + repository.insertProblem(p.toProblem()) } - val sessions = backup.sessions.map { it.toClimbSession() } - val attempts = backup.attempts.map { it.toAttempt() } - - repository.resetAllData() - - gyms.forEach { repository.insertGymWithoutSync(it) } - problems.forEach { repository.insertProblemWithoutSync(it) } - sessions.forEach { repository.insertSessionWithoutSync(it) } - attempts.forEach { repository.insertAttemptWithoutSync(it) } - - repository.clearDeletedItems() - } - - private suspend fun mergeDataSafely(serverBackup: ClimbDataBackup) { - AppLogger.d(TAG) { "Server data will overwrite local data. Performing full restore." } - val imagePathMapping = syncImagesFromServer(serverBackup) - importBackupToRepository(serverBackup, imagePathMapping) - } - - private fun handleHttpError(code: Int): Nothing { - when (code) { - 401 -> throw SyncException.Unauthorized - in 500..599 -> throw SyncException.ServerError(code) - else -> throw SyncException.InvalidResponse("HTTP error code: $code") } + + for (session in backup.sessions) { + if (!session.isDeleted) repository.insertSession(session.toClimbSession()) + } + + for (attempt in backup.attempts) { + if (!attempt.isDeleted) repository.insertAttempt(attempt.toAttempt()) + } + } + + private suspend fun mergeDataSafely(local: ClimbDataBackup, server: ClimbDataBackup) { + val deltaResponse = DeltaSyncResponse( + serverTime = server.exportedAt, + gyms = server.gyms, + problems = server.problems, + sessions = server.sessions, + attempts = server.attempts, + ) + applyDeltaResponse(deltaResponse) } override suspend fun testConnection() { - if (!_isConfigured.value) { - _isConnected.value = false - throw SyncException.NotConfigured - } + if (!isConfigured.value) throw SyncException.NotConfigured + + val request = Request.Builder() + .url("$serverUrl/health") + .apply { + if (authToken.isNotBlank()) header("Authorization", "Bearer $authToken") + } + .head() // Using HEAD as originally, or GET + .build() - val request = - Request.Builder() - .url("$serverUrl/sync") - .header("Authorization", "Bearer $authToken") - .head() - .build() try { withContext(Dispatchers.IO) { httpClient.newCall(request).execute().use { response -> - _isConnected.value = response.isSuccessful || response.code == 405 + if (!response.isSuccessful && response.code != 405) { + throw SyncException.ServerError(response.code) + } + _isConnected.value = true + sharedPreferences.edit().putBoolean(Keys.IS_CONNECTED, true).apply() } } - if (!_isConnected.value) { - throw SyncException.NotConnected - } } catch (e: Exception) { _isConnected.value = false - throw SyncException.NetworkError(e.message ?: "Connection error") - } finally { - sharedPreferences.edit { putBoolean(Keys.IS_CONNECTED, _isConnected.value) } + throw e } } } diff --git a/android/app/src/main/java/com/atridad/ascently/data/sync/DeltaSyncModels.kt b/android/app/src/main/java/com/atridad/ascently/data/sync/DeltaSyncModels.kt index 495452d..473a1d7 100644 --- a/android/app/src/main/java/com/atridad/ascently/data/sync/DeltaSyncModels.kt +++ b/android/app/src/main/java/com/atridad/ascently/data/sync/DeltaSyncModels.kt @@ -4,7 +4,6 @@ import com.atridad.ascently.data.format.BackupAttempt import com.atridad.ascently.data.format.BackupClimbSession import com.atridad.ascently.data.format.BackupGym import com.atridad.ascently.data.format.BackupProblem -import com.atridad.ascently.data.format.DeletedItem import kotlinx.serialization.Serializable /** Request structure for delta sync - sends only changes since last sync */ @@ -15,16 +14,15 @@ data class DeltaSyncRequest( val problems: List, val sessions: List, val attempts: List, - val deletedItems: List, ) /** Response structure for delta sync - receives only changes from server */ @Serializable data class DeltaSyncResponse( val serverTime: String, + val requestFullSync: Boolean = false, val gyms: List, val problems: List, val sessions: List, val attempts: List, - val deletedItems: List, ) diff --git a/android/app/src/main/java/com/atridad/ascently/data/sync/SyncException.kt b/android/app/src/main/java/com/atridad/ascently/data/sync/SyncException.kt index 040e470..ff454c1 100644 --- a/android/app/src/main/java/com/atridad/ascently/data/sync/SyncException.kt +++ b/android/app/src/main/java/com/atridad/ascently/data/sync/SyncException.kt @@ -18,4 +18,6 @@ sealed class SyncException(message: String) : IOException(message), Serializable SyncException("Invalid server response: $details") data class NetworkError(val details: String) : SyncException("Network error: $details") + + data class General(val details: String) : SyncException(details) } diff --git a/android/app/src/main/java/com/atridad/ascently/data/sync/SyncService.kt b/android/app/src/main/java/com/atridad/ascently/data/sync/SyncService.kt index 2c68e3a..27c9c9f 100644 --- a/android/app/src/main/java/com/atridad/ascently/data/sync/SyncService.kt +++ b/android/app/src/main/java/com/atridad/ascently/data/sync/SyncService.kt @@ -4,6 +4,7 @@ import android.content.Context import android.content.SharedPreferences import androidx.core.content.edit import com.atridad.ascently.data.repository.ClimbRepository +import com.atridad.ascently.data.state.DataStateManager import com.atridad.ascently.utils.AppLogger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -27,7 +28,7 @@ class SyncService(private val context: Context, private val repository: ClimbRep } // Currently we only support one provider, but this allows for future expansion - private val provider: SyncProvider = AscentlySyncProvider(context, repository) + private val provider: SyncProvider = AscentlySyncProvider(context, repository, DataStateManager(context)) // State private val _isSyncing = MutableStateFlow(false) diff --git a/ios/Ascently.xcodeproj/project.pbxproj b/ios/Ascently.xcodeproj/project.pbxproj index cdddfec..51b5031 100644 --- a/ios/Ascently.xcodeproj/project.pbxproj +++ b/ios/Ascently.xcodeproj/project.pbxproj @@ -466,7 +466,7 @@ CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 43; + CURRENT_PROJECT_VERSION = 44; DEVELOPMENT_TEAM = 4BC9Y2LL4B; DRIVERKIT_DEPLOYMENT_TARGET = 24.6; ENABLE_PREVIEWS = YES; @@ -518,7 +518,7 @@ CODE_SIGN_ENTITLEMENTS = Ascently/Ascently.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 43; + CURRENT_PROJECT_VERSION = 44; DEVELOPMENT_TEAM = 4BC9Y2LL4B; DRIVERKIT_DEPLOYMENT_TARGET = 24.6; ENABLE_PREVIEWS = YES; @@ -610,7 +610,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 43; + CURRENT_PROJECT_VERSION = 44; DEVELOPMENT_TEAM = 4BC9Y2LL4B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SessionStatusLive/Info.plist; @@ -641,7 +641,7 @@ ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; CODE_SIGN_ENTITLEMENTS = SessionStatusLiveExtension.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 43; + CURRENT_PROJECT_VERSION = 44; DEVELOPMENT_TEAM = 4BC9Y2LL4B; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = SessionStatusLive/Info.plist; diff --git a/ios/Ascently.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate b/ios/Ascently.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate index 424d3b0e928706eb96040247485fc099bec5baa7..c926ae344832023d52e16261c5a3503a3c7fd531 100644 GIT binary patch literal 315715 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≪jk0t!loBU< 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%0DDVl%d3Cw{{p*o(h$5JzwfCvgVn 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 literal 310210 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

8j!6=sYPM2^dBJRhwFDyLEn@9gL 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 z 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 diff --git a/ios/Ascently/Models/BackupFormat.swift b/ios/Ascently/Models/BackupFormat.swift index 44ec1fc..f923ada 100644 --- a/ios/Ascently/Models/BackupFormat.swift +++ b/ios/Ascently/Models/BackupFormat.swift @@ -388,7 +388,7 @@ struct BackupClimbSession: Codable { startTime: nil, endTime: nil, duration: nil, - status: .finished, + status: .completed, notes: nil, isDeleted: true, createdAt: dateString, diff --git a/ios/Ascently/Models/DeltaSyncFormat.swift b/ios/Ascently/Models/DeltaSyncFormat.swift index 9277f79..f812f4f 100644 --- a/ios/Ascently/Models/DeltaSyncFormat.swift +++ b/ios/Ascently/Models/DeltaSyncFormat.swift @@ -17,6 +17,7 @@ struct DeltaSyncRequest: Codable { struct DeltaSyncResponse: Codable { let serverTime: String + let requestFullSync: Bool? let gyms: [BackupGym] let problems: [BackupProblem] let sessions: [BackupClimbSession] diff --git a/ios/Ascently/Services/Sync/ServerSyncProvider.swift b/ios/Ascently/Services/Sync/ServerSyncProvider.swift index 36ccb0b..21c9ade 100644 --- a/ios/Ascently/Services/Sync/ServerSyncProvider.swift +++ b/ios/Ascently/Services/Sync/ServerSyncProvider.swift @@ -71,8 +71,6 @@ class ServerSyncProvider: SyncProvider { throw SyncError.notConnected } - // 1. Priority: Delta Sync - // If we have synced before, assume we want to continue with delta sync if lastSyncTime != nil { AppLogger.info("Last sync time found, attempting delta sync", tag: logTag) do { @@ -81,18 +79,12 @@ class ServerSyncProvider: SyncProvider { return } catch { AppLogger.error("Delta sync failed, falling back to full sync check: \(error)", tag: logTag) - // Fallthrough to full sync logic } } - // 2. Full Sync Logic - // Get local backup data let localBackup = createBackupFromDataManager(dataManager) - - // Download server data let serverBackup = try await downloadData() - // Check if we have any local data let hasLocalData = !dataManager.gyms.isEmpty || !dataManager.problems.isEmpty || !dataManager.sessions.isEmpty || !dataManager.attempts.isEmpty @@ -219,7 +211,6 @@ class ServerSyncProvider: SyncProvider { let formatter = ISO8601DateFormatter() let lastSyncString = formatter.string(from: lastSync) - // Collect items modified since last sync var modifiedGyms = dataManager.gyms.filter { gym in gym.updatedAt > lastSync }.map { BackupGym(from: $0) } @@ -249,7 +240,6 @@ class ServerSyncProvider: SyncProvider { !activeSessionIds.contains(attempt.sessionId) && attempt.createdAt > lastSync }.map { BackupAttempt(from: $0) } - // Handle deleted items as tombstones let deletedItems = dataManager.getDeletedItems().filter { item in if let deletedDate = formatter.date(from: item.deletedAt) { return deletedDate > lastSync @@ -316,6 +306,11 @@ class ServerSyncProvider: SyncProvider { let decoder = JSONDecoder() let deltaResponse = try decoder.decode(DeltaSyncResponse.self, from: data) + if let requestFullSync = deltaResponse.requestFullSync, requestFullSync { + AppLogger.info("Server requested full sync", tag: logTag) + throw SyncError.serverError(412) + } + AppLogger.info( "Delta Sync: Received gyms=\(deltaResponse.gyms.count), problems=\(deltaResponse.problems.count), sessions=\(deltaResponse.sessions.count), attempts=\(deltaResponse.attempts.count)", tag: logTag @@ -337,7 +332,6 @@ class ServerSyncProvider: SyncProvider { let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] - // 1. Download images for problems that are NOT deleted var imagePathMapping: [String: String] = [:] for problem in response.problems { if let isDeleted = problem.isDeleted, isDeleted { continue } @@ -359,9 +353,7 @@ class ServerSyncProvider: SyncProvider { } } - // 2. Merge Gyms for backupGym in response.gyms { - // Handle Soft Delete if let isDeleted = backupGym.isDeleted, isDeleted { if let index = dataManager.gyms.firstIndex(where: { $0.id.uuidString == backupGym.id }) { let existing = dataManager.gyms[index] @@ -373,7 +365,6 @@ class ServerSyncProvider: SyncProvider { continue } - // Handle Update/Insert if let index = dataManager.gyms.firstIndex(where: { $0.id.uuidString == backupGym.id }) { let existing = dataManager.gyms[index] if let serverUpdate = formatter.date(from: backupGym.updatedAt), @@ -385,7 +376,6 @@ class ServerSyncProvider: SyncProvider { } } - // 3. Merge Problems for backupProblem in response.problems { if let isDeleted = backupProblem.isDeleted, isDeleted { if let index = dataManager.problems.firstIndex(where: { $0.id.uuidString == backupProblem.id }) { @@ -415,7 +405,6 @@ class ServerSyncProvider: SyncProvider { } } - // 4. Merge Sessions for backupSession in response.sessions { if let isDeleted = backupSession.isDeleted, isDeleted { if let index = dataManager.sessions.firstIndex(where: { $0.id.uuidString == backupSession.id }) { @@ -439,7 +428,6 @@ class ServerSyncProvider: SyncProvider { } } - // 5. Merge Attempts for backupAttempt in response.attempts { if let isDeleted = backupAttempt.isDeleted, isDeleted { if let index = dataManager.attempts.firstIndex(where: { $0.id.uuidString == backupAttempt.id }) { @@ -477,7 +465,7 @@ class ServerSyncProvider: SyncProvider { for problem in modifiedProblems { guard let imagePaths = problem.imagePaths else { continue } for path in imagePaths { - if let data = ImageManager.shared.getImageData(filename: path) { + if let data = ImageManager.shared.loadImageData(fromPath: path) { try await uploadImage(filename: path, imageData: data) } } @@ -549,7 +537,7 @@ class ServerSyncProvider: SyncProvider { private func syncImagesToServer(dataManager: ClimbingDataManager) async throws { for problem in dataManager.problems { for path in problem.imagePaths { - if let data = ImageManager.shared.getImageData(filename: path) { + if let data = ImageManager.shared.loadImageData(fromPath: path) { try await uploadImage(filename: path, imageData: data) } } @@ -568,19 +556,15 @@ class ServerSyncProvider: SyncProvider { gyms: gyms, problems: problems, sessions: sessions, - attempts: attempts, - deletedItems: [] // Legacy field, empty + attempts: attempts ) } private func mergeDataSafely(localBackup: ClimbDataBackup, serverBackup: ClimbDataBackup, dataManager: ClimbingDataManager) async throws { - // Basic full merge that prefers server data if newer let formatter = ISO8601DateFormatter() formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] - // Merging Gyms for gym in serverBackup.gyms { - // Check for soft delete if let isDeleted = gym.isDeleted, isDeleted { if let index = dataManager.gyms.firstIndex(where: { $0.id.uuidString == gym.id }) { let existing = dataManager.gyms[index] @@ -591,7 +575,6 @@ class ServerSyncProvider: SyncProvider { continue } - // Update or Insert if let index = dataManager.gyms.firstIndex(where: { $0.id.uuidString == gym.id }) { let existing = dataManager.gyms[index] if let serverUpdate = formatter.date(from: gym.updatedAt), serverUpdate >= existing.updatedAt { @@ -602,7 +585,6 @@ class ServerSyncProvider: SyncProvider { } } - // Merging Problems for problem in serverBackup.problems { if let isDeleted = problem.isDeleted, isDeleted { if let index = dataManager.problems.firstIndex(where: { $0.id.uuidString == problem.id }) { @@ -624,7 +606,6 @@ class ServerSyncProvider: SyncProvider { } } - // Merging Sessions for session in serverBackup.sessions { if let isDeleted = session.isDeleted, isDeleted { if let index = dataManager.sessions.firstIndex(where: { $0.id.uuidString == session.id }) { @@ -646,7 +627,6 @@ class ServerSyncProvider: SyncProvider { } } - // Merging Attempts for attempt in serverBackup.attempts { if let isDeleted = attempt.isDeleted, isDeleted { if let index = dataManager.attempts.firstIndex(where: { $0.id.uuidString == attempt.id }) { @@ -680,7 +660,6 @@ class ServerSyncProvider: SyncProvider { _ backup: ClimbDataBackup, dataManager: ClimbingDataManager, imagePathMapping: [String: String] = [:] ) throws { - // Logic from previous read let updatedProblems = backup.problems.map { problem in let updatedImagePaths = problem.imagePaths?.compactMap { oldPath in imagePathMapping[oldPath] ?? oldPath @@ -688,7 +667,6 @@ class ServerSyncProvider: SyncProvider { return problem.withUpdatedImagePaths(updatedImagePaths) } - // Re-construct data, filtering out deleted items (tombstones) dataManager.gyms = try backup.gyms.compactMap { gym in if let isDeleted = gym.isDeleted, isDeleted { return nil } return try gym.toGym() diff --git a/ios/Ascently/Services/Sync/SyncMerger.swift b/ios/Ascently/Services/Sync/SyncMerger.swift deleted file mode 100644 index 8600400..0000000 --- a/ios/Ascently/Services/Sync/SyncMerger.swift +++ /dev/null @@ -1,179 +0,0 @@ -import Foundation - -struct SyncMerger { - private static let logTag = "SyncMerger" - - static func mergeDataSafely( - localBackup: ClimbDataBackup, - serverBackup: ClimbDataBackup, - dataManager: ClimbingDataManager, - imagePathMapping: [String: String] - ) throws -> (gyms: [Gym], problems: [Problem], sessions: [ClimbSession], attempts: [Attempt], uniqueDeletions: [DeletedItem]) { - - // Merge deletion lists first to prevent resurrection of deleted items - let localDeletions = dataManager.getDeletedItems() - let allDeletions = localDeletions + serverBackup.deletedItems - let uniqueDeletions = Array(Set(allDeletions)) - - AppLogger.info("Merging gyms...", tag: logTag) - let mergedGyms = mergeGyms( - local: dataManager.gyms, - server: serverBackup.gyms, - deletedItems: uniqueDeletions) - - AppLogger.info("Merging problems...", tag: logTag) - let mergedProblems = try mergeProblems( - local: dataManager.problems, - server: serverBackup.problems, - imagePathMapping: imagePathMapping, - deletedItems: uniqueDeletions) - - AppLogger.info("Merging sessions...", tag: logTag) - let mergedSessions = try mergeSessions( - local: dataManager.sessions, - server: serverBackup.sessions, - deletedItems: uniqueDeletions) - - AppLogger.info("Merging attempts...", tag: logTag) - let mergedAttempts = try mergeAttempts( - local: dataManager.attempts, - server: serverBackup.attempts, - deletedItems: uniqueDeletions) - - return (mergedGyms, mergedProblems, mergedSessions, mergedAttempts, uniqueDeletions) - } - - private static func mergeGyms(local: [Gym], server: [BackupGym], deletedItems: [DeletedItem]) -> [Gym] { - var merged = local - let deletedGymIds = Set(deletedItems.filter { $0.type == "gym" }.map { $0.id }) - let localGymIds = Set(local.map { $0.id.uuidString }) - - 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 = localGymIds.contains(serverGym.id) - let isDeleted = deletedGymIds.contains(serverGym.id) - - if !localHasGym && !isDeleted { - merged.append(serverGymConverted) - } - } - } - - return merged - } - - private static 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 }) - let localProblemIds = Set(local.map { $0.id.uuidString }) - - merged.removeAll { deletedProblemIds.contains($0.id.uuidString) } - - for serverProblem in server { - let localHasProblem = localProblemIds.contains(serverProblem.id) - let isDeleted = deletedProblemIds.contains(serverProblem.id) - - if !localHasProblem && !isDeleted { - var problemToAdd = serverProblem - - if !imagePathMapping.isEmpty, let imagePaths = serverProblem.imagePaths, !imagePaths.isEmpty { - let updatedImagePaths = imagePaths.compactMap { oldPath in - imagePathMapping[oldPath] ?? oldPath - } - if updatedImagePaths != imagePaths { - 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() { - merged.append(serverProblemConverted) - } - } - } - - return merged - } - - private static func mergeSessions( - local: [ClimbSession], server: [BackupClimbSession], deletedItems: [DeletedItem] - ) throws -> [ClimbSession] { - var merged = local - let deletedSessionIds = Set(deletedItems.filter { $0.type == "session" }.map { $0.id }) - let localSessionIds = Set(local.map { $0.id.uuidString }) - - merged.removeAll { session in - deletedSessionIds.contains(session.id.uuidString) && session.status != .active - } - - for serverSession in server { - let localHasSession = localSessionIds.contains(serverSession.id) - let isDeleted = deletedSessionIds.contains(serverSession.id) - - if !localHasSession && !isDeleted { - if let serverSessionConverted = try? serverSession.toClimbSession() { - merged.append(serverSessionConverted) - } - } - } - - return merged - } - - private static func mergeAttempts( - local: [Attempt], server: [BackupAttempt], deletedItems: [DeletedItem] - ) throws -> [Attempt] { - var merged = local - let deletedAttemptIds = Set(deletedItems.filter { $0.type == "attempt" }.map { $0.id }) - let localAttemptIds = Set(local.map { $0.id.uuidString }) - - // Get active session IDs to protect their attempts - let activeSessionIds = Set( - local.compactMap { attempt in - return attempt.sessionId - }.filter { _ in - 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) - } - - for serverAttempt in server { - let localHasAttempt = localAttemptIds.contains(serverAttempt.id) - let isDeleted = deletedAttemptIds.contains(serverAttempt.id) - - if !localHasAttempt && !isDeleted { - if let serverAttemptConverted = try? serverAttempt.toAttempt() { - merged.append(serverAttemptConverted) - } - } - } - - return merged - } -} diff --git a/ios/Ascently/ViewModels/ClimbingDataManager.swift b/ios/Ascently/ViewModels/ClimbingDataManager.swift index f44f31c..20deb6e 100644 --- a/ios/Ascently/ViewModels/ClimbingDataManager.swift +++ b/ios/Ascently/ViewModels/ClimbingDataManager.swift @@ -631,6 +631,34 @@ class ClimbingDataManager: ObservableObject { userDefaults.removeObject(forKey: Keys.deletedItems) } + func cleanupOldDeletions() { + guard let data = userDefaults.data(forKey: Keys.deletedItems), + let deletions = try? decoder.decode([DeletedItem].self, from: data) + else { + return + } + + let cutoffDate = Date().addingTimeInterval(-90 * 24 * 60 * 60) // 90 days ago + let formatter = ISO8601DateFormatter() + formatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] + + let validDeletions = deletions.filter { item in + if let date = formatter.date(from: item.deletedAt) { + return date > cutoffDate + } + return false + } + + if validDeletions.count < deletions.count { + if let encodedData = try? encoder.encode(validDeletions) { + userDefaults.set(encodedData, forKey: Keys.deletedItems) + AppLogger.info( + "Cleaned up \(deletions.count - validDeletions.count) old deletion records", + tag: "ClimbingDataManager") + } + } + } + func attempts(forProblem problemId: UUID) -> [Attempt] { return attempts.filter { $0.problemId == problemId }.sorted { $0.timestamp > $1.timestamp } } @@ -669,6 +697,7 @@ class ClimbingDataManager: ObservableObject { } private func cleanupOrphanedData() { + cleanupOldDeletions() let validSessionIds = Set(sessions.map { $0.id }) let validProblemIds = Set(problems.map { $0.id }) let validGymIds = Set(gyms.map { $0.id }) diff --git a/sync/go.mod b/sync/go.mod index 3bb9e3e..7d0ed6b 100644 --- a/sync/go.mod +++ b/sync/go.mod @@ -1,3 +1,5 @@ module ascently-sync go 1.25 + +require github.com/joho/godotenv v1.5.1 diff --git a/sync/go.sum b/sync/go.sum new file mode 100644 index 0000000..d61b19e --- /dev/null +++ b/sync/go.sum @@ -0,0 +1,2 @@ +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= diff --git a/sync/main.go b/sync/main.go index 12d44e1..64b2c68 100644 --- a/sync/main.go +++ b/sync/main.go @@ -11,16 +11,11 @@ import ( "path/filepath" "strings" "time" + + "github.com/joho/godotenv" ) -const VERSION = "2.4.0" - -func min(a, b int) int { - if a < b { - return a - } - return b -} +const VERSION = "2.5.0" type ClimbDataBackup struct { ExportedAt string `json:"exportedAt"` @@ -41,11 +36,12 @@ type DeltaSyncRequest struct { } type DeltaSyncResponse struct { - ServerTime string `json:"serverTime"` - Gyms []BackupGym `json:"gyms"` - Problems []BackupProblem `json:"problems"` - Sessions []BackupClimbSession `json:"sessions"` - Attempts []BackupAttempt `json:"attempts"` + ServerTime string `json:"serverTime"` + RequestFullSync bool `json:"requestFullSync,omitempty"` + Gyms []BackupGym `json:"gyms"` + Problems []BackupProblem `json:"problems"` + Sessions []BackupClimbSession `json:"sessions"` + Attempts []BackupAttempt `json:"attempts"` } type BackupGym struct { @@ -282,6 +278,81 @@ func (s *SyncServer) mergeAttempts(existing []BackupAttempt, updates []BackupAtt return result } +func (s *SyncServer) cleanupTombstones(backup *ClimbDataBackup) { + cutoffTime := time.Now().UTC().Add(-90 * 24 * time.Hour) + log.Printf("Cleaning up tombstones older than %s", cutoffTime.Format(time.RFC3339)) + + // Gyms + activeGyms := make([]BackupGym, 0, len(backup.Gyms)) + for _, item := range backup.Gyms { + if !item.IsDeleted { + activeGyms = append(activeGyms, item) + continue + } + updatedAt, err := time.Parse(time.RFC3339, item.UpdatedAt) + if err == nil && updatedAt.After(cutoffTime) { + activeGyms = append(activeGyms, item) + } else { + log.Printf("Pruning deleted gym: %s", item.ID) + } + } + backup.Gyms = activeGyms + + // Problems + activeProblems := make([]BackupProblem, 0, len(backup.Problems)) + for _, item := range backup.Problems { + if !item.IsDeleted { + activeProblems = append(activeProblems, item) + continue + } + updatedAt, err := time.Parse(time.RFC3339, item.UpdatedAt) + if err == nil && updatedAt.After(cutoffTime) { + activeProblems = append(activeProblems, item) + } else { + log.Printf("Pruning deleted problem: %s", item.ID) + } + } + backup.Problems = activeProblems + + // Sessions + activeSessions := make([]BackupClimbSession, 0, len(backup.Sessions)) + for _, item := range backup.Sessions { + if !item.IsDeleted { + activeSessions = append(activeSessions, item) + continue + } + updatedAt, err := time.Parse(time.RFC3339, item.UpdatedAt) + if err == nil && updatedAt.After(cutoffTime) { + activeSessions = append(activeSessions, item) + } else { + log.Printf("Pruning deleted session: %s", item.ID) + } + } + backup.Sessions = activeSessions + + // Attempts + activeAttempts := make([]BackupAttempt, 0, len(backup.Attempts)) + for _, item := range backup.Attempts { + if !item.IsDeleted { + activeAttempts = append(activeAttempts, item) + continue + } + + timeStr := item.CreatedAt + if item.UpdatedAt != nil { + timeStr = *item.UpdatedAt + } + + updatedAt, err := time.Parse(time.RFC3339, timeStr) + if err == nil && updatedAt.After(cutoffTime) { + activeAttempts = append(activeAttempts, item) + } else { + log.Printf("Pruning deleted attempt: %s", item.ID) + } + } + backup.Attempts = activeAttempts +} + func (s *SyncServer) saveData(backup *ClimbDataBackup) error { backup.ExportedAt = time.Now().UTC().Format(time.RFC3339) @@ -339,6 +410,8 @@ func (s *SyncServer) handlePut(w http.ResponseWriter, r *http.Request) { return } + s.cleanupTombstones(&backup) + if err := s.saveData(&backup); err != nil { log.Printf("Failed to save data: %v", err) http.Error(w, "Failed to save data", http.StatusInternalServerError) @@ -476,14 +549,33 @@ func (s *SyncServer) handleDeltaSync(w http.ResponseWriter, r *http.Request) { return } + clientLastSyncCheck, err := time.Parse(time.RFC3339, deltaRequest.LastSyncTime) + isServerEmpty := len(serverBackup.Gyms) == 0 && len(serverBackup.Problems) == 0 && + len(serverBackup.Sessions) == 0 && len(serverBackup.Attempts) == 0 + + if err == nil && !clientLastSyncCheck.IsZero() && isServerEmpty { + log.Printf("Server is empty but client has sync history. Requesting full sync.") + response := DeltaSyncResponse{ + ServerTime: time.Now().UTC().Format(time.RFC3339), + RequestFullSync: true, + Gyms: []BackupGym{}, + Problems: []BackupProblem{}, + Sessions: []BackupClimbSession{}, + Attempts: []BackupAttempt{}, + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(response) + return + } + // Merge client changes into server data - // Note: We no longer need separate deletion handling as IsDeleted is part of the struct - // and handled by standard merge logic (latest timestamp wins) serverBackup.Gyms = s.mergeGyms(serverBackup.Gyms, deltaRequest.Gyms) serverBackup.Problems = s.mergeProblems(serverBackup.Problems, deltaRequest.Problems) serverBackup.Sessions = s.mergeSessions(serverBackup.Sessions, deltaRequest.Sessions) serverBackup.Attempts = s.mergeAttempts(serverBackup.Attempts, deltaRequest.Attempts) + s.cleanupTombstones(serverBackup) + // Save merged data if err := s.saveData(serverBackup); err != nil { log.Printf("Failed to save data: %v", err) @@ -565,7 +657,9 @@ func (s *SyncServer) handleSync(w http.ResponseWriter, r *http.Request) { } func main() { + godotenv.Load() authToken := os.Getenv("AUTH_TOKEN") + print(authToken) if authToken == "" { log.Fatal("AUTH_TOKEN environment variable is required") } diff --git a/sync/sync_test.go b/sync/sync_test.go deleted file mode 100644 index f0b0161..0000000 --- a/sync/sync_test.go +++ /dev/null @@ -1,501 +0,0 @@ -package main - -import ( - "path/filepath" - "testing" - "time" -) - -// TestDeltaSyncDeletedItemResurrection verifies deleted items don't resurrect -func TestDeltaSyncDeletedItemResurrection(t *testing.T) { - tempDir := t.TempDir() - server := &SyncServer{ - dataFile: filepath.Join(tempDir, "test.json"), - imagesDir: filepath.Join(tempDir, "images"), - authToken: "test-token", - } - - // Initial state: Server has one gym, one problem, one session with 8 attempts - now := time.Now().UTC() - gymID := "gym-1" - problemID := "problem-1" - sessionID := "session-1" - - initialBackup := &ClimbDataBackup{ - Version: "2.0", - FormatVersion: "2.0", - Gyms: []BackupGym{ - { - ID: gymID, - Name: "Test Gym", - SupportedClimbTypes: []string{"BOULDER"}, - DifficultySystems: []string{"V"}, - CreatedAt: now.Add(-1 * time.Hour).Format(time.RFC3339), - UpdatedAt: now.Add(-1 * time.Hour).Format(time.RFC3339), - }, - }, - Problems: []BackupProblem{ - { - ID: problemID, - GymID: gymID, - ClimbType: "BOULDER", - Difficulty: DifficultyGrade{ - System: "V", - Grade: "V5", - NumericValue: 5, - }, - IsActive: true, - CreatedAt: now.Add(-1 * time.Hour).Format(time.RFC3339), - UpdatedAt: now.Add(-1 * time.Hour).Format(time.RFC3339), - }, - }, - Sessions: []BackupClimbSession{ - { - ID: sessionID, - GymID: gymID, - Date: now.Format("2006-01-02"), - Status: "completed", - CreatedAt: now.Add(-30 * time.Minute).Format(time.RFC3339), - UpdatedAt: now.Add(-30 * time.Minute).Format(time.RFC3339), - }, - }, - Attempts: []BackupAttempt{}, - DeletedItems: []DeletedItem{}, - } - - // Add 8 attempts - for i := 0; i < 8; i++ { - attempt := BackupAttempt{ - ID: "attempt-" + string(rune('1'+i)), - SessionID: sessionID, - ProblemID: problemID, - Result: "COMPLETED", - Timestamp: now.Add(time.Duration(-25+i) * time.Minute).Format(time.RFC3339), - CreatedAt: now.Add(time.Duration(-25+i) * time.Minute).Format(time.RFC3339), - } - initialBackup.Attempts = append(initialBackup.Attempts, attempt) - } - - if err := server.saveData(initialBackup); err != nil { - t.Fatalf("Failed to save initial data: %v", err) - } - - // Client 1 syncs - gets all data - client1LastSync := now.Add(-2 * time.Hour).Format(time.RFC3339) - deltaRequest1 := DeltaSyncRequest{ - LastSyncTime: client1LastSync, - Gyms: []BackupGym{}, - Problems: []BackupProblem{}, - Sessions: []BackupClimbSession{}, - Attempts: []BackupAttempt{}, - DeletedItems: []DeletedItem{}, - } - - // Simulate delta sync for client 1 - serverBackup, _ := server.loadData() - serverBackup.DeletedItems = server.mergeDeletedItems(serverBackup.DeletedItems, deltaRequest1.DeletedItems) - server.applyDeletions(serverBackup, serverBackup.DeletedItems) - - if len(serverBackup.Sessions) != 1 { - t.Errorf("Expected 1 session after client1 sync, got %d", len(serverBackup.Sessions)) - } - if len(serverBackup.Attempts) != 8 { - t.Errorf("Expected 8 attempts after client1 sync, got %d", len(serverBackup.Attempts)) - } - - // Client 1 deletes the session locally - deleteTime := now.Format(time.RFC3339) - deletions := []DeletedItem{ - {ID: sessionID, Type: "session", DeletedAt: deleteTime}, - } - // Also track attempt deletions - for _, attempt := range initialBackup.Attempts { - deletions = append(deletions, DeletedItem{ - ID: attempt.ID, - Type: "attempt", - DeletedAt: deleteTime, - }) - } - - // Client 1 syncs deletion - deltaRequest2 := DeltaSyncRequest{ - LastSyncTime: now.Add(-5 * time.Minute).Format(time.RFC3339), - Gyms: []BackupGym{}, - Problems: []BackupProblem{}, - Sessions: []BackupClimbSession{}, - Attempts: []BackupAttempt{}, - DeletedItems: deletions, - } - - // Server processes deletion - serverBackup, _ = server.loadData() - serverBackup.DeletedItems = server.mergeDeletedItems(serverBackup.DeletedItems, deltaRequest2.DeletedItems) - server.applyDeletions(serverBackup, serverBackup.DeletedItems) - server.saveData(serverBackup) - - // Verify deletions were applied on server - serverBackup, _ = server.loadData() - if len(serverBackup.Sessions) != 0 { - t.Errorf("Expected 0 sessions after deletion, got %d", len(serverBackup.Sessions)) - } - if len(serverBackup.Attempts) != 0 { - t.Errorf("Expected 0 attempts after deletion, got %d", len(serverBackup.Attempts)) - } - if len(serverBackup.DeletedItems) != 9 { - t.Errorf("Expected 9 deletion records, got %d", len(serverBackup.DeletedItems)) - } - - // Client does local reset and pulls from server - deltaRequest3 := DeltaSyncRequest{ - LastSyncTime: time.Time{}.Format(time.RFC3339), - Gyms: []BackupGym{}, - Problems: []BackupProblem{}, - Sessions: []BackupClimbSession{}, - Attempts: []BackupAttempt{}, - DeletedItems: []DeletedItem{}, - } - - serverBackup, _ = server.loadData() - clientLastSync, _ := time.Parse(time.RFC3339, deltaRequest3.LastSyncTime) - - // Build response - response := DeltaSyncResponse{ - ServerTime: time.Now().UTC().Format(time.RFC3339), - Gyms: []BackupGym{}, - Problems: []BackupProblem{}, - Sessions: []BackupClimbSession{}, - Attempts: []BackupAttempt{}, - DeletedItems: []DeletedItem{}, - } - - // Build deleted item map - deletedItemMap := make(map[string]bool) - for _, item := range serverBackup.DeletedItems { - key := item.Type + ":" + item.ID - deletedItemMap[key] = true - } - - // Filter sessions (excluding deleted) - for _, session := range serverBackup.Sessions { - if deletedItemMap["session:"+session.ID] { - continue - } - sessionTime, _ := time.Parse(time.RFC3339, session.UpdatedAt) - if sessionTime.After(clientLastSync) { - response.Sessions = append(response.Sessions, session) - } - } - - // Filter attempts (excluding deleted) - for _, attempt := range serverBackup.Attempts { - if deletedItemMap["attempt:"+attempt.ID] { - continue - } - attemptTime, _ := time.Parse(time.RFC3339, attempt.CreatedAt) - if attemptTime.After(clientLastSync) { - response.Attempts = append(response.Attempts, attempt) - } - } - - // Send deletion records - for _, deletion := range serverBackup.DeletedItems { - deletionTime, _ := time.Parse(time.RFC3339, deletion.DeletedAt) - if deletionTime.After(clientLastSync) { - response.DeletedItems = append(response.DeletedItems, deletion) - } - } - - if len(response.Sessions) != 0 { - t.Errorf("Deleted session was resurrected! Got %d sessions in response", len(response.Sessions)) - } - if len(response.Attempts) != 0 { - t.Errorf("Deleted attempts were resurrected! Got %d attempts in response", len(response.Attempts)) - } - if len(response.DeletedItems) < 9 { - t.Errorf("Expected at least 9 deletion records in response, got %d", len(response.DeletedItems)) - } -} - -// TestDeltaSyncAttemptCount verifies all attempts are preserved -func TestDeltaSyncAttemptCount(t *testing.T) { - tempDir := t.TempDir() - server := &SyncServer{ - dataFile: filepath.Join(tempDir, "test.json"), - imagesDir: filepath.Join(tempDir, "images"), - authToken: "test-token", - } - - now := time.Now().UTC() - gymID := "gym-1" - problemID := "problem-1" - sessionID := "session-1" - - // Create session with 8 attempts - initialBackup := &ClimbDataBackup{ - Version: "2.0", - FormatVersion: "2.0", - Gyms: []BackupGym{{ID: gymID, Name: "Test Gym", SupportedClimbTypes: []string{"BOULDER"}, DifficultySystems: []string{"V"}, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Problems: []BackupProblem{{ID: problemID, GymID: gymID, ClimbType: "BOULDER", Difficulty: DifficultyGrade{System: "V", Grade: "V5", NumericValue: 5}, IsActive: true, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Sessions: []BackupClimbSession{{ID: sessionID, GymID: gymID, Date: now.Format("2006-01-02"), Status: "completed", CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Attempts: []BackupAttempt{}, - DeletedItems: []DeletedItem{}, - } - - // Add 8 attempts at different times - baseTime := now.Add(-30 * time.Minute) - for i := 0; i < 8; i++ { - attempt := BackupAttempt{ - ID: "attempt-" + string(rune('1'+i)), - SessionID: sessionID, - ProblemID: problemID, - Result: "COMPLETED", - Timestamp: baseTime.Add(time.Duration(i) * time.Minute).Format(time.RFC3339), - CreatedAt: baseTime.Add(time.Duration(i) * time.Minute).Format(time.RFC3339), - } - initialBackup.Attempts = append(initialBackup.Attempts, attempt) - } - - if err := server.saveData(initialBackup); err != nil { - t.Fatalf("Failed to save initial data: %v", err) - } - - // Client syncs with lastSyncTime BEFORE all attempts were created - clientLastSync := baseTime.Add(-1 * time.Hour) - - serverBackup, _ := server.loadData() - - // Count attempts that should be returned - attemptCount := 0 - for _, attempt := range serverBackup.Attempts { - attemptTime, _ := time.Parse(time.RFC3339, attempt.CreatedAt) - if attemptTime.After(clientLastSync) { - attemptCount++ - } - } - - if attemptCount != 8 { - t.Errorf("Expected all 8 attempts to be returned, got %d", attemptCount) - } - -} - -// TestTombstoneCleanup verifies old deletion records are cleaned up -func TestTombstoneCleanup(t *testing.T) { - server := &SyncServer{} - - now := time.Now().UTC() - oldDeletion := DeletedItem{ - ID: "old-item", - Type: "session", - DeletedAt: now.Add(-31 * 24 * time.Hour).Format(time.RFC3339), // 31 days old - } - recentDeletion := DeletedItem{ - ID: "recent-item", - Type: "session", - DeletedAt: now.Add(-1 * 24 * time.Hour).Format(time.RFC3339), // 1 day old - } - - existing := []DeletedItem{oldDeletion} - updates := []DeletedItem{recentDeletion} - - merged := server.mergeDeletedItems(existing, updates) - - // Old deletion should be cleaned up, only recent one remains - if len(merged) != 1 { - t.Errorf("Expected 1 deletion record after cleanup, got %d", len(merged)) - } - if len(merged) > 0 && merged[0].ID != "recent-item" { - t.Errorf("Expected recent deletion to remain, got %s", merged[0].ID) - } - -} - -// TestMergeDeletedItemsDeduplication verifies duplicate deletions are handled -func TestMergeDeletedItemsDeduplication(t *testing.T) { - server := &SyncServer{} - - now := time.Now().UTC() - deletion1 := DeletedItem{ - ID: "item-1", - Type: "session", - DeletedAt: now.Add(-1 * time.Hour).Format(time.RFC3339), - } - deletion2 := DeletedItem{ - ID: "item-1", - Type: "session", - DeletedAt: now.Format(time.RFC3339), // Newer timestamp - } - - existing := []DeletedItem{deletion1} - updates := []DeletedItem{deletion2} - - merged := server.mergeDeletedItems(existing, updates) - - if len(merged) != 1 { - t.Errorf("Expected 1 deletion record, got %d", len(merged)) - } - if len(merged) > 0 && merged[0].DeletedAt != deletion2.DeletedAt { - t.Errorf("Expected newer deletion timestamp to be kept") - } - -} - -// TestApplyDeletions verifies deletions are applied correctly -func TestApplyDeletions(t *testing.T) { - server := &SyncServer{} - - now := time.Now().UTC() - backup := &ClimbDataBackup{ - Version: "2.0", - FormatVersion: "2.0", - Gyms: []BackupGym{{ID: "gym-1", Name: "Test Gym", SupportedClimbTypes: []string{}, DifficultySystems: []string{}, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Problems: []BackupProblem{{ID: "problem-1", GymID: "gym-1", ClimbType: "BOULDER", Difficulty: DifficultyGrade{System: "V", Grade: "V5", NumericValue: 5}, IsActive: true, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Sessions: []BackupClimbSession{{ID: "session-1", GymID: "gym-1", Date: now.Format("2006-01-02"), Status: "completed", CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Attempts: []BackupAttempt{{ID: "attempt-1", SessionID: "session-1", ProblemID: "problem-1", Result: "COMPLETED", Timestamp: now.Format(time.RFC3339), CreatedAt: now.Format(time.RFC3339)}}, - DeletedItems: []DeletedItem{}, - } - - deletions := []DeletedItem{ - {ID: "session-1", Type: "session", DeletedAt: now.Format(time.RFC3339)}, - {ID: "attempt-1", Type: "attempt", DeletedAt: now.Format(time.RFC3339)}, - } - - server.applyDeletions(backup, deletions) - - if len(backup.Sessions) != 0 { - t.Errorf("Expected 0 sessions after deletion, got %d", len(backup.Sessions)) - } - if len(backup.Attempts) != 0 { - t.Errorf("Expected 0 attempts after deletion, got %d", len(backup.Attempts)) - } - if len(backup.Gyms) != 1 { - t.Errorf("Expected gym to remain, got %d gyms", len(backup.Gyms)) - } - if len(backup.Problems) != 1 { - t.Errorf("Expected problem to remain, got %d problems", len(backup.Problems)) - } - -} - -// TestCascadingDeletions verifies related items are handled properly -func TestCascadingDeletions(t *testing.T) { - server := &SyncServer{} - - now := time.Now().UTC() - sessionID := "session-1" - backup := &ClimbDataBackup{ - Version: "2.0", - FormatVersion: "2.0", - Gyms: []BackupGym{{ID: "gym-1", Name: "Test Gym", SupportedClimbTypes: []string{}, DifficultySystems: []string{}, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Problems: []BackupProblem{{ID: "problem-1", GymID: "gym-1", ClimbType: "BOULDER", Difficulty: DifficultyGrade{System: "V", Grade: "V5", NumericValue: 5}, IsActive: true, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Sessions: []BackupClimbSession{{ID: sessionID, GymID: "gym-1", Date: now.Format("2006-01-02"), Status: "completed", CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Attempts: []BackupAttempt{}, - DeletedItems: []DeletedItem{}, - } - - // Add multiple attempts for the session - for i := 0; i < 5; i++ { - backup.Attempts = append(backup.Attempts, BackupAttempt{ - ID: "attempt-" + string(rune('1'+i)), - SessionID: sessionID, - ProblemID: "problem-1", - Result: "COMPLETED", - Timestamp: now.Format(time.RFC3339), - CreatedAt: now.Format(time.RFC3339), - }) - } - - // Delete session - attempts should also be tracked as deleted - deletions := []DeletedItem{ - {ID: sessionID, Type: "session", DeletedAt: now.Format(time.RFC3339)}, - } - for _, attempt := range backup.Attempts { - deletions = append(deletions, DeletedItem{ - ID: attempt.ID, - Type: "attempt", - DeletedAt: now.Format(time.RFC3339), - }) - } - - server.applyDeletions(backup, deletions) - - if len(backup.Sessions) != 0 { - t.Errorf("Expected session to be deleted, got %d sessions", len(backup.Sessions)) - } - if len(backup.Attempts) != 0 { - t.Errorf("Expected all attempts to be deleted, got %d attempts", len(backup.Attempts)) - } - -} - -// TestFullSyncAfterReset verifies the reported user scenario -func TestFullSyncAfterReset(t *testing.T) { - tempDir := t.TempDir() - server := &SyncServer{ - dataFile: filepath.Join(tempDir, "test.json"), - imagesDir: filepath.Join(tempDir, "images"), - authToken: "test-token", - } - - now := time.Now().UTC() - - // Initial sync with data - initialData := &ClimbDataBackup{ - Version: "2.0", - FormatVersion: "2.0", - Gyms: []BackupGym{{ID: "gym-1", Name: "Test Gym", SupportedClimbTypes: []string{"BOULDER"}, DifficultySystems: []string{"V"}, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Problems: []BackupProblem{{ID: "problem-1", GymID: "gym-1", ClimbType: "BOULDER", Difficulty: DifficultyGrade{System: "V", Grade: "V5", NumericValue: 5}, IsActive: true, CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Sessions: []BackupClimbSession{{ID: "session-1", GymID: "gym-1", Date: now.Format("2006-01-02"), Status: "completed", CreatedAt: now.Format(time.RFC3339), UpdatedAt: now.Format(time.RFC3339)}}, - Attempts: []BackupAttempt{}, - DeletedItems: []DeletedItem{}, - } - for i := 0; i < 8; i++ { - initialData.Attempts = append(initialData.Attempts, BackupAttempt{ - ID: "attempt-" + string(rune('1'+i)), - SessionID: "session-1", - ProblemID: "problem-1", - Result: "COMPLETED", - Timestamp: now.Add(time.Duration(i) * time.Minute).Format(time.RFC3339), - CreatedAt: now.Add(time.Duration(i) * time.Minute).Format(time.RFC3339), - }) - } - server.saveData(initialData) - - // Client deletes everything and syncs - deletions := []DeletedItem{ - {ID: "gym-1", Type: "gym", DeletedAt: now.Add(10 * time.Minute).Format(time.RFC3339)}, - {ID: "problem-1", Type: "problem", DeletedAt: now.Add(10 * time.Minute).Format(time.RFC3339)}, - {ID: "session-1", Type: "session", DeletedAt: now.Add(10 * time.Minute).Format(time.RFC3339)}, - } - for i := 0; i < 8; i++ { - deletions = append(deletions, DeletedItem{ - ID: "attempt-" + string(rune('1'+i)), - Type: "attempt", - DeletedAt: now.Add(10 * time.Minute).Format(time.RFC3339), - }) - } - - serverBackup, _ := server.loadData() - serverBackup.DeletedItems = server.mergeDeletedItems(serverBackup.DeletedItems, deletions) - server.applyDeletions(serverBackup, serverBackup.DeletedItems) - server.saveData(serverBackup) - - // Client does local reset and pulls from server - serverBackup, _ = server.loadData() - - if len(serverBackup.Gyms) != 0 { - t.Errorf("Expected 0 gyms, got %d", len(serverBackup.Gyms)) - } - if len(serverBackup.Problems) != 0 { - t.Errorf("Expected 0 problems, got %d", len(serverBackup.Problems)) - } - if len(serverBackup.Sessions) != 0 { - t.Errorf("Expected 0 sessions, got %d", len(serverBackup.Sessions)) - } - if len(serverBackup.Attempts) != 0 { - t.Errorf("Expected 0 attempts, got %d", len(serverBackup.Attempts)) - } - if len(serverBackup.DeletedItems) == 0 { - t.Errorf("Expected deletion records, got 0") - } -}