1use crate::internal::path_escape;
4use crate::runtime::{self, Error};
5
6#[derive(Clone, Debug, Default)]
8pub struct UsersListOptions {
9 pub filter_term: Option<String>,
10 pub user_type: Option<crate::models::schemas::GetUserType>,
11 pub external_app_user_id: Option<String>,
12 pub fields: Option<Vec<String>>,
13 pub offset: Option<i64>,
14 pub limit: Option<i64>,
15 pub usemarker: Option<bool>,
16 pub marker: Option<String>,
17}
18
19#[derive(Clone, Debug, Default)]
21pub struct UsersCreateOptions {
22 pub fields: Option<Vec<String>>,
23}
24
25#[derive(Clone, Debug, Default)]
27pub struct UsersGetMeOptions {
28 pub fields: Option<Vec<String>>,
29}
30
31#[derive(Clone, Debug, Default)]
33pub struct UsersGetOptions {
34 pub fields: Option<Vec<String>>,
35}
36
37#[derive(Clone, Debug, Default)]
39pub struct UsersUpdateOptions {
40 pub fields: Option<Vec<String>>,
41}
42
43#[derive(Clone, Debug, Default)]
45pub struct UsersDeleteOptions {
46 pub notify: Option<bool>,
47 pub force: Option<bool>,
48}
49
50pub struct UsersListPaginator {
53 manager: UsersManager,
54 options: UsersListOptions,
55 buffer: std::vec::IntoIter<crate::models::schemas::UserFull>,
56 done: bool,
57}
58
59impl UsersListPaginator {
60 pub async fn next(&mut self) -> Option<Result<crate::models::schemas::UserFull, Error>> {
63 loop {
64 if let Some(item) = self.buffer.next() {
65 return Some(Ok(item));
66 }
67 if self.done {
68 return None;
69 }
70 let page = match self.manager.list_page(Some(self.options.clone())).await {
71 Ok(page) => page,
72 Err(err) => {
73 self.done = true;
74 return Some(Err(err));
75 }
76 };
77 self.buffer = page.entries.unwrap_or_default().into_iter();
78 match page.next_marker.flatten() {
79 Some(cursor) if !cursor.is_empty() => self.options.marker = Some(cursor),
80 _ => self.done = true,
81 }
82 }
83 }
84}
85
86pub struct UsersManager {
88 session: std::sync::Arc<runtime::Client>,
89}
90
91impl UsersManager {
92 pub(crate) fn new(session: std::sync::Arc<runtime::Client>) -> Self {
93 Self { session }
94 }
95
96 async fn list_page(
97 &self,
98 opts: Option<UsersListOptions>,
99 ) -> Result<crate::models::schemas::Users, Error> {
100 let mut url = self.session.base_url("api");
101 url.push_str("/users");
102 let mut req = self.session.new_request("GET", &url);
103 let opts = opts.unwrap_or_default();
104 if let Some(value) = opts.filter_term {
105 req = runtime::with_query(req, "filter_term", &value);
106 }
107 if let Some(value) = opts.user_type {
108 req = runtime::with_query(req, "user_type", &value.0);
109 }
110 if let Some(value) = opts.external_app_user_id {
111 req = runtime::with_query(req, "external_app_user_id", &value);
112 }
113 if let Some(value) = opts.fields {
114 req = runtime::with_query(req, "fields", &value.join(","));
115 }
116 if let Some(value) = opts.offset {
117 req = runtime::with_query(req, "offset", &value.to_string());
118 }
119 if let Some(value) = opts.limit {
120 req = runtime::with_query(req, "limit", &value.to_string());
121 }
122 if let Some(value) = opts.usemarker {
123 req = runtime::with_query(req, "usemarker", &value.to_string());
124 }
125 if let Some(value) = opts.marker {
126 req = runtime::with_query(req, "marker", &value);
127 }
128 let resp = self.session.fetch(req).await?;
129 let data = runtime::response_bytes(&resp)?;
130 Ok(serde_json::from_slice(&data)?)
131 }
132
133 pub fn list(&self, opts: Option<UsersListOptions>) -> UsersListPaginator {
135 UsersListPaginator {
136 manager: UsersManager::new(self.session.clone()),
137 options: opts.unwrap_or_default(),
138 buffer: Vec::new().into_iter(),
139 done: false,
140 }
141 }
142
143 pub async fn create(
144 &self,
145 body: crate::models::schemas::CreateUserRequest,
146 opts: Option<UsersCreateOptions>,
147 ) -> Result<crate::models::schemas::UserFull, Error> {
148 let mut url = self.session.base_url("api");
149 url.push_str("/users");
150 let mut req = self.session.new_request("POST", &url);
151 let opts = opts.unwrap_or_default();
152 if let Some(value) = opts.fields {
153 req = runtime::with_query(req, "fields", &value.join(","));
154 }
155 let payload = serde_json::to_vec(&body)?;
156 req = runtime::with_json_body(req, &payload);
157 let resp = self.session.fetch(req).await?;
158 let data = runtime::response_bytes(&resp)?;
159 Ok(serde_json::from_slice(&data)?)
160 }
161
162 pub async fn get_me(
163 &self,
164 opts: Option<UsersGetMeOptions>,
165 ) -> Result<crate::models::schemas::UserFull, Error> {
166 let mut url = self.session.base_url("api");
167 url.push_str("/users");
168 url.push_str("/me");
169 let mut req = self.session.new_request("GET", &url);
170 let opts = opts.unwrap_or_default();
171 if let Some(value) = opts.fields {
172 req = runtime::with_query(req, "fields", &value.join(","));
173 }
174 let resp = self.session.fetch(req).await?;
175 let data = runtime::response_bytes(&resp)?;
176 Ok(serde_json::from_slice(&data)?)
177 }
178
179 pub async fn get(
180 &self,
181 user_id: String,
182 opts: Option<UsersGetOptions>,
183 ) -> Result<crate::models::schemas::UserFull, Error> {
184 let mut url = self.session.base_url("api");
185 url.push_str("/users");
186 url.push('/');
187 let seg = path_escape(&user_id);
188 url.push_str(&seg);
189 let mut req = self.session.new_request("GET", &url);
190 let opts = opts.unwrap_or_default();
191 if let Some(value) = opts.fields {
192 req = runtime::with_query(req, "fields", &value.join(","));
193 }
194 let resp = self.session.fetch(req).await?;
195 let data = runtime::response_bytes(&resp)?;
196 Ok(serde_json::from_slice(&data)?)
197 }
198
199 pub async fn update(
200 &self,
201 user_id: String,
202 body: crate::models::schemas::UpdateUserRequest,
203 opts: Option<UsersUpdateOptions>,
204 ) -> Result<crate::models::schemas::UserFull, Error> {
205 let mut url = self.session.base_url("api");
206 url.push_str("/users");
207 url.push('/');
208 let seg = path_escape(&user_id);
209 url.push_str(&seg);
210 let mut req = self.session.new_request("PUT", &url);
211 let opts = opts.unwrap_or_default();
212 if let Some(value) = opts.fields {
213 req = runtime::with_query(req, "fields", &value.join(","));
214 }
215 let payload = serde_json::to_vec(&body)?;
216 req = runtime::with_json_body(req, &payload);
217 let resp = self.session.fetch(req).await?;
218 let data = runtime::response_bytes(&resp)?;
219 Ok(serde_json::from_slice(&data)?)
220 }
221
222 pub async fn delete(
223 &self,
224 user_id: String,
225 opts: Option<UsersDeleteOptions>,
226 ) -> Result<(), Error> {
227 let mut url = self.session.base_url("api");
228 url.push_str("/users");
229 url.push('/');
230 let seg = path_escape(&user_id);
231 url.push_str(&seg);
232 let mut req = self.session.new_request("DELETE", &url);
233 let opts = opts.unwrap_or_default();
234 if let Some(value) = opts.notify {
235 req = runtime::with_query(req, "notify", &value.to_string());
236 }
237 if let Some(value) = opts.force {
238 req = runtime::with_query(req, "force", &value.to_string());
239 }
240 let _ = self.session.fetch(req).await?;
241 Ok(())
242 }
243}