From b2a04b7187226bb9096b29ecb8e1dc8a9282693f Mon Sep 17 00:00:00 2001 From: null Date: Wed, 15 Jul 2026 01:53:04 -0500 Subject: [PATCH] =?UTF-8?q?chore(auth):=20delete=20dead=20hasProfile()=20?= =?UTF-8?q?=E2=80=94=20it=20was=20C-AUTH-001=20waiting=20to=20be=20called?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Final sweep after the auth hardening: audited every remaining getUser caller for the exists-but-empty trap. All are display-only (partner names/photos — a stale read shows a blank label for a frame, writes nothing, routes nothing). One finding: hasProfile() has zero callers and contains both halves of C-AUTH-001 verbatim — runCatching{...}.getOrDefault(false) turns a failed read into "has no profile", and the cache-default get() means the post-sign-in stub document reads as "no profile" too. Its name invites exactly the onboarding-routing use that just burned us, so the next person reaching for it would reintroduce the bug through the front door. Deleted from all three layers; git history keeps it if a safe variant is ever wanted (it would need Source.SERVER + stub-awareness + a Result return, at which point it's resolveDestination). Compile clean, full unit suite green. Co-Authored-By: Claude Opus 4.8 --- .../java/app/closer/data/remote/FirestoreUserDataSource.kt | 5 ----- .../java/app/closer/data/repository/UserRepositoryImpl.kt | 2 -- .../main/java/app/closer/domain/repository/UserRepository.kt | 1 - 3 files changed, 8 deletions(-) diff --git a/app/src/main/java/app/closer/data/remote/FirestoreUserDataSource.kt b/app/src/main/java/app/closer/data/remote/FirestoreUserDataSource.kt index 7297bf18..f8b02fbf 100644 --- a/app/src/main/java/app/closer/data/remote/FirestoreUserDataSource.kt +++ b/app/src/main/java/app/closer/data/remote/FirestoreUserDataSource.kt @@ -210,11 +210,6 @@ class FirestoreUserDataSource @Inject constructor( val ENCRYPTED_PROFILE_FIELDS = listOf("displayName", "sex") } - suspend fun hasProfile(uid: String): Boolean = runCatching { - val snap = userRef(uid).get().await() - snap.exists() && !snap.getString("displayName").isNullOrBlank() - }.getOrDefault(false) - suspend fun storeFcmToken(uid: String, token: String) { userRef(uid).set( mapOf("fcmToken" to token, "lastActiveAt" to System.currentTimeMillis()), diff --git a/app/src/main/java/app/closer/data/repository/UserRepositoryImpl.kt b/app/src/main/java/app/closer/data/repository/UserRepositoryImpl.kt index 65130650..98af2bef 100644 --- a/app/src/main/java/app/closer/data/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/app/closer/data/repository/UserRepositoryImpl.kt @@ -33,8 +33,6 @@ class UserRepositoryImpl @Inject constructor( override suspend fun updateBirthDate(uid: String, birthDateMillis: Long) = dataSource.updateBirthDate(uid, birthDateMillis) - override suspend fun hasProfile(uid: String): Boolean = dataSource.hasProfile(uid) - override suspend fun storeFcmToken(uid: String, token: String) = dataSource.storeFcmToken(uid, token) diff --git a/app/src/main/java/app/closer/domain/repository/UserRepository.kt b/app/src/main/java/app/closer/domain/repository/UserRepository.kt index 2e75e8c4..12dbdd23 100644 --- a/app/src/main/java/app/closer/domain/repository/UserRepository.kt +++ b/app/src/main/java/app/closer/domain/repository/UserRepository.kt @@ -15,7 +15,6 @@ interface UserRepository { suspend fun updatePhotoUrl(uid: String, photoUrl: String) suspend fun updateSex(uid: String, sex: String) suspend fun updateBirthDate(uid: String, birthDateMillis: Long) - suspend fun hasProfile(uid: String): Boolean suspend fun storeFcmToken(uid: String, token: String) suspend fun storeTokenMetadata(uid: String, token: String, metadata: TokenRegistrar.DeviceMetadata) suspend fun updateNotificationPrefs(