mz_frontegg_client/client/
user.rs1use reqwest::Method;
14use serde::{Deserialize, Serialize};
15
16use crate::client::Client;
17use crate::client::role::Role;
18use crate::error::Error;
19use crate::parse::{Empty, Paginated};
20
21const USERS_PATH: [&str; 5] = ["frontegg", "identity", "resources", "users", "v3"];
22const CREATE_USERS_PATH: [&str; 5] = ["frontegg", "identity", "resources", "users", "v2"];
23const REMOVE_USERS_PATH: [&str; 5] = ["frontegg", "identity", "resources", "users", "v1"];
24
25#[derive(Serialize)]
27#[serde(rename_all = "camelCase")]
28pub struct CreateUserRequest {
29 pub email: String,
31 pub name: String,
33 pub provider: String,
36 pub role_ids: Vec<uuid::Uuid>,
38}
39
40#[derive(Serialize)]
42#[serde(rename_all = "camelCase")]
43pub struct RemoveUserRequest {
44 pub user_id: String,
46}
47
48#[derive(Debug, Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct User {
52 pub id: String,
54 pub name: String,
56 pub email: String,
58 pub sub: String,
60}
61
62#[derive(Debug, Serialize, Deserialize)]
64#[serde(rename_all = "camelCase")]
65pub struct CreatedUser {
66 pub id: String,
68 pub email: String,
70 pub name: String,
72 pub profile_picture_url: String,
74 pub verified: Option<bool>,
76 pub metadata: Option<String>,
78 pub roles: Vec<Role>,
80}
81
82impl Client {
83 pub async fn list_users(&self) -> Result<Vec<User>, Error> {
85 let mut users = vec![];
86 let mut page = 0;
87
88 loop {
89 let req = self.build_request(Method::GET, USERS_PATH);
90 let req = req.query(&[("_limit", "50"), ("_offset", &*page.to_string())]);
91 let res: Paginated<User> = self.send_request(req).await?;
92 for user in res.items {
93 users.push(user);
94 }
95 page += 1;
96 if page >= res.metadata.total_pages {
97 break;
98 }
99 }
100 Ok(users)
101 }
102
103 pub async fn create_user(&self, new_user: CreateUserRequest) -> Result<CreatedUser, Error> {
105 let req = self.build_request(Method::POST, CREATE_USERS_PATH);
106 let req = req.json(&new_user);
107 let created_user = self.send_request(req).await?;
108 Ok(created_user)
109 }
110
111 pub async fn remove_user(&self, remove_user: RemoveUserRequest) -> Result<(), Error> {
113 let mut user_path = REMOVE_USERS_PATH.to_vec();
114 user_path.push(remove_user.user_id.as_str());
115
116 let req = self.build_request(Method::DELETE, user_path);
117
118 let req = req.json(&remove_user);
119 self.send_request::<Empty>(req).await?;
120
121 Ok(())
122 }
123}