Skip to main content

workos/user_management/operations/
get_user_identities.rs

1use async_trait::async_trait;
2use thiserror::Error;
3
4use crate::user_management::{Identity, UserId, UserManagement};
5use crate::{ResponseExt, WorkOsError, WorkOsResult};
6
7/// An error returned from [`GetUserIdentities`].
8#[derive(Debug, Error)]
9pub enum GetUserIdentitiesError {}
10
11impl From<GetUserIdentitiesError> for WorkOsError<GetUserIdentitiesError> {
12    fn from(err: GetUserIdentitiesError) -> Self {
13        Self::Operation(err)
14    }
15}
16
17/// [WorkOS Docs: Get User Identities](https://workos.com/docs/reference/user-management/identity/list)
18#[async_trait]
19pub trait GetUserIdentities {
20    /// Get a list of identities associated with the user.
21    ///
22    /// [WorkOS Docs: Get User Identities](https://workos.com/docs/reference/user-management/identity/list)
23    ///
24    /// # Examples
25    ///
26    /// ```
27    /// # use workos::WorkOsResult;
28    /// # use workos::user_management::*;
29    /// use workos::{ApiKey, WorkOs};
30    ///
31    /// # async fn run() -> WorkOsResult<(), GetUserIdentitiesError> {
32    /// let workos = WorkOs::new(&ApiKey::from("sk_example_123456789"));
33    ///
34    /// let identities = workos
35    ///     .user_management()
36    ///     .get_user_identities(&UserId::from("user_01E4ZCR3C56J083X43JQXF3JK5"))
37    ///     .await?;
38    /// # Ok(())
39    /// # }
40    /// ```
41    async fn get_user_identities(
42        &self,
43        user_id: &UserId,
44    ) -> WorkOsResult<Vec<Identity>, GetUserIdentitiesError>;
45}
46
47#[async_trait]
48impl GetUserIdentities for UserManagement<'_> {
49    async fn get_user_identities(
50        &self,
51        user_id: &UserId,
52    ) -> WorkOsResult<Vec<Identity>, GetUserIdentitiesError> {
53        let url = self
54            .workos
55            .base_url()
56            .join(&format!("/user_management/users/{user_id}/identities"))?;
57
58        let identities = self
59            .workos
60            .client()
61            .get(url)
62            .bearer_auth(self.workos.key())
63            .send()
64            .await?
65            .handle_unauthorized_or_generic_error()
66            .await?
67            .json::<Vec<Identity>>()
68            .await?;
69
70        Ok(identities)
71    }
72}
73
74#[cfg(test)]
75mod test {
76    use serde_json::json;
77    use tokio;
78
79    use crate::user_management::{IdentityId, UserId};
80    use crate::{ApiKey, WorkOs};
81
82    use super::*;
83
84    #[tokio::test]
85    async fn it_calls_the_get_user_identities_endpoint() {
86        let mut server = mockito::Server::new_async().await;
87
88        let workos = WorkOs::builder(&ApiKey::from("sk_example_123456789"))
89            .base_url(&server.url())
90            .unwrap()
91            .build();
92
93        server
94            .mock(
95                "GET",
96                "/user_management/users/user_01E4ZCR3C56J083X43JQXF3JK5/identities",
97            )
98            .match_header("Authorization", "Bearer sk_example_123456789")
99            .with_status(200)
100            .with_body(
101                json!([
102                    {
103                        "idp_id": "4F42ABDE-1E44-4B66-824A-5F733C037A6D",
104                        "type": "OAuth",
105                        "provider": "MicrosoftOAuth"
106                    }
107                ])
108                .to_string(),
109            )
110            .create_async()
111            .await;
112
113        let list = workos
114            .user_management()
115            .get_user_identities(&UserId::from("user_01E4ZCR3C56J083X43JQXF3JK5"))
116            .await
117            .unwrap();
118
119        assert_eq!(
120            list.into_iter().next().map(|identity| identity.idp_id),
121            Some(IdentityId::from("4F42ABDE-1E44-4B66-824A-5F733C037A6D"))
122        )
123    }
124}