use serde::{Serialize, Deserialize};
use serde_json::{json, Value};
use crate::{session::SessionStore, request::{RequestType}, WechatCommonResponse, LabradorResult, WechatCpTpClient};
use crate::wechat::cp::constants::{PROVIDER_ACCESS_TOKEN};
use crate::wechat::cp::method::{CpLicenseMethod, WechatCpMethod};
#[derive(Debug, Clone)]
pub struct WechatCpTpLicense<'a, T: SessionStore> {
client: &'a WechatCpTpClient<T>,
}
#[allow(unused)]
impl<'a, T: SessionStore> WechatCpTpLicense<'a, T> {
#[inline]
pub fn new(client: &WechatCpTpClient<T>) -> WechatCpTpLicense<T> {
WechatCpTpLicense {
client,
}
}
pub async fn create_order(&self, req: WechatCpTpLicenseNewOrderRequest) -> LabradorResult<String> {
let access_token = self.client.get_wechat_provider_token().await?;
let query = vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)];
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::CreateOrder), query, req, RequestType::Json).await?.json::<Value>()?;
let v = WechatCommonResponse::parse::<Value>(v)?;
let order_id = v["order_id"].as_str().unwrap_or_default();
Ok(order_id.to_string())
}
pub async fn create_renew_order_job(&self, req: WechatCpTpLicenseRenewOrderJobRequest) -> LabradorResult<WechatCpTpLicenseRenewOrderJobResponse> {
let access_token = self.client.get_wechat_provider_token().await?;
let query = vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)];
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::CreateRenewOrderJob), query, req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseRenewOrderJobResponse>(v)
}
pub async fn submit_renew_order(&self, req: WechatCpTpLicenseRenewOrderRequest) -> LabradorResult<String> {
let access_token = self.client.get_wechat_provider_token().await?;
let query = vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)];
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::SubmitOrderJob), query, req, RequestType::Json).await?.json::<Value>()?;
let v = WechatCommonResponse::parse::<Value>(v)?;
let order_id = v["order_id"].as_str().unwrap_or_default();
Ok(order_id.to_string())
}
pub async fn get_order_list(&self, corp_id: &str, start: Option<i64>, end: Option<i64>, cursor: &str, limit: i32) -> LabradorResult<WechatCpTpLicenseOrderListResp> {
let mut req = json!({
"corpid": corp_id,
"cursor": cursor,
"limit": limit,
});
if let Some(start) = start {
req["start_time"] = start.into();
}
if let Some(end) = end {
req["end_time"] = end.into();
}
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::ListOrder), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseOrderListResp>(v)
}
pub async fn get_order(&self, order_id: &str) -> LabradorResult<WechatCpTpLicenseOrderInfoResponse> {
let mut req = json!({
"order_id": order_id,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::GetOrder), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseOrderInfoResponse>(v)
}
pub async fn get_order_account_list(&self, order_id: &str, limit: i32, cursor: &str) -> LabradorResult<WechatCpTpLicenseOrderAccountListResponse> {
let mut req = json!({
"order_id": order_id,
"cursor": cursor,
"limit": limit,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::ListOrderAccount), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseOrderAccountListResponse>(v)
}
pub async fn cancel_order(&self, corp_id: &str, order_id: &str) -> LabradorResult<WechatCommonResponse> {
let mut req = json!({
"corpid": corp_id,
"order_id": order_id,
});
let access_token = self.client.get_wechat_provider_token().await?;
self.client.post(WechatCpMethod::License(CpLicenseMethod::CancelOrder), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn active_code(&self, code: &str, corp_id: &str, user_id: &str) -> LabradorResult<WechatCommonResponse> {
let mut req = json!({
"active_code": code,
"corpid": corp_id,
"userid": user_id,
});
let access_token = self.client.get_wechat_provider_token().await?;
self.client.post(WechatCpMethod::License(CpLicenseMethod::ActiveAccount), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn batch_active_code(&self, corp_id: &str, active_accounts: Vec<WechatCpTpLicenseActiveAccount>) -> LabradorResult<WechatCpTpLicenseOrderAccountListResponse> {
let mut req = json!({
"corp_id": corp_id,
"active_list": active_accounts,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::BatchActiveAccount), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseOrderAccountListResponse>(v)
}
pub async fn get_active_info_by_code(&self, code: &str, corp_id: &str) -> LabradorResult<WechatCpTpLicenseCodeInfoResponse> {
let mut req = json!({
"active_code": code,
"corpid": corp_id,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::GetActiveInfoByCode), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseCodeInfoResponse>(v)
}
pub async fn batch_get_active_info_by_code(&self, codes: Vec<&str>, corp_id: &str) -> LabradorResult<WechatCpTpLicenseBatchCodeInfoResponse> {
let mut req = json!({
"active_code_list": codes,
"corpid": corp_id,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::BatchGetActiveInfoByCode), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseBatchCodeInfoResponse>(v)
}
pub async fn get_corp_account_list(&self, corp_id: &str, limit: i32, cursor: &str) -> LabradorResult<WechatCpTpLicenseCorpAccountListResponse> {
let mut req = json!({
"cursor": cursor,
"corpid": corp_id,
"limit": limit,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::ListActivedAccount), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseCorpAccountListResponse>(v)
}
pub async fn get_active_info_by_user(&self, corp_id: &str, user_id: &str) -> LabradorResult<WechatCpTpLicenseActiveInfoByUserResponse> {
let mut req = json!({
"corpid": corp_id,
"user_id": user_id,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::GetActiveInfoByUser), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseActiveInfoByUserResponse>(v)
}
pub async fn batch_transfer_license(&self, corp_id: &str, transfers: Vec<WechatCpTpLicenseTransfer>) -> LabradorResult<WechatCpTpLicenseBatchTransferResponse> {
let mut req = json!({
"corpid": corp_id,
"transfer_list": transfers,
});
let access_token = self.client.get_wechat_provider_token().await?;
let v = self.client.post(WechatCpMethod::License(CpLicenseMethod::BatchTransferLicense), vec![(PROVIDER_ACCESS_TOKEN.to_string(), access_token)], req, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpTpLicenseBatchTransferResponse>(v)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseNewOrderRequest {
pub corpid: String,
pub buyer_userid: String,
pub account_count: WechatCpTpLicenseAccountCount,
pub account_duration: WechatCpTpLicenseAccountDuration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseRenewOrderJobRequest {
pub corpid: String,
pub account_list: Vec<WechatCpTpLicenseBaseAccount>,
pub jobid: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseAccountCount {
pub base_count: i32,
pub external_contact_count: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseAccountDuration {
pub months: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseBaseAccount {
pub userid: String,
#[serde(rename="type")]
pub r#type: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseRenewOrderJobResponse {
pub jobid: String,
pub invalid_account_list: Option<Vec<WechatCpTpLicenseBaseAccount>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseRenewOrderRequest {
pub buyer_userid: String,
pub jobid: String,
pub account_duration: WechatCpTpLicenseAccountDuration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseOrderListResp {
pub next_cursor: Option<String>,
pub has_more: Option<i32>,
pub order_list: Option<Vec<WechatCpTpLicenseSimpleOrder>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseSimpleOrder {
pub order_id: Option<String>,
pub order_type: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseOrderInfoResponse {
pub order: Option<WechatCpTpLicenseOrder>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseOrder {
pub order_id: Option<String>,
pub corpid: Option<String>,
pub order_type: Option<i32>,
pub order_status: Option<i32>,
pub price: Option<i32>,
pub create_time: Option<i64>,
pub pay_time: Option<i64>,
pub account_count: Option<WechatCpTpLicenseAccountCount>,
pub account_duration: Option<WechatCpTpLicenseAccountDuration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseOrderAccountListResponse {
pub next_cursor: Option<String>,
pub has_more: Option<i32>,
pub account_list: Option<Vec<WechatCpTpLicenseAccount>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseAccount {
pub active_code: Option<String>,
pub userid: Option<String>,
#[serde(rename="type")]
pub r#type: Option<u8>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseActiveAccount {
pub userid: String,
pub active_code: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseCodeInfoResponse {
pub active_info: Option<WechatCpTpLicenseActiveCodeInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseBatchCodeInfoResponse {
pub active_info_list: Option<Vec<WechatCpTpLicenseActiveCodeInfo>>,
pub invalid_active_code_list: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseActiveCodeInfo {
pub active_code: Option<String>,
pub status: Option<i32>,
pub create_time: Option<i64>,
pub active_time: Option<i64>,
pub expire_time: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseCorpAccountListResponse {
pub next_cursor: Option<String>,
pub has_more: Option<i32>,
pub account_list: Option<Vec<WechatCpTpLicenseCorpAccount>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseCorpAccount {
pub active_time: Option<i64>,
pub expire_time: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseActiveInfoByUserResponse {
pub active_status: Option<i32>,
pub active_info_list: Option<Vec<WechatCpTpLicenseActiveCodeInfo>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseBatchTransferResponse {
pub transfer_result: Option<Vec<WechatCpTpLicenseTransfer>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpTpLicenseTransfer {
pub handover_userid: Option<String>,
pub takeover_userid: Option<String>,
}