use serde::{Serialize, Deserialize};
use serde_json::{json, Value};
use crate::{session::SessionStore, request::{RequestType}, WechatCommonResponse, LabradorResult, WechatCpClient, ExternalContact, FollowedUser, WechatCpUserInfo};
use crate::wechat::cp::method::{CpUserMethod, WechatCpMethod};
#[derive(Debug, Clone)]
pub struct WechatCpUser<'a, T: SessionStore> {
client: &'a WechatCpClient<T>,
}
#[allow(unused)]
impl<'a, T: SessionStore> WechatCpUser<'a, T> {
#[inline]
pub fn new(client: &WechatCpClient<T>) -> WechatCpUser<T> {
WechatCpUser {
client,
}
}
pub async fn authenticate(&self, user_id: &str) -> LabradorResult<WechatCommonResponse> {
self.client.get(WechatCpMethod::User(CpUserMethod::AuthSuccess(user_id.to_string())), vec![], RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn list_by_department(&self, depart_id: i64, fetch_child: Option<bool>, status: Option<i32>) -> LabradorResult<Vec<WechatCpUserInfo>> {
let mut query = vec![];
if let Some(fetch_child) = fetch_child {
query.push(("fetch_child".to_string(), fetch_child.to_string()));
}
if let Some(status) = status {
query.push(("status".to_string(), status.to_string()));
} else {
query.push(("status".to_string(), "0".to_string()));
}
let v = self.client.get(WechatCpMethod::User(CpUserMethod::List(depart_id)), query, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<Vec<WechatCpUserInfo>>(v)
}
pub async fn list_simple_by_department(&self, depart_id: i64, fetch_child: Option<bool>, status: Option<i32>) -> LabradorResult<Vec<WechatCpUserInfo>> {
let mut query = vec![];
if let Some(fetch_child) = fetch_child {
query.push(("fetch_child".to_string(), fetch_child.to_string()));
}
if let Some(status) = status {
query.push(("status".to_string(), status.to_string()));
} else {
query.push(("status".to_string(), "0".to_string()));
}
let v = self.client.get(WechatCpMethod::User(CpUserMethod::SimpleList(depart_id)), query, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<Vec<WechatCpUserInfo>>(v)
}
pub async fn create(&self, req: WechatCpUserInfo) -> LabradorResult<WechatCommonResponse> {
self.client.post(WechatCpMethod::User(CpUserMethod::Create), vec![], req, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn update(&self, req: WechatCpUserInfo) -> LabradorResult<WechatCommonResponse> {
self.client.post(WechatCpMethod::User(CpUserMethod::Update), vec![], req, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn delete(&self, user_ids: Vec<&str>) -> LabradorResult<WechatCommonResponse> {
if user_ids.len() == 1 {
self.client.get(WechatCpMethod::User(CpUserMethod::Delete(user_ids[0].to_string())), vec![], RequestType::Json).await?.json::<WechatCommonResponse>()
} else {
self.client.post(WechatCpMethod::User(CpUserMethod::BatchDelete), vec![], json!({"useridlist": user_ids}), RequestType::Json).await?.json::<WechatCommonResponse>()
}
}
pub async fn get_by_id(&self, userid: &str, corp_id: &str) -> LabradorResult<WechatCpUserInfo> {
let v = self.client.get(WechatCpMethod::User(CpUserMethod::Get(userid.to_string())), vec![],RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpUserInfo>(v)
}
pub async fn invite(&self, userids: Vec<&str>, party_ids: Vec<&str>, tag_ids: Vec<&str>) -> LabradorResult<WxCpInviteResponse> {
let req = json!({
"user": userids,
"party": party_ids,
"tag": tag_ids,
});
let v = self.client.post(WechatCpMethod::User(CpUserMethod::Invite), vec![],req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WxCpInviteResponse>(v)
}
pub async fn userid_2_openid(&self, userid: &str, agent_id: i32) -> LabradorResult<WxCpUseridToOpenidResponse> {
let req = json!({
"userid": userid,
"agentid": agent_id,
});
let v = self.client.post(WechatCpMethod::User(CpUserMethod::ConvertToOpenid), vec![],req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WxCpUseridToOpenidResponse>(v)
}
pub async fn openid_2_userid(&self, openid: &str) -> LabradorResult<String> {
let req = json!({
"openid": openid,
});
let v = self.client.post(WechatCpMethod::User(CpUserMethod::ConvertToUserid), vec![],req, RequestType::Json).await?.json::<Value>()?;
let v= WechatCommonResponse::parse::<Value>(v)?;
let userid = v["userid"].as_str().unwrap_or_default();
Ok(userid.to_string())
}
pub async fn get_userid(&self, mobile: &str) -> LabradorResult<String> {
let req = json!({
"mobile": mobile,
});
let v = self.client.post(WechatCpMethod::User(CpUserMethod::GetUserid), vec![],req, RequestType::Json).await?.json::<Value>()?;
let v= WechatCommonResponse::parse::<Value>(v)?;
let userid = v["userid"].as_str().unwrap_or_default();
Ok(userid.to_string())
}
pub async fn get_external_contact(&self, userid: &str) -> LabradorResult<WechatCpUserExternalContactInfo> {
let v = self.client.get(WechatCpMethod::User(CpUserMethod::GetExternalContact(userid.to_string())), vec![],RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpUserExternalContactInfo>(v)
}
pub async fn get_join_qrcode(&self, size_type: i32) -> LabradorResult<String> {
let v = self.client.get(WechatCpMethod::User(CpUserMethod::GetJoinQrcode(size_type)), vec![],RequestType::Json).await?.json::<Value>()?;
let v = WechatCommonResponse::parse::<Value>(v)?;
let qrcode = v["join_qrcode"].as_str().unwrap_or_default();
Ok(qrcode.to_string())
}
pub async fn get_active_count(&self, date: &str) -> LabradorResult<u64> {
let v = self.client.post(WechatCpMethod::User(CpUserMethod::GetActiveStat), vec![], json!({"date": date}),RequestType::Json).await?.json::<Value>()?;
let active_cnt = v["active_cnt"].as_u64().unwrap_or_default();
Ok(active_cnt)
}
}
#[derive(Debug, Clone,Serialize, Deserialize)]
pub struct WxCpInviteResponse {
pub invaliduser: Option<Vec<String>>,
pub invalidparty: Option<Vec<String>>,
pub invalidtag: Option<Vec<String>>,
}
#[derive(Debug, Clone,Serialize, Deserialize)]
pub struct WxCpUseridToOpenidResponse {
pub openid: Option<String>,
pub appid: Option<String>,
}
#[derive(Debug, Clone,Serialize, Deserialize)]
pub struct WechatCpUserExternalContactInfo {
pub external_contact: Option<ExternalContact>,
pub follow_user: Option<FollowedUser>,
}