Skip to content

Commit 278d2af

Browse files
committed
Allow filtering guest/non-guest users
1 parent a81f9a6 commit 278d2af

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

crates/handlers/src/admin/v1/users/list.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ pub struct FilterParams {
5454
#[serde(rename = "filter[admin]")]
5555
admin: Option<bool>,
5656

57+
/// Retrieve users with (or without) the `legacy_guest` flag set
58+
#[serde(rename = "filter[legacy-guest]")]
59+
legacy_guest: Option<bool>,
60+
5761
/// Retrieve the items with the given status
5862
///
5963
/// Defaults to retrieve all users, including locked ones.
@@ -75,6 +79,10 @@ impl std::fmt::Display for FilterParams {
7579
write!(f, "{sep}filter[admin]={admin}")?;
7680
sep = '&';
7781
}
82+
if let Some(legacy_guest) = self.legacy_guest {
83+
write!(f, "{sep}filter[legacy-guest]={legacy_guest}")?;
84+
sep = '&';
85+
}
7886
if let Some(status) = self.status {
7987
write!(f, "{sep}filter[status]={status}")?;
8088
sep = '&';
@@ -143,6 +151,12 @@ pub async fn handler(
143151
None => filter,
144152
};
145153

154+
let filter = match params.legacy_guest {
155+
Some(true) => filter.guest_only(),
156+
Some(false) => filter.non_guest_only(),
157+
None => filter,
158+
};
159+
146160
let filter = match params.status {
147161
Some(UserStatus::Active) => filter.active_only(),
148162
Some(UserStatus::Locked) => filter.locked_only(),

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ impl Filter for UserFilter<'_> {
116116
.add_option(self.can_request_admin().map(|can_request_admin| {
117117
Expr::col((Users::Table, Users::CanRequestAdmin)).eq(can_request_admin)
118118
}))
119+
.add_option(
120+
self.is_guest()
121+
.map(|is_guest| Expr::col((Users::Table, Users::IsGuest)).eq(is_guest)),
122+
)
119123
}
120124
}
121125

crates/storage/src/user/mod.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ impl UserState {
7575
pub struct UserFilter<'a> {
7676
state: Option<UserState>,
7777
can_request_admin: Option<bool>,
78+
is_guest: Option<bool>,
7879
_phantom: std::marker::PhantomData<&'a ()>,
7980
}
8081

@@ -120,6 +121,20 @@ impl UserFilter<'_> {
120121
self
121122
}
122123

124+
/// Filter for guest users
125+
#[must_use]
126+
pub fn guest_only(mut self) -> Self {
127+
self.is_guest = Some(true);
128+
self
129+
}
130+
131+
/// Filter for non-guest users
132+
#[must_use]
133+
pub fn non_guest_only(mut self) -> Self {
134+
self.is_guest = Some(false);
135+
self
136+
}
137+
123138
/// Get the state filter
124139
///
125140
/// Returns [`None`] if no state filter was set
@@ -135,6 +150,14 @@ impl UserFilter<'_> {
135150
pub fn can_request_admin(&self) -> Option<bool> {
136151
self.can_request_admin
137152
}
153+
154+
/// Get the is guest filter
155+
///
156+
/// Returns [`None`] if no is guest filter was set
157+
#[must_use]
158+
pub fn is_guest(&self) -> Option<bool> {
159+
self.is_guest
160+
}
138161
}
139162

140163
/// A [`UserRepository`] helps interacting with [`User`] saved in the storage

docs/api/spec.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,17 @@
904904
},
905905
"style": "form"
906906
},
907+
{
908+
"in": "query",
909+
"name": "filter[legacy-guest]",
910+
"description": "Retrieve users with (or without) the `legacy_guest` flag set",
911+
"schema": {
912+
"description": "Retrieve users with (or without) the `legacy_guest` flag set",
913+
"type": "boolean",
914+
"nullable": true
915+
},
916+
"style": "form"
917+
},
907918
{
908919
"in": "query",
909920
"name": "filter[status]",
@@ -3877,6 +3888,11 @@
38773888
"type": "boolean",
38783889
"nullable": true
38793890
},
3891+
"filter[legacy-guest]": {
3892+
"description": "Retrieve users with (or without) the `legacy_guest` flag set",
3893+
"type": "boolean",
3894+
"nullable": true
3895+
},
38803896
"filter[status]": {
38813897
"description": "Retrieve the items with the given status\n\nDefaults to retrieve all users, including locked ones.\n\n* `active`: Only retrieve active users\n\n* `locked`: Only retrieve locked users (includes deactivated users)\n\n* `deactivated`: Only retrieve deactivated users",
38823898
"$ref": "#/components/schemas/UserStatus",

0 commit comments

Comments
 (0)