From 29d512c679257ec8cbe7e96c8d1dcc36b17a0b2f Mon Sep 17 00:00:00 2001 From: null Date: Tue, 16 Jun 2026 00:40:00 -0500 Subject: [PATCH] fix(couple): correct Firestore query and repository method signatures --- .../data/remote/FirestoreCoupleDataSource.kt | 51 ++++++++++++++----- .../data/repository/CoupleRepositoryImpl.kt | 4 ++ .../app/domain/repository/CoupleRepository.kt | 1 + 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/couplesconnect/app/data/remote/FirestoreCoupleDataSource.kt b/app/src/main/java/com/couplesconnect/app/data/remote/FirestoreCoupleDataSource.kt index baef45ab..80a81f85 100644 --- a/app/src/main/java/com/couplesconnect/app/data/remote/FirestoreCoupleDataSource.kt +++ b/app/src/main/java/com/couplesconnect/app/data/remote/FirestoreCoupleDataSource.kt @@ -1,6 +1,7 @@ package com.couplesconnect.app.data.remote import com.couplesconnect.app.domain.model.Couple +import com.google.firebase.firestore.DocumentSnapshot import com.google.firebase.firestore.FirebaseFirestore import com.google.firebase.firestore.SetOptions import kotlinx.coroutines.suspendCancellableCoroutine @@ -61,20 +62,44 @@ class FirestoreCoupleDataSource @Inject constructor() { coupleRef(coupleId).get() .addOnSuccessListener { snap -> if (!snap.exists()) { cont.resume(null); return@addOnSuccessListener } - @Suppress("UNCHECKED_CAST") - cont.resume( - Couple( - id = snap.id, - userIds = (snap.get("userIds") as? List) ?: emptyList(), - inviteCode = snap.getString("inviteCode") ?: "", - createdAt = snap.getLong("createdAt") ?: 0L, - currentQuestionId = snap.getString("currentQuestionId"), - streakCount = (snap.getLong("streakCount") ?: 0L).toInt(), - lastAnsweredAt = snap.getLong("lastAnsweredAt"), - activePackId = snap.getString("activePackId") - ) - ) + cont.resume(snap.toCouple()) } .addOnFailureListener { cont.resumeWithException(it) } } + + suspend fun updateStreak(coupleId: String) { + val snap = suspendCancellableCoroutine { cont -> + coupleRef(coupleId).get() + .addOnSuccessListener { cont.resume(it) } + .addOnFailureListener { cont.resumeWithException(it) } + } + val lastAnsweredAt = snap.getLong("lastAnsweredAt") ?: 0L + val now = System.currentTimeMillis() + val current = (snap.getLong("streakCount") ?: 0L).toInt() + val newStreak = if (lastAnsweredAt == 0L || now - lastAnsweredAt > TWO_DAYS_MS) 1 else current + 1 + suspendCancellableCoroutine { cont -> + coupleRef(coupleId).set( + mapOf("streakCount" to newStreak, "lastAnsweredAt" to now), + SetOptions.merge() + ) + .addOnSuccessListener { cont.resume(Unit) } + .addOnFailureListener { cont.resumeWithException(it) } + } + } + + @Suppress("UNCHECKED_CAST") + private fun DocumentSnapshot.toCouple() = Couple( + id = id, + userIds = (get("userIds") as? List) ?: emptyList(), + inviteCode = getString("inviteCode") ?: "", + createdAt = getLong("createdAt") ?: 0L, + currentQuestionId = getString("currentQuestionId"), + streakCount = (getLong("streakCount") ?: 0L).toInt(), + lastAnsweredAt = getLong("lastAnsweredAt"), + activePackId = getString("activePackId") + ) + + companion object { + private const val TWO_DAYS_MS = 48L * 60 * 60 * 1000 + } } diff --git a/app/src/main/java/com/couplesconnect/app/data/repository/CoupleRepositoryImpl.kt b/app/src/main/java/com/couplesconnect/app/data/repository/CoupleRepositoryImpl.kt index cb0cc295..72ca72a9 100644 --- a/app/src/main/java/com/couplesconnect/app/data/repository/CoupleRepositoryImpl.kt +++ b/app/src/main/java/com/couplesconnect/app/data/repository/CoupleRepositoryImpl.kt @@ -21,4 +21,8 @@ class CoupleRepositoryImpl @Inject constructor( override suspend fun createCouple(inviterUserId: String, acceptorUserId: String, inviteCode: String): Result = runCatching { coupleDataSource.createCouple(inviterUserId, acceptorUserId, inviteCode) } + + override suspend fun updateStreak(coupleId: String): Result = runCatching { + coupleDataSource.updateStreak(coupleId) + } } diff --git a/app/src/main/java/com/couplesconnect/app/domain/repository/CoupleRepository.kt b/app/src/main/java/com/couplesconnect/app/domain/repository/CoupleRepository.kt index 8965b3a8..ce5a90cb 100644 --- a/app/src/main/java/com/couplesconnect/app/domain/repository/CoupleRepository.kt +++ b/app/src/main/java/com/couplesconnect/app/domain/repository/CoupleRepository.kt @@ -5,4 +5,5 @@ import com.couplesconnect.app.domain.model.Couple interface CoupleRepository { suspend fun getCoupleForUser(userId: String): Couple? suspend fun createCouple(inviterUserId: String, acceptorUserId: String, inviteCode: String): Result + suspend fun updateStreak(coupleId: String): Result }