Skip to main content

yggdrasil/api/assets/
mod.rs

1//! 素材管理 API 模块。
2//!
3//! 管理 `uploads/` 图片的注册表(assets 表)与引用关系(asset_refs 表):
4//! 分页列表、删除保护、孤儿清理、全量重建索引。
5//! 全部为 Leptos server function,仅 admin 可用。
6// 与 posts / comments 模块一致:Leptos `#[server]` 宏触发 deprecated/unit 提示,按项目惯例放行。
7#![allow(clippy::unused_unit, deprecated, unused_imports)]
8
9/// 素材引用判定 SQL 片段(表别名固定为 `a`,即 assets)。
10///
11/// 五类引用都是外键引用表:文章(`asset_refs`)、笔记(`note_asset_refs`)、
12/// 评论(`comment_asset_refs`,含回收站评论)、用户头像与友链头像。
13#[cfg(feature = "server")]
14pub(crate) const ASSET_REF_CLAUSE: &str =
15    "(EXISTS (SELECT 1 FROM asset_refs r WHERE r.asset_id = a.id) \
16     OR EXISTS (SELECT 1 FROM note_asset_refs r WHERE r.asset_id = a.id) \
17     OR EXISTS (SELECT 1 FROM comment_asset_refs r WHERE r.asset_id = a.id) \
18     OR EXISTS (SELECT 1 FROM user_avatar_asset_refs r WHERE r.asset_id = a.id) \
19     OR EXISTS (SELECT 1 FROM friend_avatar_asset_refs r WHERE r.asset_id = a.id))";
20
21/// 评论引用判定(含回收站评论),供单删接口返回更具体的业务提示。
22#[cfg(feature = "server")]
23pub(crate) const COMMENT_REF_CLAUSE: &str =
24    "EXISTS (SELECT 1 FROM comment_asset_refs r WHERE r.asset_id = a.id)";
25
26/// 用户头像与友链头像引用判定,供单删接口区分评论引用。
27#[cfg(feature = "server")]
28pub(crate) const AVATAR_REF_CLAUSE: &str =
29    "(EXISTS (SELECT 1 FROM user_avatar_asset_refs r WHERE r.asset_id = a.id) \
30     OR EXISTS (SELECT 1 FROM friend_avatar_asset_refs r WHERE r.asset_id = a.id))";
31
32/// 素材删除与孤儿清理。
33pub mod delete;
34/// 素材分页列表。
35pub mod list;
36/// 素材索引全量重建。
37pub mod rebuild;
38/// 评论与头像的素材引用登记(写入时锁定并核对素材)。
39#[cfg(feature = "server")]
40pub(crate) mod refs;
41/// 请求与响应数据结构。
42pub mod types;
43
44pub use delete::{batch_delete_assets, delete_asset, purge_orphan_assets, update_asset_alt};
45pub use list::list_assets;
46pub use rebuild::rebuild_assets_index;
47pub use types::{
48    AssetListResponse, AssetOpResponse, BatchDeleteAssetsResponse, PurgeOrphansResponse,
49    RebuildAssetsResponse,
50};