use super::{post_send, DateRange, ListRes, TimestampRange};
use crate::{wechat::WxApiRequestBuilder, SdkResult};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct VisitRetain {
pub ref_date: String,
pub visit_uv_new: Vec<KeyValue>,
pub visit_uv: Vec<KeyValue>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct KeyValue {
pub key: i64,
pub value: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DailySummary {
pub ref_date: String,
pub visit_total: i64,
pub share_pv: i64,
pub share_uv: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct DailyVisitTrend {
pub ref_date: String,
pub session_cnt: i64,
pub visit_pv: i64,
pub visit_uv: i64,
pub visit_uv_new: f64,
pub stay_time_uv: f64,
pub stay_time_session: f64,
pub visit_depth: f64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VisitTrend {
pub ref_date: String,
pub session_cnt: i64,
pub visit_pv: i64,
pub visit_uv: i64,
pub visit_uv_new: f64,
pub stay_time_uv: f64,
pub stay_time_session: f64,
pub visit_depth: f64,
}
pub mod performance_data {
use super::TimestampRange;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct Query {
pub time: TimestampRange,
pub module: String,
pub params: Vec<Param>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Param {
pub field: String,
pub value: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Result {
pub body: Data,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Data {
pub body: Body,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Body {
pub tables: Vec<Table>,
pub count: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Table {
pub id: String,
pub lines: Vec<Line>,
pub zh: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Line {
pub fields: Vec<Field>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Field {
pub refdate: String,
pub value: String,
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserPortraitResult {
pub ref_date: String,
pub visit_uv_new: UserPortrait,
pub visit_uv: UserPortrait,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserPortrait {
pub index: i64,
pub province: Vec<NameValue>,
pub city: Vec<NameValue>,
pub genders: Vec<NameValue>,
pub platforms: Vec<NameValue>,
pub devices: Vec<NameValue>,
pub ages: Vec<NameValue>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct NameValue {
pub id: i64,
pub name: String,
pub value: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VisitDistribution {
pub ref_date: String,
pub list: Vec<VisitDistributionItem>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VisitDistributionItem {
pub index: String,
pub item_list: Vec<KeyValue>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VisitPage {
pub ref_date: String,
pub list: Vec<VisitPageItem>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct VisitPageItem {
pub page_path: String,
pub page_visit_pv: i64,
pub page_visit_uv: i64,
pub page_staytime_pv: i64,
pub entrypage_pv: i64,
pub exitpage_pv: i64,
pub page_share_pv: i64,
pub page_share_uv: i64,
}
pub struct DataCubeModule<'a, T: WxApiRequestBuilder>(pub(crate) &'a T);
impl<'a, T: WxApiRequestBuilder> DataCubeModule<'a, T> {
pub async fn get_daily_retain(&self, query: &DateRange) -> SdkResult<VisitRetain> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappiddailyretaininfo";
post_send(self.0, url, query).await
}
pub async fn get_monthly_retain(&self, query: &DateRange) -> SdkResult<VisitRetain> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyretaininfo";
post_send(self.0, url, query).await
}
pub async fn get_weekly_retain(&self, query: &DateRange) -> SdkResult<VisitRetain> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappidweeklyretaininfo";
post_send(self.0, url, query).await
}
pub async fn get_daily_summary(&self, query: &DateRange) -> SdkResult<ListRes<DailySummary>> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappiddailysummarytrend";
post_send(self.0, url, query).await
}
pub async fn get_daily_visit_trend(
&self,
query: &DateRange,
) -> SdkResult<ListRes<DailyVisitTrend>> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappiddailyvisittrend";
post_send(self.0, url, query).await
}
pub async fn get_monthly_visit_trend(&self, query: &DateRange) -> SdkResult<VisitTrend> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappidmonthlyvisittrend";
post_send(self.0, url, query).await
}
pub async fn get_weekly_visit_trend(&self, query: &DateRange) -> SdkResult<VisitTrend> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappidweeklyvisittrend";
post_send(self.0, url, query).await
}
pub async fn get_performance_data(
&self,
query: &performance_data::Query,
) -> SdkResult<performance_data::Result> {
let url = "https://api.weixin.qq.com/wxa/business/performance/boot";
post_send(self.0, url, query).await
}
pub async fn get_user_portrait(&self, query: &DateRange) -> SdkResult<UserPortraitResult> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappiduserportrait";
post_send(self.0, url, query).await
}
pub async fn get_visit_distribution(&self, query: &DateRange) -> SdkResult<VisitDistribution> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitdistribution";
post_send(self.0, url, query).await
}
pub async fn get_visit_page(&self, query: &DateRange) -> SdkResult<VisitPage> {
let url = "https://api.weixin.qq.com/datacube/getweanalysisappidvisitpage";
post_send(self.0, url, query).await
}
}