From af23a29f6c4cc17b5a319aeabb1c5af0099e09ca Mon Sep 17 00:00:00 2001 From: tdpeuter Date: Tue, 16 May 2023 09:10:39 +0200 Subject: [PATCH] Forbid adding friends twice --- .../implementation/FirebaseFriendshipDAO.kt | 52 ++++++++++++------- .../public_profile/PublicProfileScreen.kt | 17 +++--- .../public_profile/PublicProfileViewModel.kt | 6 ++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 49 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt index bd429e1..2583bed 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FirebaseFriendshipDAO.kt @@ -1,11 +1,10 @@ package be.ugent.sel.studeez.domain.implementation -import androidx.compose.runtime.collectAsState import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.data.local.models.Friendship import be.ugent.sel.studeez.data.remote.FirebaseFriendship.ACCEPTED -import be.ugent.sel.studeez.data.remote.FirebaseFriendship.FRIENDSSINCE import be.ugent.sel.studeez.data.remote.FirebaseFriendship.FRIENDID +import be.ugent.sel.studeez.data.remote.FirebaseFriendship.FRIENDSSINCE import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.FriendshipDAO import be.ugent.sel.studeez.domain.implementation.FirebaseCollections.FRIENDS_COLLECTION @@ -18,6 +17,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map +import kotlinx.coroutines.tasks.await import javax.inject.Inject import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -75,24 +75,40 @@ class FirebaseFriendshipDAO @Inject constructor( val currentUserId: String = auth.currentUserId val otherUserId: String = id - // Add entry to current user - currentUserDocument() - .collection(FRIENDS_COLLECTION) - .add(mapOf( - FRIENDID to otherUserId, - ACCEPTED to true, // TODO Make it not automatically accepted. - FRIENDSSINCE to Timestamp.now() - )) - - // Add entry to other user + // Check if the friendship already exists for the logged in user + var allowed = false firestore.collection(USER_COLLECTION) - .document(otherUserId) + .document(currentUserId) .collection(FRIENDS_COLLECTION) - .add(mapOf( - FRIENDID to currentUserId, - ACCEPTED to true, // TODO Make it not automatically accepted. - FRIENDSSINCE to Timestamp.now() - )) + .whereEqualTo(FRIENDID, otherUserId) + .get() + .addOnSuccessListener { + allowed = it.documents.isEmpty() + + if (allowed) { + // Add entry to current user + currentUserDocument() + .collection(FRIENDS_COLLECTION) + .add(mapOf( + FRIENDID to otherUserId, + ACCEPTED to true, // TODO Make it not automatically accepted. + FRIENDSSINCE to Timestamp.now() + )) + + // Add entry to other user + firestore.collection(USER_COLLECTION) + .document(otherUserId) + .collection(FRIENDS_COLLECTION) + .add(mapOf( + FRIENDID to currentUserId, + ACCEPTED to true, // TODO Make it not automatically accepted. + FRIENDSSINCE to Timestamp.now() + )) + } + }.addOnSuccessListener { + val message = if (allowed) AppText.success else AppText.already_friend + SnackbarManager.showMessage(message) + } return true } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt index 41e33c5..8fd9d89 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileScreen.kt @@ -18,6 +18,7 @@ import be.ugent.sel.studeez.R import be.ugent.sel.studeez.common.composable.Headline import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.common.composable.drawer.DrawerEntry +import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.screens.profile.AmountOfFriendsButton @@ -30,7 +31,7 @@ data class PublicProfileActions( val getUserDetails: () -> Flow, val getAmountOfFriends: () -> Flow, val onViewFriendsClick: () -> Unit, - val sendFriendRequest: () -> Boolean + val sendFriendRequest: () -> Unit ) fun getPublicProfileActions( @@ -43,9 +44,11 @@ fun getPublicProfileActions( userId = viewModel.uiState.value.userId ) }, onViewFriendsClick = { viewModel.onViewFriendsClick(open) }, - sendFriendRequest = { viewModel.sendFriendRequest( - userId = viewModel.uiState.value.userId - ) } + sendFriendRequest = { + viewModel.sendFriendRequest( + userId = viewModel.uiState.value.userId + ) + } ) } @@ -129,7 +132,7 @@ fun PublicProfilePreview() { }, getAmountOfFriends = { flowOf(113) }, onViewFriendsClick = {}, - sendFriendRequest = { true } + sendFriendRequest = {} ), popUp = {} ) @@ -138,7 +141,7 @@ fun PublicProfilePreview() { @Composable fun PublicProfileEllipsis( - sendFriendRequest: () -> Boolean + sendFriendRequest: () -> Unit ) { var expanded by remember { mutableStateOf(false) } @@ -172,7 +175,7 @@ fun PublicProfileEllipsis( fun PublicProfileEllipsisPreview() { StudeezTheme { PublicProfileEllipsis( - sendFriendRequest = { true } + sendFriendRequest = {} ) } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt index 031950c..700084f 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/profile/public_profile/PublicProfileViewModel.kt @@ -1,6 +1,7 @@ package be.ugent.sel.studeez.screens.profile.public_profile import androidx.compose.runtime.mutableStateOf +import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.data.SelectedUserId import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.domain.FriendshipDAO @@ -11,6 +12,7 @@ import be.ugent.sel.studeez.screens.StudeezViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.Flow import javax.inject.Inject +import be.ugent.sel.studeez.R.string as AppText @HiltViewModel class PublicProfileViewModel @Inject constructor( @@ -53,8 +55,8 @@ class PublicProfileViewModel @Inject constructor( fun sendFriendRequest( userId: String - ): Boolean { - return friendshipDAO.sendFriendshipRequest(userId) + ) { + friendshipDAO.sendFriendshipRequest(userId) } } \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f4aa7cb..4544ddd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -136,6 +136,7 @@ Show profile Click to search friends Searching friends + You are already befriended with that person.