Skip to content

Commit a81f9a6

Browse files
committed
Surface the user guest flag in the admin API
1 parent 1b168ed commit a81f9a6

11 files changed

+102
-38
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: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -200,26 +200,27 @@ mod tests {
200200
let body: serde_json::Value = response.json();
201201

202202
allow_duplicates!(assert_json_snapshot!(body, @r#"
203-
{
204-
"data": {
205-
"type": "user",
206-
"id": "01FSHN9AG0MZAA6S4AF7CTV32E",
207-
"attributes": {
208-
"username": "alice",
209-
"created_at": "2022-01-16T14:40:00Z",
210-
"locked_at": null,
211-
"deactivated_at": "2022-01-16T14:40:00Z",
212-
"admin": false
213-
},
214-
"links": {
215-
"self": "/api/admin/v1/users/01FSHN9AG0MZAA6S4AF7CTV32E"
216-
}
217-
},
218-
"links": {
219-
"self": "/api/admin/v1/users/01FSHN9AG0MZAA6S4AF7CTV32E"
220-
}
221-
}
222-
"#));
203+
allow_duplicates!({
204+
allow_duplicates!( "data": {
205+
allow_duplicates!( "type": "user",
206+
allow_duplicates!( "id": "01FSHN9AG0MZAA6S4AF7CTV32E",
207+
allow_duplicates!( "attributes": {
208+
allow_duplicates!( "username": "alice",
209+
allow_duplicates!( "created_at": "2022-01-16T14:40:00Z",
210+
allow_duplicates!( "locked_at": null,
211+
allow_duplicates!( "deactivated_at": "2022-01-16T14:40:00Z",
212+
allow_duplicates!( "admin": false,
213+
allow_duplicates!( "legacy_guest": false
214+
allow_duplicates!( },
215+
allow_duplicates!( "links": {
216+
allow_duplicates!( "self": "/api/admin/v1/users/01FSHN9AG0MZAA6S4AF7CTV32E"
217+
allow_duplicates!( }
218+
allow_duplicates!( },
219+
allow_duplicates!( "links": {
220+
allow_duplicates!( "self": "/api/admin/v1/users/01FSHN9AG0MZAA6S4AF7CTV32E"
221+
allow_duplicates!( }
222+
allow_duplicates!(}
223+
allow_duplicates!("#));
223224
}
224225

225226
#[sqlx::test(migrator = "mas_storage_pg::MIGRATOR")]
@@ -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/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: 9 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
}
@@ -140,6 +142,7 @@ impl UserRepository for PgUserRepository<'_> {
140142
, locked_at
141143
, deactivated_at
142144
, can_request_admin
145+
, is_guest
143146
FROM users
144147
WHERE user_id = $1
145148
"#,
@@ -176,6 +179,7 @@ impl UserRepository for PgUserRepository<'_> {
176179
, locked_at
177180
, deactivated_at
178181
, can_request_admin
182+
, is_guest
179183
FROM users
180184
WHERE LOWER(username) = LOWER($1)
181185
"#,
@@ -249,6 +253,7 @@ impl UserRepository for PgUserRepository<'_> {
249253
locked_at: None,
250254
deactivated_at: None,
251255
can_request_admin: false,
256+
is_guest: false,
252257
})
253258
}
254259

@@ -487,6 +492,10 @@ impl UserRepository for PgUserRepository<'_> {
487492
Expr::col((Users::Table, Users::CanRequestAdmin)),
488493
UserLookupIden::CanRequestAdmin,
489494
)
495+
.expr_as(
496+
Expr::col((Users::Table, Users::IsGuest)),
497+
UserLookupIden::IsGuest,
498+
)
490499
.from(Users::Table)
491500
.apply_filter(filter)
492501
.generate_pagination((Users::Table, Users::UserId), pagination)

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ struct SessionLookup {
6161
user_locked_at: Option<DateTime<Utc>>,
6262
user_deactivated_at: Option<DateTime<Utc>>,
6363
user_can_request_admin: bool,
64+
user_is_guest: bool,
6465
}
6566

6667
impl TryFrom<SessionLookup> for BrowserSession {
@@ -76,6 +77,7 @@ impl TryFrom<SessionLookup> for BrowserSession {
7677
locked_at: value.user_locked_at,
7778
deactivated_at: value.user_deactivated_at,
7879
can_request_admin: value.user_can_request_admin,
80+
is_guest: value.user_is_guest,
7981
};
8082

8183
Ok(BrowserSession {
@@ -201,6 +203,7 @@ impl BrowserSessionRepository for PgBrowserSessionRepository<'_> {
201203
, u.locked_at AS "user_locked_at"
202204
, u.deactivated_at AS "user_deactivated_at"
203205
, u.can_request_admin AS "user_can_request_admin"
206+
, u.is_guest AS "user_is_guest"
204207
FROM user_sessions s
205208
INNER JOIN users u
206209
USING (user_id)
@@ -391,6 +394,10 @@ impl BrowserSessionRepository for PgBrowserSessionRepository<'_> {
391394
Expr::col((Users::Table, Users::CanRequestAdmin)),
392395
SessionLookupIden::UserCanRequestAdmin,
393396
)
397+
.expr_as(
398+
Expr::col((Users::Table, Users::IsGuest)),
399+
SessionLookupIden::UserIsGuest,
400+
)
394401
.from(UserSessions::Table)
395402
.inner_join(
396403
Users::Table,

0 commit comments

Comments
 (0)