use crate::SdkResult;
use crate::{error::CommonResponse, wechat::WxApiRequestBuilder};
use serde::{Deserialize, Serialize};
use super::material::Articles;
#[derive(Serialize, Deserialize)]
pub struct MediaId {
pub media_id: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct UploadResponse {
#[serde(rename = "type")]
pub type_: String,
pub media_id: String,
pub created_at: i32,
}
pub struct Part {
pub name: String,
pub filename: String,
pub content_type: String,
pub data: Vec<u8>,
}
#[derive(Serialize, Deserialize)]
pub struct PicUrl {
pub url: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct MediaRes {
#[serde(rename = "type")]
pub type_: String,
#[serde(alias = "thumb_media_id")]
pub media_id: String,
pub created_at: i64,
}
pub struct MediaModule<'a, T: WxApiRequestBuilder>(pub(crate) &'a T);
impl<'a, T: WxApiRequestBuilder> MediaModule<'a, T> {
pub async fn uploadvideo<S: AsRef<str>>(
&self,
media_id: S,
title: Option<String>,
description: Option<String>,
) -> SdkResult<UploadResponse> {
let base_url = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo";
let sdk = self.0;
let builder = sdk.wx_post(base_url).await?;
let res: CommonResponse<UploadResponse> = builder
.json(&serde_json::json!({
"media_id": media_id.as_ref().to_string(),
"title": title,
"description": description,
}))
.send()
.await?
.json()
.await?;
res.into()
}
pub async fn uploadimg(&self, form: Part) -> SdkResult<PicUrl> {
let base_url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg";
let sdk = self.0;
let part = reqwest::multipart::Part::bytes(form.data)
.file_name(form.filename)
.mime_str(form.content_type.as_ref());
let form = reqwest::multipart::Form::new().part(form.name, part.unwrap());
let builder = sdk.wx_post(base_url).await?;
let res: CommonResponse<PicUrl> = builder.multipart(form).send().await?.json().await?;
res.into()
}
pub async fn upload(&self, media_type: &str, media: &[i8]) -> SdkResult<MediaRes> {
let base_url = "https://api.weixin.qq.com/cgi-bin/media/upload";
let sdk = self.0;
let builder = sdk.wx_post(base_url).await?;
let builder = builder.query(&[("type", media_type)]);
let res: CommonResponse<MediaRes> = builder.form(media).send().await?.json().await?;
res.into()
}
pub async fn get<S: AsRef<str>>(&self, media_id: S) -> SdkResult<reqwest::Response> {
let base_url = "https://api.weixin.qq.com/cgi-bin/media/get";
let sdk = self.0;
let builder = sdk.wx_get(base_url).await?;
let builder = builder.query(&[("media_id", media_id.as_ref())]);
Ok(builder.send().await?)
}
pub async fn uploadnews(&self, articles: &[Articles]) -> SdkResult<MediaRes> {
let base_url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews";
let sdk = self.0;
let builder = sdk.wx_post(base_url).await?;
let res: CommonResponse<MediaRes> = builder
.json(&serde_json::json!({ "articles": articles }))
.send()
.await?
.json()
.await?;
res.into()
}
}