aboutsummaryrefslogtreecommitdiffstats
path: root/filamento/src/db.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 00:49:36 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-04-11 00:49:36 +0100
commitaab4cd47b1d2da5539c50675be4c7a36898189ef (patch)
tree3338bab6b08a076c8b39e8c3cb06a22f40a66e04 /filamento/src/db.rs
parentaf7a0f5022dfd0e04c821f0d4fc8314b3578417c (diff)
downloadluz-aab4cd47b1d2da5539c50675be4c7a36898189ef.tar.gz
luz-aab4cd47b1d2da5539c50675be4c7a36898189ef.tar.bz2
luz-aab4cd47b1d2da5539c50675be4c7a36898189ef.zip
feat(filamento): `get_roster_with_users()`
Diffstat (limited to 'filamento/src/db.rs')
-rw-r--r--filamento/src/db.rs40
1 files changed, 36 insertions, 4 deletions
diff --git a/filamento/src/db.rs b/filamento/src/db.rs
index 1d3d36c..d94293d 100644
--- a/filamento/src/db.rs
+++ b/filamento/src/db.rs
@@ -361,10 +361,9 @@ impl Db {
}
pub(crate) async fn read_cached_roster(&self) -> Result<Vec<Contact>, Error> {
- let mut roster: Vec<Contact> =
- sqlx::query_as("select * from roster join users on jid = user_jid")
- .fetch_all(&self.db)
- .await?;
+ let mut roster: Vec<Contact> = sqlx::query_as("select * from roster")
+ .fetch_all(&self.db)
+ .await?;
for contact in &mut roster {
#[derive(sqlx::FromRow)]
struct Row {
@@ -380,6 +379,39 @@ impl Db {
Ok(roster)
}
+ pub(crate) async fn read_cached_roster_with_users(
+ &self,
+ ) -> Result<Vec<(Contact, User)>, Error> {
+ #[derive(sqlx::FromRow)]
+ struct Row {
+ #[sqlx(flatten)]
+ contact: Contact,
+ #[sqlx(flatten)]
+ user: User,
+ }
+ let mut roster: Vec<Row> =
+ sqlx::query_as("select * from roster join users on jid = user_jid")
+ .fetch_all(&self.db)
+ .await?;
+ for row in &mut roster {
+ #[derive(sqlx::FromRow)]
+ struct Row {
+ group_name: String,
+ }
+ let groups: Vec<Row> =
+ sqlx::query_as("select group_name from groups_roster where contact_jid = ?")
+ .bind(&row.contact.user_jid)
+ .fetch_all(&self.db)
+ .await?;
+ row.contact.groups = HashSet::from_iter(groups.into_iter().map(|row| row.group_name));
+ }
+ let roster = roster
+ .into_iter()
+ .map(|row| (row.contact, row.user))
+ .collect();
+ Ok(roster)
+ }
+
pub(crate) async fn create_chat(&self, chat: Chat) -> Result<(), Error> {
let id = Uuid::new_v4();
let jid = chat.correspondent();