From 57d30c1845def4e7d7b22df5b498f1c5bd178243 Mon Sep 17 00:00:00 2001 From: Tyler Murphy Date: Wed, 15 Feb 2023 13:32:43 -0500 Subject: followers and following tabs --- src/database/friends.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/types/user.rs | 15 ++++++++++++--- 2 files changed, 56 insertions(+), 3 deletions(-) (limited to 'src') 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 @@ -74,6 +74,50 @@ impl Database { Ok(row.into_iter().flatten().collect()) } + #[instrument(skip(self))] + pub fn get_followers(&self, user_id: u64) -> Result, 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, 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 { tracing::trace!("Setting following"); 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> { - let Ok(users) = db.get_friends(user_id) else { + pub fn get_friends(db: &Database, user_id: u64) -> Result<(Vec, Vec, Vec)> { + 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)) } } -- cgit v1.2.3-freya