Skip to content

Commit 0d3cddc

Browse files
authored
Add the user deactivation state in the admin API (#4603)
2 parents 21c8ccf + a11610d commit 0d3cddc

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

crates/handlers/src/admin/model.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,9 @@ pub struct User {
4747
/// When the user was locked. If null, the user is not locked.
4848
locked_at: Option<DateTime<Utc>>,
4949

50+
/// When the user was deactivated. If null, the user is not deactivated.
51+
deactivated_at: Option<DateTime<Utc>>,
52+
5053
/// Whether the user can request admin privileges.
5154
admin: bool,
5255
}
@@ -60,20 +63,23 @@ impl User {
6063
username: "alice".to_owned(),
6164
created_at: DateTime::default(),
6265
locked_at: None,
66+
deactivated_at: None,
6367
admin: false,
6468
},
6569
Self {
6670
id: Ulid::from_bytes([0x02; 16]),
6771
username: "bob".to_owned(),
6872
created_at: DateTime::default(),
6973
locked_at: None,
74+
deactivated_at: None,
7075
admin: true,
7176
},
7277
Self {
7378
id: Ulid::from_bytes([0x03; 16]),
7479
username: "charlie".to_owned(),
7580
created_at: DateTime::default(),
7681
locked_at: Some(DateTime::default()),
82+
deactivated_at: None,
7783
admin: false,
7884
},
7985
]
@@ -87,6 +93,7 @@ impl From<mas_data_model::User> for User {
8793
username: user.username,
8894
created_at: user.created_at,
8995
locked_at: user.locked_at,
96+
deactivated_at: user.deactivated_at,
9097
admin: user.can_request_admin,
9198
}
9299
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ use crate::{
3232
enum UserStatus {
3333
Active,
3434
Locked,
35+
Deactivated,
3536
}
3637

3738
impl std::fmt::Display for UserStatus {
3839
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3940
match self {
4041
Self::Active => write!(f, "active"),
4142
Self::Locked => write!(f, "locked"),
43+
Self::Deactivated => write!(f, "deactivated"),
4244
}
4345
}
4446
}
@@ -58,7 +60,9 @@ pub struct FilterParams {
5860
///
5961
/// * `active`: Only retrieve active users
6062
///
61-
/// * `locked`: Only retrieve locked users
63+
/// * `locked`: Only retrieve locked users (includes deactivated users)
64+
///
65+
/// * `deactivated`: Only retrieve deactivated users
6266
#[serde(rename = "filter[status]")]
6367
status: Option<UserStatus>,
6468
}
@@ -142,6 +146,7 @@ pub async fn handler(
142146
let filter = match params.status {
143147
Some(UserStatus::Active) => filter.active_only(),
144148
Some(UserStatus::Locked) => filter.locked_only(),
149+
Some(UserStatus::Deactivated) => filter.deactivated_only(),
145150
None => filter,
146151
};
147152

docs/api/spec.json

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -873,9 +873,9 @@
873873
{
874874
"in": "query",
875875
"name": "filter[status]",
876-
"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",
876+
"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",
877877
"schema": {
878-
"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",
878+
"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",
879879
"$ref": "#/components/schemas/UserStatus",
880880
"nullable": true
881881
},
@@ -902,6 +902,7 @@
902902
"username": "alice",
903903
"created_at": "1970-01-01T00:00:00Z",
904904
"locked_at": null,
905+
"deactivated_at": null,
905906
"admin": false
906907
},
907908
"links": {
@@ -915,6 +916,7 @@
915916
"username": "bob",
916917
"created_at": "1970-01-01T00:00:00Z",
917918
"locked_at": null,
919+
"deactivated_at": null,
918920
"admin": true
919921
},
920922
"links": {
@@ -928,6 +930,7 @@
928930
"username": "charlie",
929931
"created_at": "1970-01-01T00:00:00Z",
930932
"locked_at": "1970-01-01T00:00:00Z",
933+
"deactivated_at": null,
931934
"admin": false
932935
},
933936
"links": {
@@ -979,6 +982,7 @@
979982
"username": "alice",
980983
"created_at": "1970-01-01T00:00:00Z",
981984
"locked_at": null,
985+
"deactivated_at": null,
982986
"admin": false
983987
},
984988
"links": {
@@ -1064,6 +1068,7 @@
10641068
"username": "alice",
10651069
"created_at": "1970-01-01T00:00:00Z",
10661070
"locked_at": null,
1071+
"deactivated_at": null,
10671072
"admin": false
10681073
},
10691074
"links": {
@@ -1220,6 +1225,7 @@
12201225
"username": "alice",
12211226
"created_at": "1970-01-01T00:00:00Z",
12221227
"locked_at": null,
1228+
"deactivated_at": null,
12231229
"admin": false
12241230
},
12251231
"links": {
@@ -1299,6 +1305,7 @@
12991305
"username": "bob",
13001306
"created_at": "1970-01-01T00:00:00Z",
13011307
"locked_at": null,
1308+
"deactivated_at": null,
13021309
"admin": true
13031310
},
13041311
"links": {
@@ -1368,6 +1375,7 @@
13681375
"username": "charlie",
13691376
"created_at": "1970-01-01T00:00:00Z",
13701377
"locked_at": "1970-01-01T00:00:00Z",
1378+
"deactivated_at": null,
13711379
"admin": false
13721380
},
13731381
"links": {
@@ -1437,6 +1445,7 @@
14371445
"username": "charlie",
14381446
"created_at": "1970-01-01T00:00:00Z",
14391447
"locked_at": "1970-01-01T00:00:00Z",
1448+
"deactivated_at": null,
14401449
"admin": false
14411450
},
14421451
"links": {
@@ -1505,6 +1514,7 @@
15051514
"username": "alice",
15061515
"created_at": "1970-01-01T00:00:00Z",
15071516
"locked_at": null,
1517+
"deactivated_at": null,
15081518
"admin": false
15091519
},
15101520
"links": {
@@ -3132,7 +3142,7 @@
31323142
"nullable": true
31333143
},
31343144
"filter[status]": {
3135-
"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",
3145+
"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",
31363146
"$ref": "#/components/schemas/UserStatus",
31373147
"nullable": true
31383148
}
@@ -3142,7 +3152,8 @@
31423152
"type": "string",
31433153
"enum": [
31443154
"active",
3145-
"locked"
3155+
"locked",
3156+
"deactivated"
31463157
]
31473158
},
31483159
"PaginatedResponse_for_User": {
@@ -3223,6 +3234,12 @@
32233234
"format": "date-time",
32243235
"nullable": true
32253236
},
3237+
"deactivated_at": {
3238+
"description": "When the user was deactivated. If null, the user is not deactivated.",
3239+
"type": "string",
3240+
"format": "date-time",
3241+
"nullable": true
3242+
},
32263243
"admin": {
32273244
"description": "Whether the user can request admin privileges.",
32283245
"type": "boolean"

0 commit comments

Comments
 (0)