1use crate::BilibiliRequest;
6use crate::article::ArticleClient;
7use crate::article::params::{ArticleCoinParams, ArticleFavoriteParams, ArticleLikeParams};
8use crate::response::BpiResult;
9
10const LIKE_ENDPOINT: &str = "https://api.bilibili.com/x/article/like";
11const COIN_ENDPOINT: &str = "https://api.bilibili.com/x/web-interface/coin/add";
12const FAVORITE_ADD_ENDPOINT: &str = "https://api.bilibili.com/x/article/favorites/add";
13const FAVORITE_DEL_ENDPOINT: &str = "https://api.bilibili.com/x/article/favorites/del";
14
15#[derive(Debug, Clone, serde::Deserialize)]
18pub struct CoinResponseData {
19 pub like: bool,
21}
22
23impl<'a> ArticleClient<'a> {
24 pub async fn like(&self, params: ArticleLikeParams) -> BpiResult<Option<serde_json::Value>> {
26 let csrf = self.client.csrf()?;
27
28 self.client
29 .post(LIKE_ENDPOINT)
30 .form(¶ms.form_pairs(&csrf))
31 .send_bpi_optional_payload("article.like")
32 .await
33 }
34
35 pub async fn coin(&self, params: ArticleCoinParams) -> BpiResult<CoinResponseData> {
37 let csrf = self.client.csrf()?;
38
39 self.client
40 .post(COIN_ENDPOINT)
41 .form(¶ms.form_pairs(&csrf))
42 .send_bpi_payload("article.coin")
43 .await
44 }
45
46 pub async fn favorite(
48 &self,
49 params: ArticleFavoriteParams,
50 ) -> BpiResult<Option<serde_json::Value>> {
51 let csrf = self.client.csrf()?;
52
53 self.client
54 .post(FAVORITE_ADD_ENDPOINT)
55 .form(¶ms.form_pairs(&csrf))
56 .send_bpi_optional_payload("article.favorite")
57 .await
58 }
59
60 pub async fn unfavorite(
62 &self,
63 params: ArticleFavoriteParams,
64 ) -> BpiResult<Option<serde_json::Value>> {
65 let csrf = self.client.csrf()?;
66
67 self.client
68 .post(FAVORITE_DEL_ENDPOINT)
69 .form(¶ms.form_pairs(&csrf))
70 .send_bpi_optional_payload("article.unfavorite")
71 .await
72 }
73}
74
75#[cfg(test)]
76mod tests {}