Skip to main content

yggdrasil/models/
asset.rs

1//! 素材(图片)模型。
2//!
3//! `assets` 表是 `uploads/` 目录的元数据注册表:磁盘是字节唯一存储,
4//! 本表承载路径、尺寸、alt 等管理性字段。`asset_refs` 记录文章引用关系。
5//! 这些结构体通过 serde 在服务端与客户端之间共享序列化。
6//!
7//! id 以 String 承载(SQL 侧 `id::text` 读出、`$1::uuid` 写入),
8//! 避免把 server-only 的 uuid crate 引入 WASM 前端构建。
9
10use serde::{Deserialize, Serialize};
11
12/// 素材记录(对应 assets 表一行)。
13#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
14pub struct Asset {
15    pub id: String,
16    /// 相对路径,如 `2026/07/24/153000.<uuid>.webp`(不含 /uploads/ 前缀)。
17    pub path: String,
18    pub filename: String,
19    pub mime: String,
20    pub size_bytes: i64,
21    pub width: i32,
22    pub height: i32,
23    pub alt: Option<String>,
24    pub created_at: chrono::DateTime<chrono::Utc>,
25}
26
27/// 引用该素材的一篇文章(素材详情/删除拦截时列出)。
28#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
29pub struct AssetRef {
30    pub post_id: i32,
31    pub title: String,
32}
33
34/// 列表页 DTO:素材本体 + 引用计数 + 引用文章列表。
35#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
36pub struct AssetDto {
37    #[serde(flatten)]
38    pub asset: Asset,
39    pub ref_count: i64,
40    pub refs: Vec<AssetRef>,
41}
42
43/// 列表筛选:按引用状态。
44#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Default)]
45pub enum AssetFilter {
46    #[default]
47    All,
48    Used,
49    Orphan,
50}
51
52/// 列表排序。
53#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Default)]
54pub enum AssetSort {
55    #[default]
56    CreatedDesc,
57    SizeDesc,
58}