use serde::{Serialize, Deserialize};
use serde_json::{Value};
use crate::{session::SessionStore, request::{RequestType}, WechatCommonResponse, LabradorResult, WechatCpTpClient};
use crate::wechat::cp::constants::ACCESS_TOKEN;
use crate::wechat::cp::method::{CpDepartmentMethod, WechatCpMethod};
#[derive(Debug, Clone)]
pub struct WechatCpTpDepartment<'a, T: SessionStore> {
client: &'a WechatCpTpClient<T>,
}
#[allow(unused)]
impl<'a, T: SessionStore> WechatCpTpDepartment<'a, T> {
#[inline]
pub fn new(client: &WechatCpTpClient<T>) -> WechatCpTpDepartment<T> {
WechatCpTpDepartment {
client,
}
}
pub async fn create(&self, req: WechatCpTpDepartInfo) -> LabradorResult<i64> {
let v = self.client.post(WechatCpMethod::Department(CpDepartmentMethod::Create), vec![], req, RequestType::Json).await?.json::<Value>()?;
let v = WechatCommonResponse::parse::<Value>(v)?;
let tag_id = v["id"].as_i64().unwrap_or_default();
Ok(tag_id)
}
pub async fn list_byid(&self, id: Option<i64>, corp_id: &str) -> LabradorResult<WechatCpTpDepartResponse> {
let access_token = self.client.get_access_token(corp_id);
let mut query = vec![(ACCESS_TOKEN.to_string(), access_token)];
if let Some(id) = id {
query.push(("id".to_string(), id.to_string()));
}
let v = self.client.get(WechatCpMethod::Department(CpDepartmentMethod::List), query, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpDepartResponse>(v)
}
pub async fn list(&self, corp_id: &str) -> LabradorResult<WechatCpTpDepartResponse> {
self.list_byid(None, corp_id).await
}
pub async fn update(&self, req: WechatCpTpDepartInfo) -> LabradorResult<WechatCommonResponse> {
self.client.post(WechatCpMethod::Department(CpDepartmentMethod::Update), vec![], req, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn delete(&self, depart_id: i64) -> LabradorResult<WechatCommonResponse> {
self.client.get(WechatCpMethod::Department(CpDepartmentMethod::Delete(depart_id)), vec![], RequestType::Json).await?.json::<WechatCommonResponse>()
}
}
#[derive(Debug, Clone,Serialize, Deserialize)]
pub struct WechatCpTpDepartInfo {
pub id: Option<i32>,
pub name: Option<String>,
pub en_name: Option<String>,
pub parentid: Option<i32>,
pub order: Option<i32>,
}
#[derive(Debug, Clone,Serialize, Deserialize)]
pub struct WechatCpTpDepartResponse {
pub department: Vec<WechatCpTpDepartInfo>,
}