use log::{debug, info};
use serde::Deserialize;
use std::sync::Arc;
use crate::auth::UserInfo;
use crate::client::TokenGetter;
use crate::errors::{NetDiskError, NetDiskResult};
use crate::http::HttpClient;
#[derive(Debug, Clone)]
pub struct UserClient {
http_client: HttpClient,
token_getter: Arc<dyn TokenGetter>,
}
impl UserClient {
pub fn new(http_client: HttpClient, token_getter: Arc<dyn TokenGetter>) -> Self {
UserClient {
http_client,
token_getter,
}
}
pub fn http_client(&self) -> &HttpClient {
&self.http_client
}
pub async fn get_user_info(&self, vip_version: Option<&str>) -> NetDiskResult<UserInfo> {
let token = self.token_getter.get_token().await?;
let mut params = vec![("method", "uinfo"), ("access_token", &token.access_token)];
if let Some(v) = vip_version {
params.push(("vip_version", v));
}
debug!("Getting user info with params: {:?}", params);
let response: UserInfoResponse = self
.http_client
.get("/rest/2.0/xpan/nas", Some(¶ms))
.await?;
if response.errno != 0 {
return Err(NetDiskError::api_error(response.errno, &response.errmsg));
}
info!("User info retrieved successfully: {}", response.baidu_name);
Ok(UserInfo {
baidu_name: response.baidu_name,
netdisk_name: response.netdisk_name,
avatar_url: response.avatar_url,
vip_type: response.vip_type,
uk: response.uk,
})
}
}
#[derive(Debug, Deserialize)]
struct UserInfoResponse {
baidu_name: String,
netdisk_name: String,
avatar_url: String,
vip_type: i32,
uk: u64,
errno: i32,
errmsg: String,
}