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

Commit 0598988

Browse files
feat(user-management): add get user by external id (#58)
1 parent a9d58f5 commit 0598988

2 files changed

Lines changed: 129 additions & 0 deletions

File tree

src/user_management/operations.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ mod get_logout_url;
1717
mod get_magic_auth;
1818
mod get_password_reset;
1919
mod get_user;
20+
mod get_user_by_external_id;
2021
mod get_user_identities;
2122
mod list_auth_factors;
2223
mod list_users;
@@ -42,6 +43,7 @@ pub use get_logout_url::*;
4243
pub use get_magic_auth::*;
4344
pub use get_password_reset::*;
4445
pub use get_user::*;
46+
pub use get_user_by_external_id::*;
4547
pub use get_user_identities::*;
4648
pub use list_auth_factors::*;
4749
pub use list_users::*;
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
use async_trait::async_trait;
2+
use thiserror::Error;
3+
4+
use crate::user_management::{User, UserManagement};
5+
use crate::{ResponseExt, WorkOsError, WorkOsResult};
6+
7+
/// An error returned from [`GetUserByExternalId`].
8+
#[derive(Debug, Error)]
9+
pub enum GetUserByExternalIdError {}
10+
11+
impl From<GetUserByExternalIdError> for WorkOsError<GetUserByExternalIdError> {
12+
fn from(err: GetUserByExternalIdError) -> Self {
13+
Self::Operation(err)
14+
}
15+
}
16+
17+
/// [WorkOS Docs: Get a user by external ID](https://workos.com/docs/reference/user-management/user/get-by-external-id)
18+
#[async_trait]
19+
pub trait GetUserByExternalId {
20+
/// Get the details of an existing user by an external identifier.
21+
///
22+
/// [WorkOS Docs: Get a user by external ID](https://workos.com/docs/reference/user-management/user/get-by-external-id)
23+
///
24+
/// # Examples
25+
///
26+
/// ```
27+
/// # use workos_sdk::WorkOsResult;
28+
/// # use workos_sdk::user_management::*;
29+
/// use workos_sdk::{ApiKey, WorkOs};
30+
///
31+
/// # async fn run() -> WorkOsResult<(), GetUserByExternalIdError> {
32+
/// let workos = WorkOs::new(&ApiKey::from("sk_example_123456789"));
33+
///
34+
/// let user = workos
35+
/// .user_management()
36+
/// .get_user_by_external_id("f1ffa2b2-c20b-4d39-be5c-212726e11222")
37+
/// .await?;
38+
/// # Ok(())
39+
/// # }
40+
/// ```
41+
async fn get_user_by_external_id(
42+
&self,
43+
external_id: &str,
44+
) -> WorkOsResult<User, GetUserByExternalIdError>;
45+
}
46+
47+
#[async_trait]
48+
impl GetUserByExternalId for UserManagement<'_> {
49+
async fn get_user_by_external_id(
50+
&self,
51+
external_id: &str,
52+
) -> WorkOsResult<User, GetUserByExternalIdError> {
53+
let url = self
54+
.workos
55+
.base_url()
56+
.join(&format!("/user_management/users/external_id/{external_id}"))?;
57+
let user = self
58+
.workos
59+
.client()
60+
.get(url)
61+
.bearer_auth(self.workos.key())
62+
.send()
63+
.await?
64+
.handle_unauthorized_or_generic_error()?
65+
.json::<User>()
66+
.await?;
67+
68+
Ok(user)
69+
}
70+
}
71+
72+
#[cfg(test)]
73+
mod test {
74+
use serde_json::json;
75+
use tokio;
76+
77+
use crate::{user_management::UserId, ApiKey, WorkOs};
78+
79+
use super::*;
80+
81+
#[tokio::test]
82+
async fn it_calls_the_get_user_endpoint() {
83+
let mut server = mockito::Server::new_async().await;
84+
85+
let workos = WorkOs::builder(&ApiKey::from("sk_example_123456789"))
86+
.base_url(&server.url())
87+
.unwrap()
88+
.build();
89+
90+
server
91+
.mock(
92+
"GET",
93+
"/user_management/users/external_id/f1ffa2b2-c20b-4d39-be5c-212726e11222",
94+
)
95+
.match_header("Authorization", "Bearer sk_example_123456789")
96+
.with_status(200)
97+
.with_body(
98+
json!({
99+
"object": "user",
100+
"id": "user_01E4ZCR3C56J083X43JQXF3JK5",
101+
"email": "marcelina.davis@example.com",
102+
"first_name": "Marcelina",
103+
"last_name": "Davis",
104+
"email_verified": true,
105+
"profile_picture_url": "https://workoscdn.com/images/v1/123abc",
106+
"last_sign_in_at": "2021-06-25T19:07:33.155Z",
107+
"external_id": "f1ffa2b2-c20b-4d39-be5c-212726e11222",
108+
"metadata": {
109+
"language": "en"
110+
},
111+
"created_at": "2021-06-25T19:07:33.155Z",
112+
"updated_at": "2021-06-25T19:07:33.155Z"
113+
})
114+
.to_string(),
115+
)
116+
.create_async()
117+
.await;
118+
119+
let user = workos
120+
.user_management()
121+
.get_user_by_external_id("f1ffa2b2-c20b-4d39-be5c-212726e11222")
122+
.await
123+
.unwrap();
124+
125+
assert_eq!(user.id, UserId::from("user_01E4ZCR3C56J083X43JQXF3JK5"))
126+
}
127+
}

0 commit comments

Comments
 (0)