bangumi_api/module/person/
service.rs1use anyhow::Result;
2use bytes::Bytes;
3use reqwest::Method;
4
5use crate::{
6 common::model::BangumiClient,
7 module::model::{Paged, SimpleImageType},
8};
9
10use super::model::{PersonCharacter, PersonDetail, PersonSearch, PersonSubject};
11
12impl BangumiClient {
13 pub async fn search_persons(
25 &self,
26 limit: Option<u32>,
27 offset: Option<u32>,
28 payload: Option<PersonSearch>,
29 ) -> Result<Paged<PersonDetail>> {
30 let url = format!("{}/v0/search/persons", self.base_path);
32
33 let mut request_builder = self.request_builder(Method::POST, &url);
35
36 if let Some(ref param_value) = limit {
38 request_builder = request_builder.query(&[("limit", ¶m_value)]);
39 }
40 if let Some(ref param_value) = offset {
41 request_builder = request_builder.query(&[("offset", ¶m_value)]);
42 }
43 request_builder = request_builder.json(&payload);
45
46 let res = self.request_send(request_builder).await?.json().await?;
48
49 Ok(res)
50 }
51
52 pub async fn get_person(&self, person_id: u32) -> Result<PersonDetail> {
62 let url = format!("{}/v0/persons/{person_id}", self.base_path);
64
65 let request_builder = self.request_builder(Method::GET, &url);
67
68 let res = self.request_send(request_builder).await?.json().await?;
70
71 Ok(res)
72 }
73
74 pub async fn get_person_image(&self, person_id: u32, r#type: SimpleImageType) -> Result<Bytes> {
85 let url = format!("{}/v0/persons/{person_id}/image", self.base_path);
87
88 let mut request_builder = self.request_builder(Method::GET, &url);
90 request_builder = request_builder.query(&[("type", &r#type)]);
91
92 let res = self.request_send(request_builder).await?.bytes().await?;
94
95 Ok(res)
96 }
97
98 pub async fn get_person_subjects(&self, person_id: u32) -> Result<Vec<PersonSubject>> {
108 let url = format!("{}/v0/persons/{person_id}/subjects", self.base_path);
110
111 let request_builder = self.request_builder(Method::GET, &url);
113
114 let res = self.request_send(request_builder).await?.json().await?;
116
117 Ok(res)
118 }
119
120 pub async fn get_person_characters(&self, person_id: u32) -> Result<Vec<PersonCharacter>> {
130 let url = format!("{}/v0/persons/{person_id}/characters", self.base_path);
132
133 let request_builder = self.request_builder(Method::GET, &url);
135
136 let res = self.request_send(request_builder).await?.json().await?;
138
139 Ok(res)
140 }
141
142 pub async fn collect_person(&self, person_id: u32) -> Result<()> {
152 let url = format!("{}/v0/persons/{person_id}/collect", self.base_path);
154
155 let request_builder = self.request_builder(Method::POST, &url);
157
158 let _res = self.request_send(request_builder).await?;
160
161 Ok(())
162 }
163
164 pub async fn uncollect_person(&self, person_id: u32) -> Result<()> {
174 let url = format!("{}/v0/persons/{person_id}/collect", self.base_path);
176
177 let request_builder = self.request_builder(Method::DELETE, &url);
179
180 let _res = self.request_send(request_builder).await?;
182
183 Ok(())
184 }
185}