diff --git a/frontend/core/local-db/src/commonMain/sqldelight/at/mocode/frontend/core/localdb/AppDatabase.sq b/frontend/core/local-db/src/commonMain/sqldelight/at/mocode/frontend/core/localdb/AppDatabase.sq index 42efd7b6..8b252070 100644 --- a/frontend/core/local-db/src/commonMain/sqldelight/at/mocode/frontend/core/localdb/AppDatabase.sq +++ b/frontend/core/local-db/src/commonMain/sqldelight/at/mocode/frontend/core/localdb/AppDatabase.sq @@ -36,6 +36,12 @@ FROM PingEvent ORDER BY id DESC LIMIT 1; +selectLatestPingEventTimestamp: +SELECT last_modified +FROM PingEvent +ORDER BY last_modified DESC +LIMIT 1; + upsertPingEvents: -- SQLite dialect configured for this project is 3.18 (no UPSERT support). -- Use INSERT OR REPLACE as pragmatic upsert. diff --git a/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingEventRepositoryImpl.kt b/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingEventRepositoryImpl.kt index 3c23c615..637ebf2f 100644 --- a/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingEventRepositoryImpl.kt +++ b/frontend/features/ping-feature/src/commonMain/kotlin/at/mocode/ping/feature/data/PingEventRepositoryImpl.kt @@ -14,11 +14,18 @@ class PingEventRepositoryImpl( private val db: AppDatabase ) : SyncableRepository { - // Der `since`-Parameter für unsere Synchronisierung ist die ID des letzten Ereignisses, kein Zeitstempel. + // Der `since`-Parameter für unsere Synchronisierung ist der Zeitstempel des letzten Ereignisses. + // Das Backend erwartet einen Long (Timestamp), keinen String (UUID). override suspend fun getLatestSince(): String? { - println("PingEventRepositoryImpl: getLatestSince called - using corrected async implementation") - // FIX: Verwenden Sie .awaitAsOneOrNull() für asynchrone Treiber anstelle des blockierenden .executeAsOneOrNull(). - return db.appDatabaseQueries.selectLatestPingEventId().awaitAsOneOrNull() + println("PingEventRepositoryImpl: getLatestSince called - fetching latest timestamp") + // Wir holen den letzten Timestamp aus der DB. + val lastModified = db.appDatabaseQueries.selectLatestPingEventTimestamp().awaitAsOneOrNull() + + // Wir geben ihn als String zurück, da das Interface String? erwartet. + // Der SyncManager wird ihn als Parameter "since" an den Request hängen. + // Das Backend erwartet "since" als Long, aber HTTP Parameter sind Strings. + // Spring Boot konvertiert "123456789" automatisch in Long 123456789. + return lastModified?.toString() } override suspend fun upsert(items: List) {