Skip to main content

yggdrasil/api/comments/
types.rs

1//! 评论 API 的请求与响应数据结构。
2
3use crate::models::comment::{AdminComment, PublicComment};
4use serde::{Deserialize, Serialize};
5
6/// 创建/审核/删除评论的统一响应结构。
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct CommentResponse {
9    /// 操作是否成功。
10    pub success: bool,
11    /// 提示信息。
12    pub message: String,
13    /// 错误码,成功时为 None。
14    pub error_code: Option<String>,
15    /// 新评论 id。
16    #[serde(default)]
17    pub comment_id: Option<i64>,
18    /// 评论者头像 URL。
19    #[serde(default)]
20    pub avatar_url: Option<String>,
21    /// 评论嵌套深度。
22    #[serde(default)]
23    pub depth: Option<i32>,
24}
25
26/// 这些构造器只在 server function body 内调用,WASM 端因 cfg gate 剥离了调用点,
27/// 故对非 server 构建允许 dead_code。
28#[cfg_attr(not(feature = "server"), allow(dead_code))]
29impl CommentResponse {
30    /// 构造失败响应,携带错误码(comment_id / avatar_url / depth 均为 None)。
31    pub fn error(error_code: &str, message: impl Into<String>) -> Self {
32        Self {
33            success: false,
34            message: message.into(),
35            error_code: Some(error_code.into()),
36            comment_id: None,
37            avatar_url: None,
38            depth: None,
39        }
40    }
41
42    /// 构造成功响应(无关联数据,用于审核/删除等操作)。
43    pub fn ok(message: impl Into<String>) -> Self {
44        Self {
45            success: true,
46            message: message.into(),
47            error_code: None,
48            comment_id: None,
49            avatar_url: None,
50            depth: None,
51        }
52    }
53
54    /// 构造成功响应,携带新评论 id / 头像 / 深度(用于创建评论)。
55    pub fn created(
56        message: impl Into<String>,
57        comment_id: i64,
58        avatar_url: impl Into<String>,
59        depth: i32,
60    ) -> Self {
61        Self {
62            success: true,
63            message: message.into(),
64            error_code: None,
65            comment_id: Some(comment_id),
66            avatar_url: Some(avatar_url.into()),
67            depth: Some(depth),
68        }
69    }
70}
71
72/// 评论树响应:包含文章下的全部已审核评论。
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct CommentTreeResponse {
75    /// 评论列表。
76    pub comments: Vec<PublicComment>,
77    /// 评论总数。
78    pub count: i64,
79}
80
81/// 全部评论列表响应。
82#[derive(Debug, Clone, Serialize, Deserialize)]
83pub struct AllCommentsResponse {
84    /// 评论列表。
85    pub comments: Vec<AdminComment>,
86    /// 当前筛选下的总数(分页用)。
87    pub total: i64,
88    /// 各状态的条数(选项卡数量)。
89    #[serde(default)]
90    pub counts: CommentCounts,
91}
92
93/// 各状态的评论条数;回收站按软删除计。
94#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
95pub struct CommentCounts {
96    pub pending: i64,
97    pub approved: i64,
98    pub spam: i64,
99    pub trash: i64,
100}
101
102/// 批量更新状态响应。
103#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct BatchStatusResponse {
105    /// 操作是否成功。
106    pub success: bool,
107    /// 实际更新的行数。
108    pub updated_count: i64,
109    /// 提示信息。
110    pub message: String,
111}