summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/database/friends.rs44
-rw-r--r--src/types/user.rs15
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))
}
}