1use crate::{error::GiteeError, GiteeClient};
2use reqwest::Method;
3use serde_json::Value;
4
5mod models;
6pub use models::*;
7
8impl GiteeClient {
9 pub async fn get_authenticated_user(&self) -> Result<User, GiteeError> {
11 let url = format!("{}/user", self.base_url());
12 let response = self
13 .client()
14 .request(Method::GET, &url)
15 .header("Authorization", self.auth_header())
16 .send()
17 .await?;
18
19 if !response.status().is_success() {
20 return Err(GiteeError::ApiError(format!(
21 "Failed to get authenticated user info: {}",
22 response.status()
23 )));
24 }
25
26 let user: User = response.json().await?;
27 Ok(user)
28 }
29
30 pub async fn get_user_info(&self, username: &str) -> Result<User, GiteeError> {
32 let url = format!("{}/users/{}", self.base_url(), username);
33 let response = self
34 .client()
35 .request(Method::GET, &url)
36 .header("Authorization", self.auth_header())
37 .send()
38 .await?;
39
40 if !response.status().is_success() {
41 return Err(GiteeError::ApiError(format!(
42 "Failed to get user info: {}",
43 response.status()
44 )));
45 }
46
47 let user: User = response.json().await?;
48 Ok(user)
49 }
50
51 pub async fn search_users(&self, query: &str) -> Result<Vec<SearchUserResult>, GiteeError> {
53 let url = format!("{}/search/users", self.base_url());
54 let params = [("q", query), ("per_page", "30")];
55
56 let response = self
57 .client()
58 .request(Method::GET, &url)
59 .header("Authorization", self.auth_header())
60 .query(¶ms)
61 .send()
62 .await?;
63
64 if !response.status().is_success() {
65 return Err(GiteeError::ApiError(format!(
66 "Failed to search users: {}",
67 response.status()
68 )));
69 }
70
71 let body = response.text().await?;
72 let v: Value = serde_json::from_str(&body)?;
73
74 if let Some(items) = v.get("items") {
75 let users: Vec<SearchUserResult> = serde_json::from_value(items.clone())?;
76 Ok(users)
77 } else if v.is_array() {
78 let users: Vec<SearchUserResult> = serde_json::from_value(v.clone())?;
79 Ok(users)
80 } else {
81 Ok(vec![])
82 }
83 }
84}