Skip to main content

yggdrasil/api/posts/
types.rs

1//! 文章 API 的请求与响应数据结构。
2
3use crate::models::post::{Post, PostListItem, PostStats, Tag};
4
5/// 创建/更新/删除文章的统一响应结构。
6#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
7pub struct CreatePostResponse {
8    /// 操作是否成功。
9    pub success: bool,
10    /// 提示信息。
11    pub message: String,
12    /// 新文章 id,失败时为 None。
13    pub post_id: Option<i32>,
14    /// 最终 slug,失败时为 None。
15    pub slug: Option<String>,
16}
17
18/// 这些构造器只在 server function body 内调用,WASM 端因 cfg gate 剥离了调用点,
19/// 故对非 server 构建允许 dead_code。
20#[cfg_attr(not(feature = "server"), allow(dead_code))]
21impl CreatePostResponse {
22    /// 构造失败响应(post_id / slug 均为 None)。
23    pub fn err(message: impl Into<String>) -> Self {
24        Self {
25            success: false,
26            message: message.into(),
27            post_id: None,
28            slug: None,
29        }
30    }
31
32    /// 构造成功响应,携带新文章 id 与 slug。
33    pub fn ok(message: impl Into<String>, post_id: i32, slug: impl Into<String>) -> Self {
34        Self {
35            success: true,
36            message: message.into(),
37            post_id: Some(post_id),
38            slug: Some(slug.into()),
39        }
40    }
41
42    /// 构造成功响应(无关联 id/slug,用于批量操作)。
43    pub fn ok_msg(message: impl Into<String>) -> Self {
44        Self {
45            success: true,
46            message: message.into(),
47            post_id: None,
48            slug: None,
49        }
50    }
51}
52
53/// 文章列表响应。
54#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
55pub struct PostListResponse {
56    /// 文章列表(轻量 DTO,不含正文)。
57    pub posts: Vec<PostListItem>,
58    /// 符合查询条件的总数。
59    pub total: i64,
60}
61
62/// 标签列表响应。
63#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
64pub struct TagListResponse {
65    /// 标签列表。
66    pub tags: Vec<Tag>,
67}
68
69/// 文章统计响应。
70#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
71pub struct PostStatsResponse {
72    /// 文章统计信息。
73    pub stats: PostStats,
74}
75
76/// 单篇文章详情响应。
77#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
78pub struct SinglePostResponse {
79    /// 文章详情,不存在时为 None。
80    pub post: Option<Post>,
81}
82
83/// Markdown 重建结果响应。
84#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
85pub struct RebuildResult {
86    /// 成功重建的文章数量。
87    pub rebuilt: u64,
88    /// 重建失败的文章数量。
89    pub failed: u64,
90    /// 失败信息摘要(最多 5 条)。
91    pub errors: Vec<String>,
92}