use serde_json::{Value, json};
use crate::{
model::article::CommentPost,
utils::{ResponseResult, error::Error, post, put},
};
pub struct Comment {
api_key: String,
}
impl Comment {
pub fn new(api_key: String) -> Self {
Self { api_key }
}
pub async fn send(&self, data: &CommentPost) -> Result<ResponseResult, Error> {
let url = "comment".to_string();
let mut data_json = data.to_value()?;
data_json["apiKey"] = Value::String(self.api_key.clone());
let rsp = post(&url, Some(data_json)).await?;
ResponseResult::from_value(&rsp)
}
pub async fn update(&self, id: &str, data: &CommentPost) -> Result<String, Error> {
let url = format!("comment/{}", id);
let mut data_json = data.to_value()?;
data_json["apiKey"] = Value::String(self.api_key.clone());
let rsp = put(&url, Some(data_json)).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(),
));
}
Ok(rsp["commentContent"].as_str().unwrap_or("").to_string())
}
pub async fn vote(&self, id: &str, like: bool) -> Result<bool, Error> {
let action = if like { "up" } else { "down" };
let url = format!("vote/{}/comment", action);
let data_json = json!({
"dataId": id,
"apiKey": self.api_key,
});
let rsp = post(&url, Some(data_json)).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(),
));
}
Ok(rsp["type"].as_i64().unwrap_or(-1) == 0)
}
pub async fn thank(&self, id: &str) -> Result<ResponseResult, Error> {
let url = "comment/thank".to_string();
let data_json = json!({
"apiKey": self.api_key,
"commentId": id,
});
let rsp = post(&url, Some(data_json)).await?;
ResponseResult::from_value(&rsp)
}
pub async fn remove(&self, id: &str) -> Result<String, Error> {
let url = format!("comment/{}/remove", id);
let data_json = json!({
"apiKey": self.api_key,
});
let rsp = post(&url, Some(data_json)).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(),
));
}
Ok(rsp["commentId"].as_str().unwrap_or("").to_string())
}
}