diff options
Diffstat (limited to '')
-rw-r--r-- | src/database/friends.rs | 44 | ||||
-rw-r--r-- | src/types/user.rs | 15 |
2 files changed, 56 insertions, 3 deletions
diff --git a/src/database/friends.rs b/src/database/friends.rs index 31434d4..7e23616 100644 --- a/src/database/friends.rs +++ b/src/database/friends.rs @@ -75,6 +75,50 @@ impl Database { } #[instrument(skip(self))] + pub fn get_followers(&self, user_id: u64) -> Result<Vec<User>, rusqlite::Error> { + tracing::trace!("Retrieving friends"); + let mut stmt = self.0.prepare( + " + SELECT * + FROM users u + WHERE EXISTS ( + SELECT NULL + FROM friends f + WHERE f.follower_id = ? + AND u.user_id = f.followee_id + ) + ", + )?; + let row = stmt.query_map([user_id], |row| { + let row = Self::user_from_row(row, true)?; + Ok(row) + })?; + Ok(row.into_iter().flatten().collect()) + } + + #[instrument(skip(self))] + pub fn get_following(&self, user_id: u64) -> Result<Vec<User>, rusqlite::Error> { + tracing::trace!("Retrieving friends"); + let mut stmt = self.0.prepare( + " + SELECT * + FROM users u + WHERE EXISTS ( + SELECT NULL + FROM friends f + WHERE u.user_id = f.follower_id + AND f.followee_id = ? + ) + ", + )?; + let row = stmt.query_map([user_id], |row| { + let row = Self::user_from_row(row, true)?; + Ok(row) + })?; + Ok(row.into_iter().flatten().collect()) + } + + #[instrument(skip(self))] pub fn set_following(&self, user_id_1: u64, user_id_2: u64) -> Result<bool, rusqlite::Error> { tracing::trace!("Setting following"); let mut stmt = self diff --git a/src/types/user.rs b/src/types/user.rs index 3c4cd6a..3d7d85a 100644 --- a/src/types/user.rs +++ b/src/types/user.rs @@ -135,10 +135,19 @@ impl User { } #[instrument(skip(db))] - pub fn get_friends(db: &Database, user_id: u64) -> Result<Vec<Self>> { - let Ok(users) = db.get_friends(user_id) else { + pub fn get_friends(db: &Database, user_id: u64) -> Result<(Vec<Self>, Vec<Self>, Vec<Self>)> { + let Ok(friends) = db.get_friends(user_id) else { return Err(ResponseCode::InternalServerError.text("Failed to fetch friends")) }; - Ok(users) + + let Ok(followers) = db.get_followers(user_id) else { + return Err(ResponseCode::InternalServerError.text("Failed to fetch friends")) + }; + + let Ok(following) = db.get_following(user_id) else { + return Err(ResponseCode::InternalServerError.text("Failed to fetch friends")) + }; + + Ok((friends, followers, following)) } } |