Forbid adding friends twice

This commit is contained in:
Tibo De Peuter 2023-05-16 09:10:39 +02:00
parent ef08a773f8
commit af23a29f6c
4 changed files with 49 additions and 27 deletions

View file

@ -1,11 +1,10 @@
package be.ugent.sel.studeez.domain.implementation 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.common.snackbar.SnackbarManager
import be.ugent.sel.studeez.data.local.models.Friendship 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.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.FRIENDID
import be.ugent.sel.studeez.data.remote.FirebaseFriendship.FRIENDSSINCE
import be.ugent.sel.studeez.domain.AccountDAO import be.ugent.sel.studeez.domain.AccountDAO
import be.ugent.sel.studeez.domain.FriendshipDAO import be.ugent.sel.studeez.domain.FriendshipDAO
import be.ugent.sel.studeez.domain.implementation.FirebaseCollections.FRIENDS_COLLECTION 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.catch
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
import kotlinx.coroutines.tasks.await
import javax.inject.Inject import javax.inject.Inject
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException import kotlin.coroutines.resumeWithException
@ -75,24 +75,40 @@ class FirebaseFriendshipDAO @Inject constructor(
val currentUserId: String = auth.currentUserId val currentUserId: String = auth.currentUserId
val otherUserId: String = id val otherUserId: String = id
// Add entry to current user // Check if the friendship already exists for the logged in user
currentUserDocument() var allowed = false
.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) firestore.collection(USER_COLLECTION)
.document(otherUserId) .document(currentUserId)
.collection(FRIENDS_COLLECTION) .collection(FRIENDS_COLLECTION)
.add(mapOf( .whereEqualTo(FRIENDID, otherUserId)
FRIENDID to currentUserId, .get()
ACCEPTED to true, // TODO Make it not automatically accepted. .addOnSuccessListener {
FRIENDSSINCE to Timestamp.now() 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 return true
} }

View file

@ -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.Headline
import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate
import be.ugent.sel.studeez.common.composable.drawer.DrawerEntry 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.data.local.models.User
import be.ugent.sel.studeez.resources import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.screens.profile.AmountOfFriendsButton import be.ugent.sel.studeez.screens.profile.AmountOfFriendsButton
@ -30,7 +31,7 @@ data class PublicProfileActions(
val getUserDetails: () -> Flow<User>, val getUserDetails: () -> Flow<User>,
val getAmountOfFriends: () -> Flow<Int>, val getAmountOfFriends: () -> Flow<Int>,
val onViewFriendsClick: () -> Unit, val onViewFriendsClick: () -> Unit,
val sendFriendRequest: () -> Boolean val sendFriendRequest: () -> Unit
) )
fun getPublicProfileActions( fun getPublicProfileActions(
@ -43,9 +44,11 @@ fun getPublicProfileActions(
userId = viewModel.uiState.value.userId userId = viewModel.uiState.value.userId
) }, ) },
onViewFriendsClick = { viewModel.onViewFriendsClick(open) }, onViewFriendsClick = { viewModel.onViewFriendsClick(open) },
sendFriendRequest = { viewModel.sendFriendRequest( sendFriendRequest = {
userId = viewModel.uiState.value.userId viewModel.sendFriendRequest(
) } userId = viewModel.uiState.value.userId
)
}
) )
} }
@ -129,7 +132,7 @@ fun PublicProfilePreview() {
}, },
getAmountOfFriends = { flowOf(113) }, getAmountOfFriends = { flowOf(113) },
onViewFriendsClick = {}, onViewFriendsClick = {},
sendFriendRequest = { true } sendFriendRequest = {}
), ),
popUp = {} popUp = {}
) )
@ -138,7 +141,7 @@ fun PublicProfilePreview() {
@Composable @Composable
fun PublicProfileEllipsis( fun PublicProfileEllipsis(
sendFriendRequest: () -> Boolean sendFriendRequest: () -> Unit
) { ) {
var expanded by remember { mutableStateOf(false) } var expanded by remember { mutableStateOf(false) }
@ -172,7 +175,7 @@ fun PublicProfileEllipsis(
fun PublicProfileEllipsisPreview() { fun PublicProfileEllipsisPreview() {
StudeezTheme { StudeezTheme {
PublicProfileEllipsis( PublicProfileEllipsis(
sendFriendRequest = { true } sendFriendRequest = {}
) )
} }
} }

View file

@ -1,6 +1,7 @@
package be.ugent.sel.studeez.screens.profile.public_profile package be.ugent.sel.studeez.screens.profile.public_profile
import androidx.compose.runtime.mutableStateOf 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.SelectedUserId
import be.ugent.sel.studeez.data.local.models.User import be.ugent.sel.studeez.data.local.models.User
import be.ugent.sel.studeez.domain.FriendshipDAO 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 dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import javax.inject.Inject import javax.inject.Inject
import be.ugent.sel.studeez.R.string as AppText
@HiltViewModel @HiltViewModel
class PublicProfileViewModel @Inject constructor( class PublicProfileViewModel @Inject constructor(
@ -53,8 +55,8 @@ class PublicProfileViewModel @Inject constructor(
fun sendFriendRequest( fun sendFriendRequest(
userId: String userId: String
): Boolean { ) {
return friendshipDAO.sendFriendshipRequest(userId) friendshipDAO.sendFriendshipRequest(userId)
} }
} }

View file

@ -136,6 +136,7 @@
<string name="show_profile">Show profile</string> <string name="show_profile">Show profile</string>
<string name="click_search_friends">Click to search friends</string> <string name="click_search_friends">Click to search friends</string>
<string name="searching_friends">Searching friends</string> <string name="searching_friends">Searching friends</string>
<string name="already_friend">You are already befriended with that person.</string>
<!-- ========== Create & edit screens ========== --> <!-- ========== Create & edit screens ========== -->