Skip to content
This repository was archived by the owner on May 13, 2026. It is now read-only.

Commit 8106f71

Browse files
feat(user-management): add delete user
1 parent 79367c5 commit 8106f71

3 files changed

Lines changed: 123 additions & 7 deletions

File tree

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
use async_trait::async_trait;
2+
use serde::Serialize;
3+
use thiserror::Error;
4+
5+
use crate::user_management::{UserId, UserManagement};
6+
use crate::{ResponseExt, WorkOsError, WorkOsResult};
7+
8+
/// The parameters for [`DeleteUser`].
9+
#[derive(Debug, Serialize)]
10+
pub struct DeleteUserParams<'a> {
11+
/// The unique ID of the user.
12+
pub user_id: &'a UserId,
13+
}
14+
15+
/// An error returned from [`DeleteUser`].
16+
#[derive(Debug, Error)]
17+
pub enum DeleteUserError {}
18+
19+
impl From<DeleteUserError> for WorkOsError<DeleteUserError> {
20+
fn from(err: DeleteUserError) -> Self {
21+
Self::Operation(err)
22+
}
23+
}
24+
25+
/// [WorkOS Docs: Delete a user](https://workos.com/docs/reference/user-management/user/delete)
26+
#[async_trait]
27+
pub trait DeleteUser {
28+
/// Permanently deletes a user in the current environment. It cannot be undone.
29+
///
30+
/// [WorkOS Docs: Delete a user](https://workos.com/docs/reference/user-management/user/delete)
31+
///
32+
/// # Examples
33+
///
34+
/// ```
35+
/// # use workos_sdk::WorkOsResult;
36+
/// # use workos_sdk::user_management::*;
37+
/// use workos_sdk::{ApiKey, WorkOs};
38+
///
39+
/// # async fn run() -> WorkOsResult<(), DeleteUserError> {
40+
/// let workos = WorkOs::new(&ApiKey::from("sk_example_123456789"));
41+
///
42+
/// workos
43+
/// .user_management()
44+
/// .delete_user(&DeleteUserParams {
45+
/// user_id: &UserId::from("user_01F3GZ5ZGZBZVQGZVHJFVXZJGZ"),
46+
/// })
47+
/// .await?;
48+
/// # Ok(())
49+
/// # }
50+
/// ```
51+
async fn delete_user(&self, params: &DeleteUserParams<'_>)
52+
-> WorkOsResult<(), DeleteUserError>;
53+
}
54+
55+
#[async_trait]
56+
impl DeleteUser for UserManagement<'_> {
57+
async fn delete_user(
58+
&self,
59+
params: &DeleteUserParams<'_>,
60+
) -> WorkOsResult<(), DeleteUserError> {
61+
let url = self
62+
.workos
63+
.base_url()
64+
.join(&format!("/user_management/users/{id}", id = params.user_id))?;
65+
self.workos
66+
.client()
67+
.delete(url)
68+
.bearer_auth(self.workos.key())
69+
.send()
70+
.await?
71+
.handle_unauthorized_or_generic_error()?;
72+
73+
Ok(())
74+
}
75+
}
76+
77+
#[cfg(test)]
78+
mod test {
79+
use tokio;
80+
81+
use super::*;
82+
use crate::{ApiKey, WorkOs};
83+
use matches::assert_matches;
84+
85+
#[tokio::test]
86+
async fn it_calls_the_delete_user_endpoint() {
87+
let mut server = mockito::Server::new_async().await;
88+
89+
let workos = WorkOs::builder(&ApiKey::from("sk_example_123456789"))
90+
.base_url(&server.url())
91+
.unwrap()
92+
.build();
93+
94+
server
95+
.mock(
96+
"DELETE",
97+
"/user_management/users/user_01F3GZ5ZGZBZVQGZVHJFVXZJGZ",
98+
)
99+
.match_header("Authorization", "Bearer sk_example_123456789")
100+
.with_status(202)
101+
.create_async()
102+
.await;
103+
104+
let result = workos
105+
.user_management()
106+
.delete_user(&DeleteUserParams {
107+
user_id: &UserId::from("user_01F3GZ5ZGZBZVQGZVHJFVXZJGZ"),
108+
})
109+
.await;
110+
111+
assert_matches!(result, Ok(()));
112+
}
113+
}

src/user_management/operations/enroll_auth_factor.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::{ResponseExt, WorkOsError, WorkOsResult};
1111
#[derive(Debug, Serialize)]
1212
pub struct EnrollAuthFactorParams<'a> {
1313
/// The unique ID of the user to enroll the auth factor.
14-
#[serde(skip)]
15-
pub id: &'a UserId,
14+
#[serde(skip_serializing)]
15+
pub user_id: &'a UserId,
1616

1717
/// The type of the factor to enroll.
1818
#[serde(flatten)]
@@ -119,7 +119,7 @@ pub trait EnrollAuthFactor {
119119
/// let response = workos
120120
/// .user_management()
121121
/// .enroll_auth_factor(&EnrollAuthFactorParams {
122-
/// id: &UserId::from("user_01FVYZ5QM8N98T9ME5BCB2BBMJ"),
122+
/// user_id: &UserId::from("user_01FVYZ5QM8N98T9ME5BCB2BBMJ"),
123123
/// r#type: &EnrollAuthFactorType::Totp {
124124
/// issuer: Some("Foo Corp"),
125125
/// user: Some("alan.turing@example.com"),
@@ -144,7 +144,7 @@ impl EnrollAuthFactor for UserManagement<'_> {
144144
) -> WorkOsResult<EnrollAuthFactorResponse, EnrollAuthFactorError> {
145145
let url = self.workos.base_url().join(&format!(
146146
"/user_management/users/{}/auth_factors",
147-
params.id
147+
params.user_id
148148
))?;
149149

150150
let response = self
@@ -222,7 +222,7 @@ mod test {
222222
let response = workos
223223
.user_management()
224224
.enroll_auth_factor(&EnrollAuthFactorParams {
225-
id: &UserId::from("user_01FVYZ5QM8N98T9ME5BCB2BBMJ"),
225+
user_id: &UserId::from("user_01FVYZ5QM8N98T9ME5BCB2BBMJ"),
226226
r#type: &EnrollAuthFactorType::Totp {
227227
issuer: Some("Foo Corp"),
228228
user: Some("alan.turing@example.com"),

src/user_management/operations/update_user.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ impl UpdateUser for UserManagement<'_> {
9898
let url = self
9999
.workos
100100
.base_url()
101-
.join(&format!("/user_management/{id}", id = params.user_id))?;
101+
.join(&format!("/user_management/users/{id}", id = params.user_id))?;
102102
let user = self
103103
.workos
104104
.client()
@@ -137,7 +137,10 @@ mod test {
137137
.build();
138138

139139
server
140-
.mock("PUT", "/user_management/user_01E4ZCR3C56J083X43JQXF3JK5")
140+
.mock(
141+
"PUT",
142+
"/user_management/users/user_01E4ZCR3C56J083X43JQXF3JK5",
143+
)
141144
.match_header("Authorization", "Bearer sk_example_123456789")
142145
.with_status(200)
143146
.with_body(

0 commit comments

Comments
 (0)