diff options
author | 2025-04-11 00:49:36 +0100 | |
---|---|---|
committer | 2025-04-11 00:49:36 +0100 | |
commit | aab4cd47b1d2da5539c50675be4c7a36898189ef (patch) | |
tree | 3338bab6b08a076c8b39e8c3cb06a22f40a66e04 /filamento/src/db.rs | |
parent | af7a0f5022dfd0e04c821f0d4fc8314b3578417c (diff) | |
download | luz-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.rs | 40 |
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(); |