Skip to main content

yggdrasil/api/assets/
types.rs

1//! 素材管理 API 的请求与响应数据结构。
2
3use serde::{Deserialize, Serialize};
4
5use crate::models::asset::AssetDto;
6
7/// 素材分页列表响应。
8///
9/// 附带各筛选维度的计数(tabs 展示)与可清理孤儿的统计(清理按钮展示),
10/// 避免前端为徽标数字额外发请求。
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct AssetListResponse {
13    pub assets: Vec<AssetDto>,
14    /// 当前筛选条件下的总数(分页用)。
15    pub total: i64,
16    /// 全部被引用素材数(「引用中」tab)。
17    pub used_count: i64,
18    /// 全部无引用素材数(「孤儿」tab,含 7 天保护窗内的)。
19    pub orphan_count: i64,
20    /// 可一键清理的孤儿数(无引用且 created_at 早于 7 天前)。
21    pub purgeable_count: i64,
22    /// 可清理孤儿的总字节数。
23    pub purgeable_bytes: i64,
24}
25
26/// 通用素材操作响应(删除/清理/重建共用)。
27///
28/// 业务拒绝(如引用中禁删)走 `Ok(success:false)`,遵循仓库约定不走 Err。
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct AssetOpResponse {
31    pub success: bool,
32    pub message: String,
33    /// 删除被拦截时的文章引用列表(仅 Post 变体;前端以非空判定业务拒绝)。
34    pub refs: Vec<crate::models::asset::AssetRef>,
35}
36
37#[cfg(any(feature = "server", test))]
38impl AssetOpResponse {
39    pub fn ok(message: String) -> Self {
40        Self {
41            success: true,
42            message,
43            refs: Vec::new(),
44        }
45    }
46
47    pub fn err(message: String) -> Self {
48        Self {
49            success: false,
50            message,
51            refs: Vec::new(),
52        }
53    }
54}
55
56/// 一键清理孤儿的结果。
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct PurgeOrphansResponse {
59    pub success: bool,
60    pub message: String,
61    pub deleted_count: i64,
62    pub freed_bytes: i64,
63    /// 删文件失败但 DB 行已删的素材数(文件可能已不存在,属可容忍不一致)。
64    pub failures: i64,
65}
66
67/// 批量删除的结果。
68#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct BatchDeleteAssetsResponse {
70    pub success: bool,
71    pub message: String,
72    pub deleted_count: i64,
73    /// 因被文章引用而跳过的数量(保护语义与单删一致)。
74    pub skipped_referenced: i64,
75    pub freed_bytes: i64,
76    /// id 非法或删文件失败的数量(DB 行已删/未处理,属可容忍不一致)。
77    pub failures: i64,
78}
79
80/// 重建索引的结果。
81#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct RebuildAssetsResponse {
83    pub success: bool,
84    pub message: String,
85    /// 磁盘扫描到的图片文件数。
86    pub scanned: i64,
87    /// 新登记进 assets 的数量。
88    pub inserted: i64,
89    /// 已存在并更新技术字段的数量。
90    pub updated: i64,
91    /// 文件已消失而删除的 DB 行数。
92    pub removed: i64,
93    /// 重建后的引用关联总数。
94    pub ref_count: i64,
95    /// 磁盘存在但尺寸读取失败、未纳入重建的文件数(不删其 DB 行)。
96    pub skipped: i64,
97}