use super::{get_send, post_send};
use crate::{wechat::WxApiRequestBuilder, SdkResult};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct Action {
#[serde(default)]
pub action: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DomainInfo {
pub requestdomain: Vec<String>,
pub wsrequestdomain: Vec<String>,
pub uploaddomain: Vec<String>,
pub downloaddomain: Vec<String>,
pub udpdomain: Vec<String>,
pub bizdomain: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct QueryFeedback {
#[serde(default)]
#[serde(rename = "type")]
pub type_: Option<i32>,
pub page: i32,
pub num: i32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct FeedbackList {
pub list: Vec<Feedback>,
pub total_num: i32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Feedback {
pub record_id: i64,
pub create_time: i64,
pub content: String,
pub phone: i64,
pub openid: String,
pub nickname: String,
pub head_url: String,
#[serde(rename = "type")]
pub type_: i32,
#[serde(rename = "mediaIds")]
pub media_ids: Vec<String>,
#[serde(rename = "systemInfo")]
pub system_info: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct GrayReleasePlanRes {
pub gray_release_plan: GrayReleasePlan,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct GrayReleasePlan {
pub status: i32,
pub gray_percentage: f64,
pub create_timestamp: i64,
pub default_finish_timestamp: i64,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QueryJsErrDetail {
pub start_time: String,
pub end_time: String,
pub error_msg_md5: String,
pub error_stack_md5: String,
pub app_version: String,
pub sdk_version: String,
pub os_name: String,
pub client_version: String,
pub openid: String,
pub desc: String,
pub offset: i32,
pub limit: i32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DataList<T> {
pub openid: String,
pub data: Vec<T>,
#[serde(rename = "totalCount")]
pub total_count: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JsErrDetail {
#[serde(rename = "Count")]
pub count: String,
#[serde(rename = "sdkVersion")]
pub sdk_version: String,
#[serde(rename = "ClientVersion")]
pub client_version: String,
#[serde(rename = "errorStackMd5")]
pub error_stack_md5: String,
#[serde(rename = "TimeStamp")]
pub time_stamp: String,
#[serde(rename = "appVersion")]
pub app_version: String,
#[serde(rename = "errorMsgMd5")]
pub error_msg_md5: String,
#[serde(rename = "errorMsg")]
pub error_msg: String,
#[serde(rename = "errorStack")]
pub error_stack: String,
#[serde(rename = "Ds")]
pub ds: String,
#[serde(rename = "OsName")]
pub os_name: String,
#[serde(rename = "openId")]
pub open_id: String,
pub pluginversion: String,
#[serde(rename = "appId")]
pub app_id: String,
#[serde(rename = "DeviceModel")]
pub device_model: String,
pub source: String,
pub route: String,
#[serde(rename = "Uin")]
pub uin: String,
pub nickname: String,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QueryJsErrList {
pub app_version: String,
pub err_type: String,
pub start_time: String,
pub end_time: String,
pub keyword: String,
pub openid: String,
pub orderby: String,
pub desc: String,
pub offset: i32,
pub limit: i32,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct JsErr {
pub error_msg_md5: String,
pub error_msg: String,
pub uv: i64,
pub pv: i64,
pub error_stack_md5: String,
pub error_stack: String,
pub pv_percent: String,
pub uv_percent: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct QueryJsErrSearch {
pub errmsg_keyword: String,
#[serde(rename = "type")]
pub type_: i32,
pub client_version: String,
pub start_time: i64,
pub end_time: i64,
pub start: i32,
pub limit: i32,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JsErrSearchRes {
pub results: Vec<JsErrSearch>,
pub total: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct JsErrSearch {
pub time: i64,
pub client_version: String,
pub app_version: String,
pub version_error_cnt: i64,
pub total_error_cnt: i64,
pub errmsg: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct QueryPerformance {
pub cost_time_type: i32,
pub default_start_time: i64,
pub default_end_time: i64,
pub device: String,
pub is_download_code: String,
pub scene: String,
pub networktype: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Performance {
pub default_time_data: String,
pub compare_time_data: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SceneList {
pub scene: Vec<NameValue>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct NameValue {
pub name: String,
pub value: StrI32,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum StrI32 {
String(String),
I32(i32),
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VersionList {
pub cvlist: Vec<CvList>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct CvList {
#[serde(rename = "type")]
pub type_: i32,
pub client_version_list: Vec<String>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QueryRealtimelog {
pub date: String,
pub begintime: i64,
pub endtime: i64,
#[serde(default)]
pub start: Option<i32>,
#[serde(default)]
pub limit: Option<i32>,
#[serde(default)]
pub trace_id: Option<String>,
#[serde(default)]
pub url: Option<String>,
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub filter_msg: Option<String>,
#[serde(default)]
pub level: Option<i32>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Realtimelog {
pub data: RealtimelogList,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RealtimelogList {
pub list: Vec<RealtimelogItem>,
pub total: i32,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RealtimelogItem {
pub level: i32,
pub library_version: String,
pub client_version: String,
pub id: String,
pub timestamp: i64,
pub platform: i32,
pub url: String,
pub msg: Vec<RealtimelogMsg>,
pub traceid: String,
pub filter_msg: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct RealtimelogMsg {
pub time: i64,
pub msg: Vec<String>,
pub level: i32,
}
pub struct OperationModule<'a, T: WxApiRequestBuilder>(pub(crate) &'a T);
impl<'a, T: WxApiRequestBuilder> OperationModule<'a, T> {
pub async fn get_domain_info(&self, query: &Action) -> SdkResult<DomainInfo> {
let url = "https://api.weixin.qq.com/wxa/getwxadevinfo";
get_send(self.0, url, query).await
}
pub async fn get_feedback(&self, query: &QueryFeedback) -> SdkResult<FeedbackList> {
let url = "https://api.weixin.qq.com/wxaapi/feedback/list";
get_send(self.0, url, query).await
}
pub async fn get_feedbackmedia(&self, record_id: &str, media_id: &str) -> SdkResult<Vec<u8>> {
let url = "https://api.weixin.qq.com/cgi-bin/media/getfeedbackmedia";
let query = &[("media_id", media_id), ("record_id", record_id)];
let builder = self.0.wx_get(url).await?.query(query);
let bytes = builder.send().await?.bytes().await?;
Ok(bytes.to_vec())
}
pub async fn get_gray_release_plan(&self) -> SdkResult<GrayReleasePlanRes> {
let url = "https://api.weixin.qq.com/wxa/getgrayreleaseplan";
get_send(self.0, url, &()).await
}
pub async fn get_js_err_detail(
&self,
data: &QueryJsErrDetail,
) -> SdkResult<DataList<JsErrDetail>> {
let url = "https://api.weixin.qq.com/wxaapi/log/jserr_detail";
post_send(self.0, url, data).await
}
pub async fn get_js_err_list(&self, data: &QueryJsErrList) -> SdkResult<DataList<JsErr>> {
let url = "https://api.weixin.qq.com/wxaapi/log/jserr_list";
post_send(self.0, url, data).await
}
pub async fn get_js_err_search(&self, data: &QueryJsErrSearch) -> SdkResult<JsErrSearchRes> {
let url = "https://api.weixin.qq.com/wxaapi/log/jserr_search";
post_send(self.0, url, data).await
}
pub async fn get_performance(&self, data: &QueryPerformance) -> SdkResult<Performance> {
let url = "https://api.weixin.qq.com/wxaapi/log/get_performance";
post_send(self.0, url, data).await
}
pub async fn get_scene_list(&self) -> SdkResult<SceneList> {
let url = "https://api.weixin.qq.com/wxaapi/log/get_scene";
get_send(self.0, url, &()).await
}
pub async fn get_version_list(&self) -> SdkResult<VersionList> {
let url = "https://api.weixin.qq.com/wxaapi/log/get_client_version";
get_send(self.0, url, &()).await
}
pub async fn realtimelog_search(&self, query: &QueryRealtimelog) -> SdkResult<Realtimelog> {
let url = "https://api.weixin.qq.com/wxaapi/userlog/userlog_search";
get_send(self.0, url, query).await
}
}