bangumi_api/module/collection/
service.rs1use anyhow::Result;
2use reqwest::Method;
3
4use crate::{
5 common::model::BangumiClient,
6 module::{episode::model::EpisodeType, model::Paged, subject::model::SubjectType},
7};
8
9use super::model::{
10 CollectionCharacter, CollectionEpisode, CollectionEpisodeUpdate, CollectionEpisodesUpdate,
11 CollectionPerson, CollectionSubject, CollectionSubjectUpdate, CollectionType,
12};
13
14impl BangumiClient {
15 pub async fn get_collection_subjects(
29 &self,
30 username: &str,
31 subject_type: Option<SubjectType>,
32 r#type: Option<CollectionType>,
33 limit: Option<u32>,
34 offset: Option<u32>,
35 ) -> Result<Paged<CollectionSubject>> {
36 let url = format!("{}/v0/users/{username}/collections", self.base_path);
38
39 let mut request_builder = self.request_builder(Method::GET, &url);
40
41 if let Some(ref param_value) = subject_type {
43 request_builder = request_builder.query(&[("subject_type", ¶m_value)]);
44 }
45 if let Some(ref param_value) = r#type {
47 request_builder = request_builder.query(&[("type", ¶m_value)]);
48 }
49 if let Some(ref param_value) = limit {
51 request_builder = request_builder.query(&[("limit", ¶m_value)]);
52 }
53 if let Some(ref param_value) = offset {
55 request_builder = request_builder.query(&[("offset", ¶m_value)]);
56 }
57
58 let res = self.request_send(request_builder).await?.json().await?;
60
61 Ok(res)
62 }
63
64 pub async fn get_collection_subject(
75 &self,
76 username: &str,
77 subject_id: u32,
78 ) -> Result<CollectionSubject> {
79 let url = format!(
81 "{}/v0/users/{username}/collections/{subject_id}",
82 self.base_path
83 );
84
85 let request_builder = self.request_builder(Method::GET, &url);
86
87 let res = self.request_send(request_builder).await?.json().await?;
89
90 Ok(res)
91 }
92
93 pub async fn post_collection_subject(
104 &self,
105 subject_id: u32,
106 payload: Option<CollectionSubjectUpdate>,
107 ) -> Result<()> {
108 let url = format!("{}/v0/users/-/collections/{subject_id}", self.base_path);
110
111 let mut request_builder = self.request_builder(Method::POST, &url);
112 request_builder = request_builder.json(&payload);
114
115 let _res = self.request_send(request_builder).await?;
117
118 Ok(())
119 }
120
121 pub async fn patch_collection_subject(
132 &self,
133 subject_id: u32,
134 payload: Option<CollectionSubjectUpdate>,
135 ) -> Result<()> {
136 let url = format!("{}/v0/users/-/collections/{subject_id}", self.base_path);
138
139 let mut request_builder = self.request_builder(Method::PATCH, &url);
140 request_builder = request_builder.json(&payload);
142
143 let _res = self.request_send(request_builder).await?;
145
146 Ok(())
147 }
148
149 pub async fn get_collection_episodes(
162 &self,
163 subject_id: u32,
164 offset: Option<u32>,
165 limit: Option<u32>,
166 episode_type: Option<EpisodeType>,
167 ) -> Result<Paged<CollectionEpisode>> {
168 let url = format!(
170 "{}/v0/users/-/collections/{subject_id}/episodes",
171 self.base_path
172 );
173
174 let mut request_builder = self.request_builder(Method::GET, &url);
175
176 if let Some(ref param_value) = offset {
178 request_builder = request_builder.query(&[("offset", ¶m_value)]);
179 }
180 if let Some(ref param_value) = limit {
181 request_builder = request_builder.query(&[("limit", ¶m_value)]);
182 }
183 if let Some(ref param_value) = episode_type {
185 request_builder = request_builder.query(&[("episode_type", ¶m_value)]);
186 }
187
188 let res = self.request_send(request_builder).await?.json().await?;
190
191 Ok(res)
192 }
193
194 pub async fn patch_collection_episodes(
205 &self,
206 subject_id: u32,
207 payload: Option<CollectionEpisodesUpdate>,
208 ) -> Result<()> {
209 let url = format!(
211 "{}/v0/users/-/collections/{subject_id}/episodes",
212 self.base_path
213 );
214
215 let mut request_builder = self.request_builder(Method::PATCH, &url);
216 request_builder = request_builder.json(&payload);
218
219 let _res = self.request_send(request_builder).await?;
221
222 Ok(())
223 }
224
225 pub async fn get_collection_episode(&self, episode_id: u32) -> Result<CollectionEpisode> {
235 let url = format!(
237 "{}/v0/users/-/collections/-/episodes/{episode_id}",
238 self.base_path
239 );
240
241 let request_builder = self.request_builder(Method::GET, &url);
242
243 let res = self.request_send(request_builder).await?.json().await?;
245
246 Ok(res)
247 }
248
249 pub async fn put_collection_episode(
260 &self,
261 episode_id: u32,
262 payload: Option<CollectionEpisodeUpdate>,
263 ) -> Result<()> {
264 let url = format!(
266 "{}/v0/users/-/collections/-/episodes/{episode_id}",
267 self.base_path
268 );
269
270 let mut request_builder = self.request_builder(Method::PUT, &url);
271 request_builder = request_builder.json(&payload);
273
274 let _res = self.request_send(request_builder).await?;
276
277 Ok(())
278 }
279
280 pub async fn get_collection_characters(
290 &self,
291 username: &str,
292 ) -> Result<Paged<CollectionCharacter>> {
293 let url = format!(
295 "{}/v0/users/{username}/collections/-/characters",
296 self.base_path
297 );
298
299 let request_builder = self.request_builder(Method::GET, &url);
300
301 let res = self.request_send(request_builder).await?.json().await?;
303
304 Ok(res)
305 }
306
307 pub async fn get_collection_character(
318 &self,
319 username: &str,
320 character_id: u32,
321 ) -> Result<CollectionCharacter> {
322 let url = format!(
324 "{}/v0/users/{username}/collections/-/characters/{character_id}",
325 self.base_path
326 );
327
328 let request_builder = self.request_builder(Method::GET, &url);
329
330 let res = self.request_send(request_builder).await?.json().await?;
332
333 Ok(res)
334 }
335
336 pub async fn get_collection_persons(&self, username: &str) -> Result<Paged<CollectionPerson>> {
346 let url = format!(
348 "{}/v0/users/{username}/collections/-/persons",
349 self.base_path
350 );
351
352 let request_builder = self.request_builder(Method::GET, &url);
353
354 let res = self.request_send(request_builder).await?.json().await?;
356
357 Ok(res)
358 }
359
360 pub async fn get_collection_person(
371 &self,
372 username: &str,
373 person_id: u32,
374 ) -> Result<CollectionPerson> {
375 let url = format!(
377 "{}/v0/users/{username}/collections/-/persons/{person_id}",
378 self.base_path
379 );
380
381 let request_builder = self.request_builder(Method::GET, &url);
382
383 let res = self.request_send(request_builder).await?.json().await?;
385
386 Ok(res)
387 }
388}