diff --git a/crates/graphql/src/lib.rs b/crates/graphql/src/lib.rs index 765db8e5..d2de0c24 100644 --- a/crates/graphql/src/lib.rs +++ b/crates/graphql/src/lib.rs @@ -232,7 +232,7 @@ impl RootQuery { let page = repo .upstream_oauth_provider() - .list_paginated(&pagination) + .list_paginated(pagination) .await?; let mut connection = Connection::new(page.has_previous_page, page.has_next_page); diff --git a/crates/graphql/src/model/users.rs b/crates/graphql/src/model/users.rs index 9a9062d0..68daff1b 100644 --- a/crates/graphql/src/model/users.rs +++ b/crates/graphql/src/model/users.rs @@ -99,7 +99,7 @@ impl User { let page = repo .compat_sso_login() - .list_paginated(&self.0, &pagination) + .list_paginated(&self.0, pagination) .await?; let mut connection = Connection::new(page.has_previous_page, page.has_next_page); @@ -146,7 +146,7 @@ impl User { let page = repo .browser_session() - .list_active_paginated(&self.0, &pagination) + .list_active_paginated(&self.0, pagination) .await?; let mut connection = Connection::new(page.has_previous_page, page.has_next_page); @@ -193,7 +193,7 @@ impl User { let page = repo .user_email() - .list_paginated(&self.0, &pagination) + .list_paginated(&self.0, pagination) .await?; let mut connection = Connection::with_additional_fields( @@ -244,7 +244,7 @@ impl User { let page = repo .oauth2_session() - .list_paginated(&self.0, &pagination) + .list_paginated(&self.0, pagination) .await?; let mut connection = Connection::new(page.has_previous_page, page.has_next_page); @@ -295,7 +295,7 @@ impl User { let page = repo .upstream_oauth_link() - .list_paginated(&self.0, &pagination) + .list_paginated(&self.0, pagination) .await?; let mut connection = Connection::new(page.has_previous_page, page.has_next_page); diff --git a/crates/storage/src/compat/sso_login.rs b/crates/storage/src/compat/sso_login.rs index 31c3da3c..76cf1ede 100644 --- a/crates/storage/src/compat/sso_login.rs +++ b/crates/storage/src/compat/sso_login.rs @@ -68,7 +68,7 @@ pub trait CompatSsoLoginRepository: Send + Sync { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error>; } @@ -351,7 +351,7 @@ impl<'c> CompatSsoLoginRepository for PgCompatSsoLoginRepository<'c> { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error> { let mut query = QueryBuilder::new( r#" @@ -371,7 +371,7 @@ impl<'c> CompatSsoLoginRepository for PgCompatSsoLoginRepository<'c> { query .push(" WHERE user_id = ") .push_bind(Uuid::from(user.id)) - .generate_pagination("cl.compat_sso_login_id", &pagination); + .generate_pagination("cl.compat_sso_login_id", pagination); let edges: Vec = query .build_query_as() diff --git a/crates/storage/src/oauth2/session.rs b/crates/storage/src/oauth2/session.rs index 0fa8cb8f..dc21fbcb 100644 --- a/crates/storage/src/oauth2/session.rs +++ b/crates/storage/src/oauth2/session.rs @@ -45,7 +45,7 @@ pub trait OAuth2SessionRepository: Send + Sync { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error>; } @@ -240,7 +240,7 @@ impl<'c> OAuth2SessionRepository for PgOAuth2SessionRepository<'c> { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error> { let mut query = QueryBuilder::new( r#" diff --git a/crates/storage/src/pagination.rs b/crates/storage/src/pagination.rs index 1fbcbc51..1fa74dda 100644 --- a/crates/storage/src/pagination.rs +++ b/crates/storage/src/pagination.rs @@ -66,6 +66,7 @@ impl Pagination { } /// Creates a [`Pagination`] which gets the first N items + #[must_use] pub const fn first(first: usize) -> Self { Self { before: None, @@ -76,6 +77,7 @@ impl Pagination { } /// Creates a [`Pagination`] which gets the last N items + #[must_use] pub const fn last(last: usize) -> Self { Self { before: None, @@ -86,12 +88,14 @@ impl Pagination { } /// Get items before the given cursor + #[must_use] pub const fn before(mut self, id: Ulid) -> Self { self.before = Some(id); self } /// Get items after the given cursor + #[must_use] pub const fn after(mut self, id: Ulid) -> Self { self.after = Some(id); self @@ -181,6 +185,7 @@ pub struct Page { } impl Page { + #[must_use] pub fn map(self, f: F) -> Page where F: FnMut(T) -> T2, @@ -193,6 +198,7 @@ impl Page { } } + #[must_use] pub fn try_map(self, f: F) -> Result, E> where F: FnMut(T) -> Result, @@ -211,8 +217,7 @@ impl Page { pub trait QueryBuilderExt { /// Add cursor-based pagination to a query, as used in paginated GraphQL /// connections - fn generate_pagination(&mut self, id_field: &'static str, pagination: &Pagination) - -> &mut Self; + fn generate_pagination(&mut self, id_field: &'static str, pagination: Pagination) -> &mut Self; } impl<'a, DB> QueryBuilderExt for QueryBuilder<'a, DB> @@ -221,11 +226,7 @@ where Uuid: sqlx::Type + sqlx::Encode<'a, DB>, i64: sqlx::Type + sqlx::Encode<'a, DB>, { - fn generate_pagination( - &mut self, - id_field: &'static str, - pagination: &Pagination, - ) -> &mut Self { + fn generate_pagination(&mut self, id_field: &'static str, pagination: Pagination) -> &mut Self { pagination.generate_pagination(self, id_field); self } diff --git a/crates/storage/src/upstream_oauth2/link.rs b/crates/storage/src/upstream_oauth2/link.rs index 13e86e17..76364afe 100644 --- a/crates/storage/src/upstream_oauth2/link.rs +++ b/crates/storage/src/upstream_oauth2/link.rs @@ -60,7 +60,7 @@ pub trait UpstreamOAuthLinkRepository: Send + Sync { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error>; } @@ -272,7 +272,7 @@ impl<'c> UpstreamOAuthLinkRepository for PgUpstreamOAuthLinkRepository<'c> { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error> { let mut query = QueryBuilder::new( r#" diff --git a/crates/storage/src/upstream_oauth2/mod.rs b/crates/storage/src/upstream_oauth2/mod.rs index 14848935..d1b6809f 100644 --- a/crates/storage/src/upstream_oauth2/mod.rs +++ b/crates/storage/src/upstream_oauth2/mod.rs @@ -161,7 +161,7 @@ mod tests { let links = repo .upstream_oauth_link() - .list_paginated(&user, &Pagination::first(10)) + .list_paginated(&user, Pagination::first(10)) .await .unwrap(); assert!(!links.has_previous_page); @@ -205,7 +205,7 @@ mod tests { // Lookup the first 10 items let page = repo .upstream_oauth_provider() - .list_paginated(&Pagination::first(10)) + .list_paginated(Pagination::first(10)) .await .unwrap(); @@ -217,7 +217,7 @@ mod tests { // Lookup the next 10 items let page = repo .upstream_oauth_provider() - .list_paginated(&Pagination::first(10).after(ids[9])) + .list_paginated(Pagination::first(10).after(ids[9])) .await .unwrap(); @@ -229,7 +229,7 @@ mod tests { // Lookup the last 10 items let page = repo .upstream_oauth_provider() - .list_paginated(&Pagination::last(10)) + .list_paginated(Pagination::last(10)) .await .unwrap(); @@ -241,7 +241,7 @@ mod tests { // Lookup the previous 10 items let page = repo .upstream_oauth_provider() - .list_paginated(&Pagination::last(10).before(ids[10])) + .list_paginated(Pagination::last(10).before(ids[10])) .await .unwrap(); @@ -253,7 +253,7 @@ mod tests { // Lookup 10 items between two IDs let page = repo .upstream_oauth_provider() - .list_paginated(&Pagination::first(10).after(ids[5]).before(ids[8])) + .list_paginated(Pagination::first(10).after(ids[5]).before(ids[8])) .await .unwrap(); diff --git a/crates/storage/src/upstream_oauth2/provider.rs b/crates/storage/src/upstream_oauth2/provider.rs index eb09fd79..14bd6547 100644 --- a/crates/storage/src/upstream_oauth2/provider.rs +++ b/crates/storage/src/upstream_oauth2/provider.rs @@ -52,7 +52,7 @@ pub trait UpstreamOAuthProviderRepository: Send + Sync { /// Get a paginated list of upstream OAuth providers async fn list_paginated( &mut self, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error>; /// Get all upstream OAuth providers @@ -240,7 +240,7 @@ impl<'c> UpstreamOAuthProviderRepository for PgUpstreamOAuthProviderRepository<' )] async fn list_paginated( &mut self, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error> { let mut query = QueryBuilder::new( r#" diff --git a/crates/storage/src/user/email.rs b/crates/storage/src/user/email.rs index cef4fa27..8c8efe1b 100644 --- a/crates/storage/src/user/email.rs +++ b/crates/storage/src/user/email.rs @@ -39,7 +39,7 @@ pub trait UserEmailRepository: Send + Sync { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error>; async fn count(&mut self, user: &User) -> Result; @@ -286,7 +286,7 @@ impl<'c> UserEmailRepository for PgUserEmailRepository<'c> { async fn list_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, DatabaseError> { let mut query = QueryBuilder::new( r#" @@ -302,7 +302,7 @@ impl<'c> UserEmailRepository for PgUserEmailRepository<'c> { query .push(" WHERE user_id = ") .push_bind(Uuid::from(user.id)) - .generate_pagination("ue.user_email_id", &pagination); + .generate_pagination("ue.user_email_id", pagination); let edges: Vec = query .build_query_as() diff --git a/crates/storage/src/user/session.rs b/crates/storage/src/user/session.rs index a837c204..10b96da7 100644 --- a/crates/storage/src/user/session.rs +++ b/crates/storage/src/user/session.rs @@ -45,7 +45,7 @@ pub trait BrowserSessionRepository: Send + Sync { async fn list_active_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error>; async fn count_active(&mut self, user: &User) -> Result; @@ -261,7 +261,7 @@ impl<'c> BrowserSessionRepository for PgBrowserSessionRepository<'c> { async fn list_active_paginated( &mut self, user: &User, - pagination: &Pagination, + pagination: Pagination, ) -> Result, Self::Error> { // TODO: ordering of last authentication is wrong let mut query = QueryBuilder::new(