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_id, title)。
34    pub refs: Vec<crate::models::asset::AssetRef>,
35}
36
37impl AssetOpResponse {
38    pub fn ok(message: String) -> Self {
39        Self {
40            success: true,
41            message,
42            refs: Vec::new(),
43        }
44    }
45
46    pub fn err(message: String) -> Self {
47        Self {
48            success: false,
49            message,
50            refs: Vec::new(),
51        }
52    }
53}
54
55/// 一键清理孤儿的结果。
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct PurgeOrphansResponse {
58    pub success: bool,
59    pub message: String,
60    pub deleted_count: i64,
61    pub freed_bytes: i64,
62    /// 删文件失败但 DB 行已删的素材数(文件可能已不存在,属可容忍不一致)。
63    pub failures: i64,
64}
65
66/// 批量删除的结果。
67#[derive(Debug, Clone, Serialize, Deserialize)]
68pub struct BatchDeleteAssetsResponse {
69    pub success: bool,
70    pub message: String,
71    pub deleted_count: i64,
72    /// 因被文章引用而跳过的数量(保护语义与单删一致)。
73    pub skipped_referenced: i64,
74    pub freed_bytes: i64,
75    /// id 非法或删文件失败的数量(DB 行已删/未处理,属可容忍不一致)。
76    pub failures: i64,
77}
78
79/// 重建索引的结果。
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct RebuildAssetsResponse {
82    pub success: bool,
83    pub message: String,
84    /// 磁盘扫描到的图片文件数。
85    pub scanned: i64,
86    /// 新登记进 assets 的数量。
87    pub inserted: i64,
88    /// 已存在并更新技术字段的数量。
89    pub updated: i64,
90    /// 文件已消失而删除的 DB 行数。
91    pub removed: i64,
92    /// 重建后的引用关联总数。
93    pub ref_count: i64,
94}