Skip to main content

pickcat_api_collection/
reading_session.rs

1//! 阅读会话章节:阅读埋点上报。
2//!
3//! 参见 <https://pickcat-docs.xiaole6324.fun/reading-session.html>。
4
5use crate::dto::reading_session::{ReadingBatchDTO, ReadingBatchResponseDTO, VisiblePostDTO};
6use crate::{Error, PickcatAccound};
7
8/// 阅读埋点,来自文档的「阅读会话」章节
9/// (<https://pickcat-docs.xiaole6324.fun/reading-session.html>)。
10pub trait ReadingSessionBehavior {
11    /// `PUT /api/v1/reading-sessions/{sessionId}/batches/{batchNo}` —— 需要会话。
12    ///
13    /// `session_id` 由调用方生成;`batch_no` 为批次序号。成功返回 `201`。
14    /// `visible_posts` 至少要有 1 项,否则服务端返回 `400 VALIDATION_FAILED`。
15    fn report_reading_batch(
16        &self,
17        session_id: &str,
18        batch_no: u32,
19        topic_id: &str,
20        elapsed_ms: u64,
21        visible_posts: Vec<VisiblePostDTO>,
22    ) -> impl std::future::Future<Output = Result<ReadingBatchResponseDTO, Error>> + Send;
23}
24
25impl ReadingSessionBehavior for PickcatAccound {
26    async fn report_reading_batch(
27        &self,
28        session_id: &str,
29        batch_no: u32,
30        topic_id: &str,
31        elapsed_ms: u64,
32        visible_posts: Vec<VisiblePostDTO>,
33    ) -> Result<ReadingBatchResponseDTO, Error> {
34        let dto = ReadingBatchDTO {
35            topic_id: topic_id.to_string(),
36            elapsed_ms,
37            visible_posts,
38        };
39        Ok(self
40            .client
41            .put(format!(
42                "{}/api/v1/reading-sessions/{}/batches/{}",
43                self.base_url, session_id, batch_no
44            ))
45            .json(&dto)
46            .send()
47            .await?
48            .json::<ReadingBatchResponseDTO>()
49            .await?)
50    }
51}