diff --git a/crates/handlers/src/admin/model.rs b/crates/handlers/src/admin/model.rs index df17e2d91..31478d47e 100644 --- a/crates/handlers/src/admin/model.rs +++ b/crates/handlers/src/admin/model.rs @@ -47,6 +47,9 @@ pub struct User { /// When the user was locked. If null, the user is not locked. locked_at: Option>, + /// When the user was deactivated. If null, the user is not deactivated. + deactivated_at: Option>, + /// Whether the user can request admin privileges. admin: bool, } @@ -60,6 +63,7 @@ impl User { username: "alice".to_owned(), created_at: DateTime::default(), locked_at: None, + deactivated_at: None, admin: false, }, Self { @@ -67,6 +71,7 @@ impl User { username: "bob".to_owned(), created_at: DateTime::default(), locked_at: None, + deactivated_at: None, admin: true, }, Self { @@ -74,6 +79,7 @@ impl User { username: "charlie".to_owned(), created_at: DateTime::default(), locked_at: Some(DateTime::default()), + deactivated_at: None, admin: false, }, ] @@ -87,6 +93,7 @@ impl From for User { username: user.username, created_at: user.created_at, locked_at: user.locked_at, + deactivated_at: user.deactivated_at, admin: user.can_request_admin, } } diff --git a/crates/handlers/src/admin/v1/users/list.rs b/crates/handlers/src/admin/v1/users/list.rs index 17bd82ede..9bc04ab4a 100644 --- a/crates/handlers/src/admin/v1/users/list.rs +++ b/crates/handlers/src/admin/v1/users/list.rs @@ -32,6 +32,7 @@ use crate::{ enum UserStatus { Active, Locked, + Deactivated, } impl std::fmt::Display for UserStatus { @@ -39,6 +40,7 @@ impl std::fmt::Display for UserStatus { match self { Self::Active => write!(f, "active"), Self::Locked => write!(f, "locked"), + Self::Deactivated => write!(f, "deactivated"), } } } @@ -58,7 +60,9 @@ pub struct FilterParams { /// /// * `active`: Only retrieve active users /// - /// * `locked`: Only retrieve locked users + /// * `locked`: Only retrieve locked users (includes deactivated users) + /// + /// * `deactivated`: Only retrieve deactivated users #[serde(rename = "filter[status]")] status: Option, } @@ -142,6 +146,7 @@ pub async fn handler( let filter = match params.status { Some(UserStatus::Active) => filter.active_only(), Some(UserStatus::Locked) => filter.locked_only(), + Some(UserStatus::Deactivated) => filter.deactivated_only(), None => filter, }; diff --git a/docs/api/spec.json b/docs/api/spec.json index 5b479b942..6e90e231f 100644 --- a/docs/api/spec.json +++ b/docs/api/spec.json @@ -873,9 +873,9 @@ { "in": "query", "name": "filter[status]", - "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", + "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", "schema": { - "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", + "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", "$ref": "#/components/schemas/UserStatus", "nullable": true }, @@ -902,6 +902,7 @@ "username": "alice", "created_at": "1970-01-01T00:00:00Z", "locked_at": null, + "deactivated_at": null, "admin": false }, "links": { @@ -915,6 +916,7 @@ "username": "bob", "created_at": "1970-01-01T00:00:00Z", "locked_at": null, + "deactivated_at": null, "admin": true }, "links": { @@ -928,6 +930,7 @@ "username": "charlie", "created_at": "1970-01-01T00:00:00Z", "locked_at": "1970-01-01T00:00:00Z", + "deactivated_at": null, "admin": false }, "links": { @@ -979,6 +982,7 @@ "username": "alice", "created_at": "1970-01-01T00:00:00Z", "locked_at": null, + "deactivated_at": null, "admin": false }, "links": { @@ -1064,6 +1068,7 @@ "username": "alice", "created_at": "1970-01-01T00:00:00Z", "locked_at": null, + "deactivated_at": null, "admin": false }, "links": { @@ -1220,6 +1225,7 @@ "username": "alice", "created_at": "1970-01-01T00:00:00Z", "locked_at": null, + "deactivated_at": null, "admin": false }, "links": { @@ -1299,6 +1305,7 @@ "username": "bob", "created_at": "1970-01-01T00:00:00Z", "locked_at": null, + "deactivated_at": null, "admin": true }, "links": { @@ -1368,6 +1375,7 @@ "username": "charlie", "created_at": "1970-01-01T00:00:00Z", "locked_at": "1970-01-01T00:00:00Z", + "deactivated_at": null, "admin": false }, "links": { @@ -1437,6 +1445,7 @@ "username": "charlie", "created_at": "1970-01-01T00:00:00Z", "locked_at": "1970-01-01T00:00:00Z", + "deactivated_at": null, "admin": false }, "links": { @@ -1505,6 +1514,7 @@ "username": "alice", "created_at": "1970-01-01T00:00:00Z", "locked_at": null, + "deactivated_at": null, "admin": false }, "links": { @@ -3132,7 +3142,7 @@ "nullable": true }, "filter[status]": { - "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", + "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", "$ref": "#/components/schemas/UserStatus", "nullable": true } @@ -3142,7 +3152,8 @@ "type": "string", "enum": [ "active", - "locked" + "locked", + "deactivated" ] }, "PaginatedResponse_for_User": { @@ -3223,6 +3234,12 @@ "format": "date-time", "nullable": true }, + "deactivated_at": { + "description": "When the user was deactivated. If null, the user is not deactivated.", + "type": "string", + "format": "date-time", + "nullable": true + }, "admin": { "description": "Whether the user can request admin privileges.", "type": "boolean"