diff --git a/gpodder/src/models.rs b/gpodder/src/models.rs index 13ca3a1..2f77ba1 100644 --- a/gpodder/src/models.rs +++ b/gpodder/src/models.rs @@ -65,3 +65,9 @@ pub struct Subscription { pub url: String, pub time_changed: DateTime, } + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct Page { + pub page: u32, + pub per_page: u32, +} diff --git a/gpodder/src/repository.rs b/gpodder/src/repository.rs index c96787a..5ef47c2 100644 --- a/gpodder/src/repository.rs +++ b/gpodder/src/repository.rs @@ -37,6 +37,14 @@ impl GpodderRepository { } } + pub fn paginated_sessions( + &self, + user: &models::User, + page: models::Page, + ) -> Result, AuthErr> { + self.store.paginated_sessions(user, page) + } + pub fn get_user(&self, username: &str) -> Result { self.store.get_user(username)?.ok_or(AuthErr::UnknownUser) } diff --git a/gpodder/src/store.rs b/gpodder/src/store.rs index 800a95d..d5fc371 100644 --- a/gpodder/src/store.rs +++ b/gpodder/src/store.rs @@ -38,6 +38,10 @@ pub trait AuthStore { /// Retrieve the session with the given session ID fn get_session(&self, session_id: i64) -> Result, AuthErr>; + /// Retrieve a paginated list of the given user's sessions, ordered descending by the last seen + /// value. + fn paginated_sessions(&self, user: &User, page: Page) -> Result, AuthErr>; + /// Retrieve the user with the given username fn get_user(&self, username: &str) -> Result, AuthErr>; diff --git a/gpodder_sqlite/src/repository/auth.rs b/gpodder_sqlite/src/repository/auth.rs index 36413e8..689db27 100644 --- a/gpodder_sqlite/src/repository/auth.rs +++ b/gpodder_sqlite/src/repository/auth.rs @@ -114,4 +114,31 @@ impl gpodder::AuthStore for SqliteRepository { .map_err(DbError::from)?, ) } + + fn paginated_sessions( + &self, + user: &gpodder::User, + page: gpodder::Page, + ) -> Result, AuthErr> { + (|| { + let sessions = sessions::table + .filter(sessions::user_id.eq(user.id)) + .order(sessions::last_seen.desc()) + .offset((page.page * page.per_page) as i64) + .limit(page.per_page as i64) + .select(Session::as_select()) + .get_results(&mut self.pool.get()?)? + .into_iter() + .map(|session| gpodder::Session { + id: session.id, + last_seen: DateTime::from_timestamp(session.last_seen, 0).unwrap(), + user_agent: session.user_agent, + user: user.clone(), + }) + .collect(); + + Ok::<_, DbError>(sessions) + })() + .map_err(AuthErr::from) + } }