use crate::client::ZtkClient;
use crate::common::http::{build_params_with_appkey, url_encode};
use crate::error::ZtkResult;
use super::request::{
DouyinActivityConvertRequest, DouyinActivityListRequest, DouyinAuthorListRequest,
DouyinGoodsConvertRequest, DouyinGoodsDetailRequest, DouyinLiveConvertRequest,
DouyinLiveProductListRequest, DouyinOrderQueryRequest, DouyinParseCommandRequest,
DouyinSearchGoodsRequest,
};
use super::response::{
DouyinActivityConvertResponse, DouyinActivityListResponse, DouyinGoodsConvertResponse,
DouyinGoodsDetailResponse, DouyinLiveConvertResponse, DouyinOrderQueryResponse,
DouyinParseCommandResponse, DouyinSearchGoodsResponse,
};
pub struct DouyinApi<'a> {
client: &'a ZtkClient,
}
impl<'a> DouyinApi<'a> {
pub fn new(client: &'a ZtkClient) -> Self {
Self { client }
}
#[allow(dead_code)]
pub(crate) fn client(&self) -> &ZtkClient {
self.client
}
pub async fn convert_goods(
&self,
request: DouyinGoodsConvertRequest,
) -> ZtkResult<DouyinGoodsConvertResponse> {
let mut encoded_request = request.clone();
encoded_request.product_url = url_encode(&request.product_url);
let params = build_params_with_appkey(self.client.appkey(), &encoded_request)?;
self.client
.http_client()
.get("/api/open_douyin_zhuanlian.ashx", ¶ms)
.await
}
pub async fn convert_live(
&self,
request: DouyinLiveConvertRequest,
) -> ZtkResult<DouyinLiveConvertResponse> {
let mut encoded_request = request.clone();
if let Some(ref dy_code) = request.dy_code {
encoded_request.dy_code = Some(url_encode(dy_code));
}
let params = build_params_with_appkey(self.client.appkey(), &encoded_request)?;
self.client
.http_client()
.get("/api/open_douyin_zhuanlian_zhibojian.ashx", ¶ms)
.await
}
pub async fn convert_activity(
&self,
request: DouyinActivityConvertRequest,
) -> ZtkResult<DouyinActivityConvertResponse> {
let params = build_params_with_appkey(self.client.appkey(), &request)?;
self.client
.http_client()
.get("/api/open_douyin_zhuanlian_activity.ashx", ¶ms)
.await
}
pub async fn goods_detail(
&self,
request: DouyinGoodsDetailRequest,
) -> ZtkResult<DouyinGoodsDetailResponse> {
let params = build_params_with_appkey(self.client.appkey(), &request)?;
self.client
.http_client()
.get("/api/open_douyin_product_detail.ashx", ¶ms)
.await
}
pub async fn search_goods(
&self,
request: DouyinSearchGoodsRequest,
) -> ZtkResult<DouyinSearchGoodsResponse> {
let mut encoded_request = request.clone();
if let Some(ref title) = request.title {
encoded_request.title = Some(url_encode(title));
}
let params = build_params_with_appkey(self.client.appkey(), &encoded_request)?;
self.client
.http_client()
.get("/api/open_douyin_product_search.ashx", ¶ms)
.await
}
pub async fn parse_command(
&self,
request: DouyinParseCommandRequest,
) -> ZtkResult<DouyinParseCommandResponse> {
let encoded_command = url_encode(&request.command);
let encoded_request = DouyinParseCommandRequestEncoded {
sid: request.sid,
command: encoded_command,
};
let params = build_params_with_appkey(self.client.appkey(), &encoded_request)?;
self.client
.http_client()
.get("/api/open_douyin_kouling_jiexi.ashx", ¶ms)
.await
}
pub async fn query_orders(
&self,
request: DouyinOrderQueryRequest,
) -> ZtkResult<DouyinOrderQueryResponse> {
let params = build_params_with_appkey(self.client.appkey(), &request)?;
self.client
.http_client()
.get("/api/open_lianmeng_orderList.ashx", ¶ms)
.await
}
pub async fn activity_list(
&self,
request: DouyinActivityListRequest,
) -> ZtkResult<DouyinActivityListResponse> {
let params = build_params_with_appkey(self.client.appkey(), &request)?;
self.client
.http_client()
.get("/api/open_douyin_activity_list.ashx", ¶ms)
.await
}
pub async fn author_list(
&self,
request: DouyinAuthorListRequest,
) -> ZtkResult<DouyinGoodsConvertResponse> {
let params = build_params_with_appkey(self.client.appkey(), &request)?;
self.client
.http_client()
.get("/api/open_douyin_zhibojian_dare_list.ashx", ¶ms)
.await
}
pub async fn live_product_list(
&self,
request: DouyinLiveProductListRequest,
) -> ZtkResult<DouyinGoodsConvertResponse> {
let params = build_params_with_appkey(self.client.appkey(), &request)?;
self.client
.http_client()
.get(
"/api/open_douyin_distributionLive_productlist.ashx",
¶ms,
)
.await
}
}
#[derive(serde::Serialize)]
struct DouyinParseCommandRequestEncoded {
sid: String,
command: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_douyin_api_creation() {
let client = ZtkClient::new("test_appkey").build().unwrap();
let douyin = client.douyin();
assert_eq!(douyin.client().appkey(), "test_appkey");
}
}