More with friendship
This commit is contained in:
		
							parent
							
								
									a6a5fb5e95
								
							
						
					
					
						commit
						566102d5d4
					
				
					 4 changed files with 94 additions and 17 deletions
				
			
		|  | @ -0,0 +1,7 @@ | |||
| package be.ugent.sel.studeez.data.remote | ||||
| 
 | ||||
| object FirebaseFriendship { | ||||
|     const val FRIENDID: String = "friendId" | ||||
|     const val ACCEPTED: String = "accepted" | ||||
|     const val FRIENDSSINCE: String = "friendsSince" | ||||
| } | ||||
|  | @ -9,15 +9,19 @@ import kotlinx.coroutines.flow.Flow | |||
| interface FriendshipDAO { | ||||
| 
 | ||||
|     /** | ||||
|      * @return all friendships of the user that is currently logged in. | ||||
|      * @return all friendships of a chosen user. | ||||
|      */ | ||||
|     fun getAllFriendships(): Flow<List<Friendship>> | ||||
|     fun getAllFriendships( | ||||
|         userId: String | ||||
|     ): Flow<List<Friendship>> | ||||
| 
 | ||||
|     /** | ||||
|      * @return the amount of friends of the currently logged in user. | ||||
|      * @return the amount of friends of a chosen user. | ||||
|      * This method should be faster than just counting the length of getAllFriends() | ||||
|      */ | ||||
|     fun getFriendshipCount(): Flow<Int> | ||||
|     fun getFriendshipCount( | ||||
|         userId: String | ||||
|     ): Flow<Int> | ||||
| 
 | ||||
|     /** | ||||
|      * @param id the id of the friendship that you want details of | ||||
|  | @ -41,8 +45,10 @@ interface FriendshipDAO { | |||
| 
 | ||||
|     /** | ||||
|      * Remove a friend or decline a friendrequest. | ||||
|      * @param id of the friendship that you want to update | ||||
|      * @param friendship the one you want to remove | ||||
|      * @return: Success/faillure of transaction | ||||
|      */ | ||||
|     fun removeFriendship(id: String): Boolean | ||||
|     fun removeFriendship( | ||||
|         friendship: Friendship | ||||
|     ): Boolean | ||||
| } | ||||
|  | @ -1,9 +1,16 @@ | |||
| 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.domain.AccountDAO | ||||
| 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.USER_COLLECTION | ||||
| import com.google.firebase.Timestamp | ||||
| import com.google.firebase.firestore.DocumentReference | ||||
| import com.google.firebase.firestore.FirebaseFirestore | ||||
| import com.google.firebase.firestore.ktx.snapshots | ||||
|  | @ -23,21 +30,29 @@ class FirebaseFriendshipDAO @Inject constructor( | |||
| ): FriendshipDAO { | ||||
| 
 | ||||
|     private fun currentUserDocument(): DocumentReference = firestore | ||||
|         .collection(FirebaseCollections.USER_COLLECTION) | ||||
|         .collection(USER_COLLECTION) | ||||
|         .document(auth.currentUserId) | ||||
| 
 | ||||
|     override fun getAllFriendships(): Flow<List<Friendship>> { | ||||
|         return currentUserDocument() | ||||
|             .collection(FirebaseCollections.FRIENDS_COLLECTION) | ||||
|     override fun getAllFriendships( | ||||
|         userId: String | ||||
|     ): Flow<List<Friendship>> { | ||||
|         return firestore | ||||
|             .collection(USER_COLLECTION) | ||||
|             .document(userId) | ||||
|             .collection(FRIENDS_COLLECTION) | ||||
|             .snapshots() | ||||
|             .map { it.toObjects(Friendship::class.java) } | ||||
|     } | ||||
| 
 | ||||
|     override fun getFriendshipCount(): Flow<Int> { | ||||
|     override fun getFriendshipCount( | ||||
|         userId: String | ||||
|     ): Flow<Int> { | ||||
|         return flow { | ||||
|             val friendshipCount = suspendCoroutine { continuation -> | ||||
|                 currentUserDocument() | ||||
|                     .collection(FirebaseCollections.FRIENDS_COLLECTION) | ||||
|                 firestore | ||||
|                     .collection(USER_COLLECTION) | ||||
|                     .document(userId) | ||||
|                     .collection(FRIENDS_COLLECTION) | ||||
|                     .get() | ||||
|                     .addOnSuccessListener { querySnapshot -> | ||||
|                         continuation.resume(querySnapshot.size()) | ||||
|  | @ -57,15 +72,63 @@ class FirebaseFriendshipDAO @Inject constructor( | |||
|     } | ||||
| 
 | ||||
|     override fun sendFriendshipRequest(id: String): Boolean { | ||||
|         TODO("Not yet implemented") | ||||
|         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 | ||||
|         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() | ||||
|             )) | ||||
| 
 | ||||
|         return true | ||||
|     } | ||||
| 
 | ||||
|     override fun acceptFriendship(id: String): Boolean { | ||||
|         TODO("Not yet implemented") | ||||
|     } | ||||
| 
 | ||||
|     override fun removeFriendship(id: String): Boolean { | ||||
|         TODO("Not yet implemented") | ||||
|     override fun removeFriendship( | ||||
|         friendship: Friendship | ||||
|     ): Boolean { | ||||
|         val currentUserId: String = auth.currentUserId | ||||
|         val otherUserId: String = friendship.friendId | ||||
| 
 | ||||
|         // Remove at logged in user | ||||
|         firestore.collection(USER_COLLECTION) | ||||
|             .document(currentUserId) | ||||
|             .collection(FRIENDS_COLLECTION) | ||||
|             .document(friendship.id) | ||||
|             .delete() | ||||
| 
 | ||||
|         // Remove at other user | ||||
|         firestore.collection(USER_COLLECTION) | ||||
|             .document(otherUserId) | ||||
|             .collection(FRIENDS_COLLECTION) | ||||
|             .whereEqualTo(FRIENDID, currentUserId) | ||||
|             .get() | ||||
|             .addOnSuccessListener { | ||||
|                 for (document in it) { | ||||
|                     document.reference.delete() | ||||
|                 } | ||||
|             }.addOnFailureListener { | ||||
|                 SnackbarManager.showMessage(AppText.generic_error) | ||||
|             } | ||||
| 
 | ||||
|         return true | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -5,6 +5,7 @@ import be.ugent.sel.studeez.domain.LogService | |||
| import be.ugent.sel.studeez.domain.UserDAO | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations | ||||
| import be.ugent.sel.studeez.screens.StudeezViewModel | ||||
| import com.google.firebase.auth.FirebaseAuth | ||||
| import dagger.hilt.android.lifecycle.HiltViewModel | ||||
| import kotlinx.coroutines.flow.Flow | ||||
| import javax.inject.Inject | ||||
|  | @ -25,7 +26,7 @@ class ProfileViewModel @Inject constructor( | |||
|     } | ||||
| 
 | ||||
|     fun getAmountOfFriends(): Flow<Int> { | ||||
|         return friendshipDAO.getFriendshipCount() | ||||
|         return friendshipDAO.getFriendshipCount(userDAO.getCurrentUserId()) | ||||
|     } | ||||
| 
 | ||||
|     fun onEditProfileClick(open: (String) -> Unit) { | ||||
|  |  | |||
		Reference in a new issue