Skip to content

Commit 5e0f70c

Browse files
committed
storage: make the edges in pages include cursors
1 parent dd7d401 commit 5e0f70c

File tree

17 files changed

+246
-109
lines changed

17 files changed

+246
-109
lines changed

crates/storage-pg/src/app_session.rs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ mod priv_ {
5555
use std::net::IpAddr;
5656

5757
use chrono::{DateTime, Utc};
58+
use mas_storage::pagination::Node;
5859
use sea_query::enum_def;
60+
use ulid::Ulid;
5961
use uuid::Uuid;
6062

6163
#[derive(sqlx::FromRow)]
@@ -77,6 +79,12 @@ mod priv_ {
7779
pub(super) last_active_at: Option<DateTime<Utc>>,
7880
pub(super) last_active_ip: Option<IpAddr>,
7981
}
82+
83+
impl Node<Ulid> for AppSessionLookup {
84+
fn cursor(&self) -> Ulid {
85+
self.cursor.into()
86+
}
87+
}
8088
}
8189

8290
use priv_::{AppSessionLookup, AppSessionLookupIden};
@@ -592,13 +600,13 @@ mod tests {
592600
let full_list = repo.app_session().list(all, pagination).await.unwrap();
593601
assert_eq!(full_list.edges.len(), 1);
594602
assert_eq!(
595-
full_list.edges[0],
603+
full_list.edges[0].node,
596604
AppSession::Compat(Box::new(compat_session.clone()))
597605
);
598606
let active_list = repo.app_session().list(active, pagination).await.unwrap();
599607
assert_eq!(active_list.edges.len(), 1);
600608
assert_eq!(
601-
active_list.edges[0],
609+
active_list.edges[0].node,
602610
AppSession::Compat(Box::new(compat_session.clone()))
603611
);
604612
let finished_list = repo.app_session().list(finished, pagination).await.unwrap();
@@ -618,15 +626,15 @@ mod tests {
618626
let full_list = repo.app_session().list(all, pagination).await.unwrap();
619627
assert_eq!(full_list.edges.len(), 1);
620628
assert_eq!(
621-
full_list.edges[0],
629+
full_list.edges[0].node,
622630
AppSession::Compat(Box::new(compat_session.clone()))
623631
);
624632
let active_list = repo.app_session().list(active, pagination).await.unwrap();
625633
assert!(active_list.edges.is_empty());
626634
let finished_list = repo.app_session().list(finished, pagination).await.unwrap();
627635
assert_eq!(finished_list.edges.len(), 1);
628636
assert_eq!(
629-
finished_list.edges[0],
637+
finished_list.edges[0].node,
630638
AppSession::Compat(Box::new(compat_session.clone()))
631639
);
632640

@@ -680,25 +688,25 @@ mod tests {
680688
let full_list = repo.app_session().list(all, pagination).await.unwrap();
681689
assert_eq!(full_list.edges.len(), 2);
682690
assert_eq!(
683-
full_list.edges[0],
691+
full_list.edges[0].node,
684692
AppSession::Compat(Box::new(compat_session.clone()))
685693
);
686694
assert_eq!(
687-
full_list.edges[1],
695+
full_list.edges[1].node,
688696
AppSession::OAuth2(Box::new(oauth_session.clone()))
689697
);
690698

691699
let active_list = repo.app_session().list(active, pagination).await.unwrap();
692700
assert_eq!(active_list.edges.len(), 1);
693701
assert_eq!(
694-
active_list.edges[0],
702+
active_list.edges[0].node,
695703
AppSession::OAuth2(Box::new(oauth_session.clone()))
696704
);
697705

698706
let finished_list = repo.app_session().list(finished, pagination).await.unwrap();
699707
assert_eq!(finished_list.edges.len(), 1);
700708
assert_eq!(
701-
finished_list.edges[0],
709+
finished_list.edges[0].node,
702710
AppSession::Compat(Box::new(compat_session.clone()))
703711
);
704712

@@ -716,11 +724,11 @@ mod tests {
716724
let full_list = repo.app_session().list(all, pagination).await.unwrap();
717725
assert_eq!(full_list.edges.len(), 2);
718726
assert_eq!(
719-
full_list.edges[0],
727+
full_list.edges[0].node,
720728
AppSession::Compat(Box::new(compat_session.clone()))
721729
);
722730
assert_eq!(
723-
full_list.edges[1],
731+
full_list.edges[1].node,
724732
AppSession::OAuth2(Box::new(oauth_session.clone()))
725733
);
726734

@@ -730,11 +738,11 @@ mod tests {
730738
let finished_list = repo.app_session().list(finished, pagination).await.unwrap();
731739
assert_eq!(finished_list.edges.len(), 2);
732740
assert_eq!(
733-
finished_list.edges[0],
741+
finished_list.edges[0].node,
734742
AppSession::Compat(Box::new(compat_session.clone()))
735743
);
736744
assert_eq!(
737-
full_list.edges[1],
745+
full_list.edges[1].node,
738746
AppSession::OAuth2(Box::new(oauth_session.clone()))
739747
);
740748

@@ -744,7 +752,7 @@ mod tests {
744752
let list = repo.app_session().list(filter, pagination).await.unwrap();
745753
assert_eq!(list.edges.len(), 1);
746754
assert_eq!(
747-
list.edges[0],
755+
list.edges[0].node,
748756
AppSession::Compat(Box::new(compat_session.clone()))
749757
);
750758

@@ -753,7 +761,7 @@ mod tests {
753761
let list = repo.app_session().list(filter, pagination).await.unwrap();
754762
assert_eq!(list.edges.len(), 1);
755763
assert_eq!(
756-
list.edges[0],
764+
list.edges[0].node,
757765
AppSession::OAuth2(Box::new(oauth_session.clone()))
758766
);
759767

crates/storage-pg/src/compat/mod.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,14 @@ mod tests {
9292

9393
let full_list = repo.compat_session().list(all, pagination).await.unwrap();
9494
assert_eq!(full_list.edges.len(), 1);
95-
assert_eq!(full_list.edges[0].0.id, session.id);
95+
assert_eq!(full_list.edges[0].node.0.id, session.id);
9696
let active_list = repo
9797
.compat_session()
9898
.list(active, pagination)
9999
.await
100100
.unwrap();
101101
assert_eq!(active_list.edges.len(), 1);
102-
assert_eq!(active_list.edges[0].0.id, session.id);
102+
assert_eq!(active_list.edges[0].node.0.id, session.id);
103103
let finished_list = repo
104104
.compat_session()
105105
.list(finished, pagination)
@@ -150,7 +150,7 @@ mod tests {
150150
.await
151151
.unwrap();
152152
assert_eq!(list.edges.len(), 1);
153-
let session_lookup = &list.edges[0].0;
153+
let session_lookup = &list.edges[0].node.0;
154154
assert_eq!(session_lookup.id, session.id);
155155
assert_eq!(session_lookup.user_id, user.id);
156156
assert_eq!(session.device.as_ref().unwrap().as_str(), device_str);
@@ -168,7 +168,7 @@ mod tests {
168168

169169
let full_list = repo.compat_session().list(all, pagination).await.unwrap();
170170
assert_eq!(full_list.edges.len(), 1);
171-
assert_eq!(full_list.edges[0].0.id, session.id);
171+
assert_eq!(full_list.edges[0].node.0.id, session.id);
172172
let active_list = repo
173173
.compat_session()
174174
.list(active, pagination)
@@ -181,7 +181,7 @@ mod tests {
181181
.await
182182
.unwrap();
183183
assert_eq!(finished_list.edges.len(), 1);
184-
assert_eq!(finished_list.edges[0].0.id, session.id);
184+
assert_eq!(finished_list.edges[0].node.0.id, session.id);
185185

186186
// Reload the session and check again
187187
let session_lookup = repo
@@ -260,14 +260,14 @@ mod tests {
260260
.await
261261
.unwrap();
262262
assert_eq!(list.edges.len(), 1);
263-
assert_eq!(list.edges[0].0.id, sso_login_session.id);
263+
assert_eq!(list.edges[0].node.0.id, sso_login_session.id);
264264
let list = repo
265265
.compat_session()
266266
.list(unknown, pagination)
267267
.await
268268
.unwrap();
269269
assert_eq!(list.edges.len(), 1);
270-
assert_eq!(list.edges[0].0.id, unknown_session.id);
270+
assert_eq!(list.edges[0].node.0.id, unknown_session.id);
271271

272272
// Check that combining the two filters works
273273
// At this point, there is one active SSO login session and one finished unknown
@@ -696,7 +696,8 @@ mod tests {
696696
// List all logins
697697
let logins = repo.compat_sso_login().list(all, pagination).await.unwrap();
698698
assert!(!logins.has_next_page);
699-
assert_eq!(logins.edges, vec![login.clone()]);
699+
assert_eq!(logins.edges.len(), 1);
700+
assert_eq!(logins.edges[0].node, login);
700701

701702
// List the logins for the user
702703
let logins = repo
@@ -705,7 +706,8 @@ mod tests {
705706
.await
706707
.unwrap();
707708
assert!(!logins.has_next_page);
708-
assert_eq!(logins.edges, vec![login.clone()]);
709+
assert_eq!(logins.edges.len(), 1);
710+
assert_eq!(logins.edges[0].node, login);
709711

710712
// List only the pending logins for the user
711713
let logins = repo
@@ -732,6 +734,7 @@ mod tests {
732734
.await
733735
.unwrap();
734736
assert!(!logins.has_next_page);
735-
assert_eq!(logins.edges, &[login]);
737+
assert_eq!(logins.edges.len(), 1);
738+
assert_eq!(logins.edges[0].node, login);
736739
}
737740
}

crates/storage-pg/src/compat/session.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use mas_data_model::{
1515
use mas_storage::{
1616
Page, Pagination,
1717
compat::{CompatSessionFilter, CompatSessionRepository},
18+
pagination::Node,
1819
};
1920
use rand::RngCore;
2021
use sea_query::{Expr, PostgresQueryBuilder, Query, enum_def};
@@ -59,6 +60,12 @@ struct CompatSessionLookup {
5960
last_active_ip: Option<IpAddr>,
6061
}
6162

63+
impl Node<Ulid> for CompatSessionLookup {
64+
fn cursor(&self) -> Ulid {
65+
self.compat_session_id.into()
66+
}
67+
}
68+
6269
impl From<CompatSessionLookup> for CompatSession {
6370
fn from(value: CompatSessionLookup) -> Self {
6471
let id = value.compat_session_id.into();
@@ -106,6 +113,12 @@ struct CompatSessionAndSsoLoginLookup {
106113
compat_sso_login_exchanged_at: Option<DateTime<Utc>>,
107114
}
108115

116+
impl Node<Ulid> for CompatSessionAndSsoLoginLookup {
117+
fn cursor(&self) -> Ulid {
118+
self.compat_session_id.into()
119+
}
120+
}
121+
109122
impl TryFrom<CompatSessionAndSsoLoginLookup> for (CompatSession, Option<CompatSsoLogin>) {
110123
type Error = DatabaseInconsistencyError;
111124

crates/storage-pg/src/compat/sso_login.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use mas_data_model::{BrowserSession, Clock, CompatSession, CompatSsoLogin, Compa
1010
use mas_storage::{
1111
Page, Pagination,
1212
compat::{CompatSsoLoginFilter, CompatSsoLoginRepository},
13+
pagination::Node,
1314
};
1415
use rand::RngCore;
1516
use sea_query::{Expr, PostgresQueryBuilder, Query, enum_def};
@@ -54,6 +55,12 @@ struct CompatSsoLoginLookup {
5455
compat_session_id: Option<Uuid>,
5556
}
5657

58+
impl Node<Ulid> for CompatSsoLoginLookup {
59+
fn cursor(&self) -> Ulid {
60+
self.compat_sso_login_id.into()
61+
}
62+
}
63+
5764
impl TryFrom<CompatSsoLoginLookup> for CompatSsoLogin {
5865
type Error = DatabaseInconsistencyError;
5966

0 commit comments

Comments
 (0)