Forbid adding friends twice
This commit is contained in:
		
							parent
							
								
									ef08a773f8
								
							
						
					
					
						commit
						af23a29f6c
					
				
					 4 changed files with 49 additions and 27 deletions
				
			
		|  | @ -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,6 +75,17 @@ class FirebaseFriendshipDAO @Inject constructor( | ||||||
|         val currentUserId: String = auth.currentUserId |         val currentUserId: String = auth.currentUserId | ||||||
|         val otherUserId: String = id |         val otherUserId: String = id | ||||||
| 
 | 
 | ||||||
|  |         // Check if the friendship already exists for the logged in user | ||||||
|  |         var allowed = false | ||||||
|  |         firestore.collection(USER_COLLECTION) | ||||||
|  |             .document(currentUserId) | ||||||
|  |             .collection(FRIENDS_COLLECTION) | ||||||
|  |             .whereEqualTo(FRIENDID, otherUserId) | ||||||
|  |             .get() | ||||||
|  |             .addOnSuccessListener { | ||||||
|  |                 allowed = it.documents.isEmpty() | ||||||
|  | 
 | ||||||
|  |                 if (allowed) { | ||||||
|                     // Add entry to current user |                     // Add entry to current user | ||||||
|                     currentUserDocument() |                     currentUserDocument() | ||||||
|                         .collection(FRIENDS_COLLECTION) |                         .collection(FRIENDS_COLLECTION) | ||||||
|  | @ -93,6 +104,11 @@ class FirebaseFriendshipDAO @Inject constructor( | ||||||
|                             ACCEPTED to true, // TODO Make it not automatically accepted. |                             ACCEPTED to true, // TODO Make it not automatically accepted. | ||||||
|                             FRIENDSSINCE to Timestamp.now() |                             FRIENDSSINCE to Timestamp.now() | ||||||
|                         )) |                         )) | ||||||
|  |                 } | ||||||
|  |             }.addOnSuccessListener { | ||||||
|  |                 val message = if (allowed) AppText.success else AppText.already_friend | ||||||
|  |                 SnackbarManager.showMessage(message) | ||||||
|  |             } | ||||||
| 
 | 
 | ||||||
|         return true |         return true | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -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 = { | ||||||
|  |             viewModel.sendFriendRequest( | ||||||
|                 userId = viewModel.uiState.value.userId |                 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 = {} | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -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) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -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 ========== --> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Reference in a new issue