Skip to content

Commit 18cb990

Browse files
authored
Expose the legacy guest/non-guest flag on users in the admin API (#5014)
2 parents 1b168ed + 1e1dfda commit 18cb990

13 files changed

+140
-19
lines changed

crates/data-model/src/users.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub struct User {
2121
pub locked_at: Option<DateTime<Utc>>,
2222
pub deactivated_at: Option<DateTime<Utc>>,
2323
pub can_request_admin: bool,
24+
pub is_guest: bool,
2425
}
2526

2627
impl User {
@@ -43,6 +44,7 @@ impl User {
4344
locked_at: None,
4445
deactivated_at: None,
4546
can_request_admin: false,
47+
is_guest: false,
4648
}]
4749
}
4850
}

crates/handlers/src/admin/model.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ pub struct User {
5252

5353
/// Whether the user can request admin privileges.
5454
admin: bool,
55+
56+
/// Whether the user was a guest before migrating to MAS,
57+
legacy_guest: bool,
5558
}
5659

5760
impl User {
@@ -65,6 +68,7 @@ impl User {
6568
locked_at: None,
6669
deactivated_at: None,
6770
admin: false,
71+
legacy_guest: false,
6872
},
6973
Self {
7074
id: Ulid::from_bytes([0x02; 16]),
@@ -73,6 +77,7 @@ impl User {
7377
locked_at: None,
7478
deactivated_at: None,
7579
admin: true,
80+
legacy_guest: false,
7681
},
7782
Self {
7883
id: Ulid::from_bytes([0x03; 16]),
@@ -81,6 +86,7 @@ impl User {
8186
locked_at: Some(DateTime::default()),
8287
deactivated_at: None,
8388
admin: false,
89+
legacy_guest: true,
8490
},
8591
]
8692
}
@@ -95,6 +101,7 @@ impl From<mas_data_model::User> for User {
95101
locked_at: user.locked_at,
96102
deactivated_at: user.deactivated_at,
97103
admin: user.can_request_admin,
104+
legacy_guest: user.is_guest,
98105
}
99106
}
100107
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ mod tests {
209209
"created_at": "2022-01-16T14:40:00Z",
210210
"locked_at": null,
211211
"deactivated_at": "2022-01-16T14:40:00Z",
212-
"admin": false
212+
"admin": false,
213+
"legacy_guest": false
213214
},
214215
"links": {
215216
"self": "/api/admin/v1/users/01FSHN9AG0MZAA6S4AF7CTV32E"
@@ -289,7 +290,8 @@ mod tests {
289290
"created_at": "2022-01-16T14:40:00Z",
290291
"locked_at": "2022-01-16T14:40:00Z",
291292
"deactivated_at": "2022-01-16T14:41:00Z",
292-
"admin": false
293+
"admin": false,
294+
"legacy_guest": false
293295
},
294296
"links": {
295297
"self": "/api/admin/v1/users/01FSHN9AG0MZAA6S4AF7CTV32E"

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/handlers/src/rate_limit.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ mod tests {
328328
locked_at: None,
329329
deactivated_at: None,
330330
can_request_admin: false,
331+
is_guest: true,
331332
};
332333

333334
let bob = User {
@@ -338,6 +339,7 @@ mod tests {
338339
locked_at: None,
339340
deactivated_at: None,
340341
can_request_admin: false,
342+
is_guest: true,
341343
};
342344

343345
// Three times the same IP address should be allowed
Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 8 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/storage-pg/src/iden.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ pub enum Users {
3939
LockedAt,
4040
DeactivatedAt,
4141
CanRequestAdmin,
42+
IsGuest,
4243
}
4344

4445
#[derive(sea_query::Iden)]

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ mod priv_ {
7373
pub(super) locked_at: Option<DateTime<Utc>>,
7474
pub(super) deactivated_at: Option<DateTime<Utc>>,
7575
pub(super) can_request_admin: bool,
76+
pub(super) is_guest: bool,
7677
}
7778
}
7879

@@ -89,6 +90,7 @@ impl From<UserLookup> for User {
8990
locked_at: value.locked_at,
9091
deactivated_at: value.deactivated_at,
9192
can_request_admin: value.can_request_admin,
93+
is_guest: value.is_guest,
9294
}
9395
}
9496
}
@@ -114,6 +116,10 @@ impl Filter for UserFilter<'_> {
114116
.add_option(self.can_request_admin().map(|can_request_admin| {
115117
Expr::col((Users::Table, Users::CanRequestAdmin)).eq(can_request_admin)
116118
}))
119+
.add_option(
120+
self.is_guest()
121+
.map(|is_guest| Expr::col((Users::Table, Users::IsGuest)).eq(is_guest)),
122+
)
117123
}
118124
}
119125

@@ -140,6 +146,7 @@ impl UserRepository for PgUserRepository<'_> {
140146
, locked_at
141147
, deactivated_at
142148
, can_request_admin
149+
, is_guest
143150
FROM users
144151
WHERE user_id = $1
145152
"#,
@@ -176,6 +183,7 @@ impl UserRepository for PgUserRepository<'_> {
176183
, locked_at
177184
, deactivated_at
178185
, can_request_admin
186+
, is_guest
179187
FROM users
180188
WHERE LOWER(username) = LOWER($1)
181189
"#,
@@ -249,6 +257,7 @@ impl UserRepository for PgUserRepository<'_> {
249257
locked_at: None,
250258
deactivated_at: None,
251259
can_request_admin: false,
260+
is_guest: false,
252261
})
253262
}
254263

@@ -487,6 +496,10 @@ impl UserRepository for PgUserRepository<'_> {
487496
Expr::col((Users::Table, Users::CanRequestAdmin)),
488497
UserLookupIden::CanRequestAdmin,
489498
)
499+
.expr_as(
500+
Expr::col((Users::Table, Users::IsGuest)),
501+
UserLookupIden::IsGuest,
502+
)
490503
.from(Users::Table)
491504
.apply_filter(filter)
492505
.generate_pagination((Users::Table, Users::UserId), pagination)

0 commit comments

Comments
 (0)