use crate::error::Error;
use crate::generated::types::{CollectionPayload, UpdateCollectionRequestContent};
use crate::http::Method;
use crate::services::write_info;
pub use crate::generated::services::collections::*;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct CreateCollectionParams {
pub name: String,
pub summary: Option<String>,
pub account_id: Option<i64>,
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct UpdateCollectionParams {
pub name: Option<String>,
pub summary: Option<String>,
}
impl Collections<'_> {
pub async fn create(&self, params: &CreateCollectionParams) -> Result<(), Error> {
let account = params.account_id.map(|account_id| account_id.to_string());
let mut fields = vec![("collection[name]", params.name.as_str())];
if let Some(summary) = params.summary.as_deref().filter(|it| !it.is_empty()) {
fields.push(("collection[summary]", summary));
}
if let Some(account) = &account {
fields.push(("account_id", account.as_str()));
}
let mut operation = self.client().form(Method::POST, "/collections")?;
operation.info(write_info(
"Collections",
"CreateCollection",
"collection",
None,
));
operation.form(&fields);
self.client().send_unit(operation).await
}
pub async fn update_collection(
&self,
collection_id: i64,
params: &UpdateCollectionParams,
) -> Result<(), Error> {
let body = UpdateCollectionRequestContent {
collection: CollectionPayload {
name: present(params.name.as_deref()),
summary: present(params.summary.as_deref()),
},
};
self.update(collection_id, &body).await
}
pub async fn add_topic(&self, topic_id: i64, collection_id: i64) -> Result<(), Error> {
let mut operation = self
.client()
.form(Method::POST, &format!("/topics/{topic_id}/collecting"))?;
operation.info(write_info(
"Collections",
"CreateTopicCollecting",
"collecting",
Some(topic_id),
));
operation.query("collection_id", collection_id).form(&[]);
self.client().send_unit(operation).await
}
pub async fn remove_topic(&self, topic_id: i64, collection_id: i64) -> Result<(), Error> {
let mut operation = self
.client()
.form(Method::DELETE, &format!("/topics/{topic_id}/collecting"))?;
operation.info(write_info(
"Collections",
"DeleteTopicCollecting",
"collecting",
Some(topic_id),
));
operation.query("collection_id", collection_id);
self.client().send_unit(operation).await
}
}
fn present(value: Option<&str>) -> Option<String> {
value.filter(|value| !value.is_empty()).map(str::to_string)
}