use serde_json::json;
use crate::{
model::breezemoon::BreezemoonContent,
utils::{ResponseResult, error::Error, get, post},
};
pub struct BreezeMoon {
api_key: String,
}
impl BreezeMoon {
pub fn new(api_key: String) -> Self {
Self { api_key }
}
pub async fn list(
&self,
page: u32,
size: u32,
user: Option<&str>,
) -> Result<Vec<BreezemoonContent>, Error> {
let base = if let Some(user) = user {
format!("user/{}/", user)
} else {
"".to_string()
};
let url = format!(
"api/{}breezemoons?p={}&size={}&apiKey={}",
base, page, size, self.api_key
);
let rsp = get(&url).await?;
if rsp.get("code").and_then(|c| c.as_i64()).unwrap_or(-1) != 0 {
return Err(Error::Api(
rsp["msg"].as_str().unwrap_or("API error").to_string(),
));
}
let data = rsp.get("data").unwrap_or(&rsp);
let breezemoons = data["breezemoons"]
.as_array()
.ok_or_else(|| Error::Api("breezemoons is not an array".to_string()))?
.iter()
.map(BreezemoonContent::from_value)
.collect::<Result<Vec<_>, _>>()?;
Ok(breezemoons)
}
pub async fn send(&self, content: &str) -> Result<ResponseResult, Error> {
let url = "breezemoon".to_string();
let data_json = json!({
"apiKey": self.api_key,
"breezemoonContent": content,
});
let rsp = post(&url, Some(data_json)).await?;
ResponseResult::from_value(&rsp)
}
}