feat(gpodder): add user filter for paginated users method

main
Jef Roosens 2025-06-29 10:23:30 +02:00
parent c7c5cf889c
commit fce301080c
No known key found for this signature in database
GPG Key ID: 21FD3D77D56BAF49
5 changed files with 41 additions and 15 deletions

View File

@ -72,3 +72,8 @@ pub struct Page {
pub page: u32, pub page: u32,
pub per_page: u32, pub per_page: u32,
} }
#[derive(Clone, Debug, PartialEq, Eq, Default)]
pub struct UserFilter {
pub username: Option<String>,
}

View File

@ -7,7 +7,11 @@ pub struct AdminRepository<'a> {
} }
impl<'a> AdminRepository<'a> { impl<'a> AdminRepository<'a> {
pub fn paginated_users(&self, page: Page) -> Result<Vec<models::User>, AuthErr> { pub fn paginated_users(
self.store.paginated_users(page) &self,
page: Page,
filter: &models::UserFilter,
) -> Result<Vec<models::User>, AuthErr> {
self.store.paginated_users(page, filter)
} }
} }

View File

@ -66,7 +66,7 @@ pub trait GpodderAuthStore {
fn remove_old_sessions(&self, min_last_seen: DateTime<Utc>) -> Result<usize, AuthErr>; fn remove_old_sessions(&self, min_last_seen: DateTime<Utc>) -> Result<usize, AuthErr>;
/// Return the given page of users, ordered by username /// Return the given page of users, ordered by username
fn paginated_users(&self, page: Page) -> Result<Vec<User>, AuthErr>; fn paginated_users(&self, page: Page, filter: &UserFilter) -> Result<Vec<User>, AuthErr>;
} }
pub trait GpodderDeviceStore { pub trait GpodderDeviceStore {

View File

@ -143,16 +143,31 @@ impl gpodder::GpodderAuthStore for SqliteRepository {
.map_err(AuthErr::from) .map_err(AuthErr::from)
} }
fn paginated_users(&self, page: gpodder::Page) -> Result<Vec<gpodder::User>, AuthErr> { fn paginated_users(
Ok(users::table &self,
.select(User::as_select()) page: gpodder::Page,
.order(users::username.asc()) filter: &gpodder::UserFilter,
.offset((page.page * page.per_page) as i64) ) -> Result<Vec<gpodder::User>, AuthErr> {
.limit(page.per_page as i64) (|| {
.get_results(&mut self.pool.get().map_err(DbError::from)?) let mut query = users::table
.map_err(DbError::from)? .select(User::as_select())
.into_iter() .order(users::username.asc())
.map(gpodder::User::from) .offset((page.page * page.per_page) as i64)
.collect()) .limit(page.per_page as i64)
.into_boxed();
if let Some(username) = &filter.username {
// Case insensitive by default for SQLite
query = query.filter(users::username.like(format!("%{username}%")));
}
Ok::<_, DbError>(
query
.load_iter(&mut self.pool.get()?)?
.map(|res| res.map(gpodder::User::from))
.collect::<Result<Vec<_>, _>>()?,
)
})()
.map_err(AuthErr::from)
} }
} }

View File

@ -31,7 +31,9 @@ pub async fn get_users(
let next_page = page.next_page(); let next_page = page.next_page();
let user_id = session.user.id; let user_id = session.user.id;
let users = tokio::task::spawn_blocking(move || { let users = tokio::task::spawn_blocking(move || {
ctx.store.admin(&session.user)?.paginated_users(page.into()) ctx.store
.admin(&session.user)?
.paginated_users(page.into(), &gpodder::UserFilter::default())
}) })
.await .await
.unwrap()?; .unwrap()?;