use anyhow::Result;
use reqwest::Method;
use crate::{
common::model::BangumiClient,
module::{model::Paged, subject::model::SubjectType},
};
use super::model::{
Index, IndexBasicInfo, IndexSubject, IndexSubjectAddInfo, IndexSubjectEditInfo,
};
impl BangumiClient {
pub async fn add_index(&self) -> Result<Index> {
let url = format!("{}/v0/indices", self.base_path);
let request_builder = self.request_builder(Method::POST, &url);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn get_index(&self, index_id: u32) -> Result<Index> {
let url = format!("{}/v0/indices/{index_id}", self.base_path);
let request_builder = self.request_builder(Method::GET, &url);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn edit_index(
&self,
index_id: u32,
payload: Option<IndexBasicInfo>,
) -> Result<Index> {
let url = format!("{}/v0/indices/{index_id}", self.base_path);
let mut request_builder = self.request_builder(Method::PUT, &url);
request_builder = request_builder.json(&payload);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn get_index_subjects(
&self,
index_id: u32,
r#type: Option<SubjectType>,
limit: Option<u32>,
offset: Option<u32>,
) -> Result<Paged<IndexSubject>> {
let url = format!("{}/v0/indices/{index_id}/subjects", self.base_path);
let mut request_builder = self.request_builder(Method::GET, &url);
if let Some(ref param_value) = r#type {
request_builder = request_builder.query(&[("type", ¶m_value)]);
}
if let Some(ref param_value) = limit {
request_builder = request_builder.query(&[("limit", ¶m_value)]);
}
if let Some(ref param_value) = offset {
request_builder = request_builder.query(&[("offset", ¶m_value)]);
}
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn add_index_subject(
&self,
index_id: u32,
payload: Option<IndexSubjectAddInfo>,
) -> Result<()> {
let url = format!("{}/v0/indices/{index_id}/subjects", self.base_path);
let mut request_builder = self.request_builder(Method::POST, &url);
request_builder = request_builder.json(&payload);
let _res = self.request_send(request_builder).await?;
Ok(())
}
pub async fn edit_index_subject(
&self,
index_id: u32,
subject_id: u32,
payload: Option<IndexSubjectEditInfo>,
) -> Result<()> {
let url = format!(
"{}/v0/indices/{index_id}/subjects/{subject_id}",
self.base_path
);
let mut request_builder = self.request_builder(Method::PUT, &url);
request_builder = request_builder.json(&payload);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn delete_index_subject(&self, index_id: u32, subject_id: u32) -> Result<()> {
let url = format!(
"{}/v0/indices/{index_id}/subjects/{subject_id}",
self.base_path
);
let request_builder = self.request_builder(Method::DELETE, &url);
let res = self.request_send(request_builder).await?.json().await?;
Ok(res)
}
pub async fn collect_index(&self, index_id: u32) -> Result<()> {
let url = format!("{}/v0/indices/{index_id}/collect", self.base_path);
let request_builder = self.request_builder(Method::POST, &url);
let _res = self.request_send(request_builder).await?;
Ok(())
}
pub async fn uncollect_index(&self, index_id: u32) -> Result<()> {
let url = format!("{}/v0/indices/{index_id}/collect", self.base_path);
let request_builder = self.request_builder(Method::DELETE, &url);
let _res = self.request_send(request_builder).await?;
Ok(())
}
}