From 582abba793ba495d1caae938827d9808604bab8a Mon Sep 17 00:00:00 2001 From: Valentin Tolmer Date: Mon, 11 Sep 2023 16:27:47 +0200 Subject: [PATCH] server: clean up user query With the new find_with_linked from sea_orm --- server/src/domain/sql_user_backend_handler.rs | 35 ++++++------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/server/src/domain/sql_user_backend_handler.rs b/server/src/domain/sql_user_backend_handler.rs index 977f083..e44512c 100644 --- a/server/src/domain/sql_user_backend_handler.rs +++ b/server/src/domain/sql_user_backend_handler.rs @@ -98,7 +98,7 @@ impl UserListerBackendHandler for SqlBackendHandler { // To simplify the query, we always fetch groups. TODO: cleanup. _get_groups: bool, ) -> Result> { - let results = model::User::find() + let mut users: Vec<_> = model::User::find() .filter( filters .map(|f| { @@ -116,43 +116,28 @@ impl UserListerBackendHandler for SqlBackendHandler { .unwrap_or_else(|| SimpleExpr::Value(true.into()).into_condition()), ) .order_by_asc(UserColumn::UserId) - //find_with_linked? - .find_also_linked(model::memberships::UserToGroup) + .find_with_linked(model::memberships::UserToGroup) .order_by_asc(SimpleExpr::Column( - (Alias::new("r1"), GroupColumn::GroupId).into_column_ref(), + (Alias::new("r1"), GroupColumn::DisplayName).into_column_ref(), )) .all(&self.sql_pool) - .await?; - use itertools::Itertools; - let mut users: Vec<_> = results - .iter() - .group_by(|(u, _)| u) + .await? .into_iter() - .map(|(user, groups)| { - let mut groups: Vec<_> = groups - .into_iter() - .flat_map(|(_, g)| g) - .map(|g| GroupDetails::from(g.clone())) - .collect(); - groups.sort_by(|g1, g2| g1.display_name.cmp(&g2.display_name)); - UserAndGroups { - user: user.clone().into(), - groups: Some(groups), - } + .map(|(user, groups)| UserAndGroups { + user: user.into(), + groups: Some(groups.into_iter().map(Into::::into).collect()), }) .collect(); // At this point, the users don't have attributes, we need to populate it with another query. - let user_ids = users - .iter() - .map(|u| u.user.user_id.clone()) - .collect::>(); + let user_ids = users.iter().map(|u| &u.user.user_id); let attributes = model::UserAttributes::find() - .filter(model::UserAttributesColumn::UserId.is_in(&user_ids)) + .filter(model::UserAttributesColumn::UserId.is_in(user_ids)) .order_by_asc(model::UserAttributesColumn::UserId) .order_by_asc(model::UserAttributesColumn::AttributeName) .all(&self.sql_pool) .await?; let mut attributes_iter = attributes.into_iter().peekable(); + use itertools::Itertools; // For take_while_ref for user in users.iter_mut() { assert!(attributes_iter .peek()