use serde::{Serialize, Deserialize};
use serde_json::{json, Value};
use crate::{session::SessionStore, request::{RequestType}, WechatCommonResponse, WechatMpClient, LabradorResult};
use crate::wechat::mp::method::{MpSubscribeMessageMethod, WechatMpMethod};
#[derive(Debug, Clone)]
pub struct WechatMpSubscribeMessage<'a, T: SessionStore> {
client: &'a WechatMpClient<T>,
}
#[allow(unused)]
impl<'a, T: SessionStore> WechatMpSubscribeMessage<'a, T> {
#[inline]
pub fn new(client: &WechatMpClient<T>) -> WechatMpSubscribeMessage<T> {
WechatMpSubscribeMessage {
client,
}
}
pub async fn subscribe_message_authorization_url(&self, redirect_uri: &str, scene: i32, reserved: &str) -> String {
format!("{}?action=get_confirm&appid={}&scene={}&template_id={}&redirect_url={}&reserved={}#wechat_redirect", MpSubscribeMessageMethod::SubscribeAuthorizeUrl.get_method(),
self.client.appid, scene, self.client.template_id.to_owned().unwrap_or_default(), urlencoding::encode(redirect_uri), reserved)
}
pub async fn send_subscribe_message_once(&self, msg: &MpSendSubscribeOnceRequest) -> LabradorResult<WechatCommonResponse> {
self.client.post(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::SubscribeMessageOnce), vec![], msg, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn get_pub_template_title_list(&self, ids: Vec<&str>, start: i32, limit: i32) -> LabradorResult<WechatMpPubTemplateTitleListResponse> {
let ids = ids.join(",").to_string();
let start = start.to_string();
let limit = limit.to_string();
let params = vec![( "ids".to_string(), ids),
("start".to_string(), start),
("limit".to_string(), limit)];
let v = self.client.get(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::GetPubTemplateTitles), params, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatMpPubTemplateTitleListResponse>(v)
}
pub async fn get_pub_template_keywords_byid(&self, ids: &str) -> LabradorResult<Vec<WechatMpPubTemplateKeywordResponse>> {
let v = self.client.get(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::GetPubTemplateKeywords), vec![( "tid".to_string(), ids.to_string())], RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse_with_key::<Vec<WechatMpPubTemplateKeywordResponse>>(v, "data")
}
pub async fn add_template(&self, id: &str, keywords: Vec<i32>, scene_desc: &str) -> LabradorResult<String> {
let req = json!({
"tid": id,
"kidList": keywords,
"sceneDesc": scene_desc,
});
let v = self.client.post(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::AddTemplate), vec![], req, RequestType::Json).await?.json::<Value>()?;
let resp= WechatCommonResponse::parse::<Value>(v)?;
let pri_tmpl_id = resp["priTmplId"].as_str().to_owned().unwrap_or_default().to_string();
Ok(pri_tmpl_id)
}
pub async fn get_template_list(&self) -> LabradorResult<Vec<WechatMpTemplateInfoResponse>> {
let v = self.client.get(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::GetTemplate), vec![], RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse_with_key::<Vec<WechatMpTemplateInfoResponse>>(v, "data")
}
pub async fn delete_template(&self, template_id: &str) -> LabradorResult<bool> {
let _ = self.client.post(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::DeleteTemplate), vec![], json!({ "priTmplId": template_id }), RequestType::Json).await?.json::<WechatCommonResponse>()?;
Ok(true)
}
pub async fn get_category(&self, template_id: &str) -> LabradorResult<Vec<WechatMpCategoryDataResponse>> {
let v = self.client.get(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::GetCategory), vec![], RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse_with_key::<Vec<WechatMpCategoryDataResponse>>(v, "data")
}
pub async fn send_subscribe_message(&self, msg: &MpSendSubscribeMessageRequest) -> LabradorResult<WechatCommonResponse> {
self.client.post(WechatMpMethod::SubscribeMessage(MpSubscribeMessageMethod::SendSubscribeMessage), vec![], msg, RequestType::Json).await?.json::<WechatCommonResponse>()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MpSendSubscribeOnceRequest {
pub touser: String,
pub template_id: String,
pub url: Option<String>,
pub miniprogram : Option<MiniprogramMsg>,
pub data: Value,
pub scene: Option<String>,
pub title: Option<String>,
}
#[derive(Debug, Clone,Serialize, Deserialize)]
pub struct MiniprogramMsg {
app_id: String,
pagepath: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatMpPubTemplateKeywordResponse {
pub kid: Option<i32>,
pub name: Option<String>,
pub example: Option<String>,
pub rule: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatMpPubTemplateTitleListResponse {
pub count: Option<i32>,
pub data: Option<Vec<WechatMpTemplateItem>>,
}
#[allow(non_snake_case)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatMpTemplateItem {
#[serde(rename = "type")]
pub r#type: Option<i32>,
pub tid: Option<i32>,
pub categoryId: Option<String>,
pub title: Option<String>,
}
#[allow(non_snake_case)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatMpTemplateInfoResponse {
pub priTmplId: Option<String>,
pub title: Option<String>,
pub content: Option<String>,
pub example: Option<String>,
#[serde(rename = "type")]
pub r#type: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatMpCategoryDataResponse {
pub id: Option<i32>,
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MpSendSubscribeMessageRequest {
pub touser: String,
pub template_id: String,
pub url: Option<String>,
pub miniprogram : Option<MiniprogramMsg>,
pub scene: Option<String>,
pub data: Value,
}